@@ -13,22 +13,22 @@ author: 渡邉光
13
13
lede : " GKE を利用したWebアプリケーションのGoogleアカウント認証について記事を書きます。公式ドキュメントを引用します。IAP を使用すると、HTTPS によってアクセスされるアプリケーションの一元的な承認レイヤを確立できるため、ネットワーク レベルのファイアウォールに頼らずに、アプリケーション レベルのアクセス制御モデルを使用できます。"
14
14
---
15
15
# 初めに
16
+
16
17
明けましておめでとうございます!Future筋肉エンジニアの渡邉です。年も明けたことなので切り替えて減量に入りました。三月末までを目安に体を絞ろうと思っています。
17
18
18
19
私は現在Google Cloudを利用しているプロジェクトに所属しており、Google Cloudのスキルアップにいそしんでいます。今回はGKE (Google Kubernetes Engine)でCloud IAP (Identity-Aware Proxy)を利用したWebアプリケーションのGoogleアカウント認証について記事を書こうと思います。
19
20
20
21
# Identity-Aware Proxyとは
22
+
21
23
以下、[ 公式ドキュメント] ( https://cloud.google.com/iap/docs/concepts-overview?hl=ja ) 引用
22
24
> IAP を使用すると、HTTPS によってアクセスされるアプリケーションの一元的な承認レイヤを確立できるため、ネットワーク レベルのファイアウォールに頼らずに、アプリケーション レベルのアクセス制御モデルを使用できます。
23
25
24
26
簡単に言うとGoogleアカウントとCloud IAMの仕組みを用いてWebアプリケーションの認証をすることができます。
25
27
26
-
27
28
## 認証・承認フロー
28
29
29
30
<img src =" /images/20230113a/authenticate-flow.drawio.png " alt =" authenticate-flow.drawio.png " width =" 487 " height =" 564 " loading =" lazy " >
30
31
31
-
32
32
[ 公式ドキュメント] ( https://cloud.google.com/iap/docs/concepts-overview?hl=ja ) はこちら
33
33
34
34
- Google Cloudリソースへのリクエスト(Cloud Load Balancing)します。
@@ -39,15 +39,15 @@ lede: "GKE を利用したWebアプリケーションのGoogleアカウント認
39
39
- 認証サーバはこのIDからユーザのIAMロールをチェックし、ユーザがリソースにアクセスできる権限(** IAP で保護されたウェブアプリ ユーザー** )を持っているかをチェックします
40
40
- 権限を持っていれば、アクセスOKになり、なければNGになります。
41
41
42
-
43
-
44
42
# 全体アーキテクチャ図
43
+
45
44
以下が全体アーキテクチャ図になります。
46
45
GKE/NetworkなどのGoogle Cloudのリソース構築に関しては慣れ親しんでいるTerraformを利用して作成しました。OAuth同意画面に関しては外部公開する場合は、APIから作成することはできない ([ 公式ドキュメント記載] ( https://cloud.google.com/iap/docs/programmatic-oauth-clients?hl=ja] ) )ので、コンソール画面から設定しました。
47
46
48
47
<img src =" /images/20230113a/architecture.drawio.png " alt =" architecture.drawio.png " width =" 1151 " height =" 429 " loading =" lazy " >
49
48
50
49
## Bastion初期設定
50
+
51
51
Public Subnetに作成したGCEインスタンスからGKEのコントロールプレーンに対してkubectlコマンドを実行したいので、
52
52
kubectlコマンドや、google-cloud-sdk-gke-gcloud-auth-pluginなどをインストールします。
53
53
以下、Bashスクリプトです。
@@ -89,11 +89,13 @@ kubectl get node
89
89
```
90
90
91
91
## manifestファイル
92
+
92
93
また、manifestファイルは以下を用意してkubectlコマンドを実行しk8sリソースをGKEに対して作成しました。
93
94
94
95
ここまでの設定で事前準備は完了です。
95
96
96
97
### Deployment
98
+
97
99
NginxのPodを用意するため、Deploymentのmanifestを作成しました。
98
100
99
101
``` yaml deployment.yaml
@@ -119,6 +121,7 @@ spec:
119
121
` ` `
120
122
121
123
### Service
124
+
122
125
IngressにはNodePortが必要になるので、Serviceのmanifestを作成しました。
123
126
124
127
` ` ` yaml service.yaml
@@ -137,6 +140,7 @@ spec:
137
140
` ` `
138
141
139
142
### ManagedCertificate
143
+
140
144
クライアントとIngressで構築するHTTP(S)ロードバランサ間をHTTPSでアクセスするようにしたいので、Googleマネージド証明書のmanifestを作成しました。
141
145
domainsには、terraformで用意したHTTP(S)ロードバランサに設定したい外部IPアドレスにフリーなワイルドカードDNSサービスの[nip.io](https://nip.io/)を利用したものを設定します。
142
146
@@ -151,6 +155,7 @@ spec:
151
155
` ` `
152
156
153
157
### Ingress
158
+
154
159
インターネット上にNginxを公開するためにIngressを構築するmanifestを作成しました。
155
160
156
161
` ` ` yaml ingress.yaml
@@ -180,15 +185,14 @@ spec:
180
185
number : 80
181
186
` ` `
182
187
183
-
184
-
185
188
# Cloud IAPなしでのアクセス確認
189
+
186
190
まず、Cloud IAPなしでのアクセス確認を行います。
187
191
Load Balancerに設定したドメインに対してアクセスを行うと、特に認証画面を経由することもなくアクセスすることができます。
188
192
<img src="/images/20230113a/1-IAPなしでのアクセス確認.png" alt="1-IAPなしでのアクセス確認.png" width="956" height="525" loading="lazy">
189
193
190
-
191
194
# Cloud IAPの設定を追加
195
+
192
196
上記の状態ではだれでもアクセスすることが可能なため、セキュアな状態ではありません。
193
197
ここでCloud IAPの設定を追加してみましょう。
194
198
@@ -214,6 +218,7 @@ OAuth同意画面はUser Typeを「外部」で作成します。
214
218
<img src="/images/20230113a/2-OAuth同意画面④.png" alt="2-OAuth同意画面④.png" width="1200" height="844" loading="lazy">
215
219
216
220
## OAuth認証情報の作成
221
+
217
222
APIとサービスタブの「認証情報」をクリックします。
218
223
認証情報の作成プルダウンリストからOAuthクライアントIDをクリックします。
219
224
@@ -230,13 +235,15 @@ APIとサービスタブの「認証情報」をクリックします。
230
235
<img src="/images/20230113a/3-OAuth認証情報③.png" alt="3-OAuth認証情報③.png" width="512" height="448" loading="lazy">
231
236
232
237
作成したOAuthクライアントを再度クリックし、承認済みリダイレクトURIをダウンロードしたOAuthクライアントID(CLIENT_ID)に修正して保存します。
238
+
233
239
` ` `
234
240
https://iap.googleapis.com/v1/oauth/clientIds/CLIENT_ID:handleRedirect
235
241
```
236
242
237
243
<img src =" /images/20230113a/3-OAuth認証情報④.png " alt =" 3-OAuth認証情報④.png " width =" 1200 " height =" 795 " loading =" lazy " >
238
244
239
245
## IAPアクセス権の設定
246
+
240
247
Google Cloud ConsoleのIdentity-Aware Proxyにアクセスします。
241
248
アクセス権を付与するリソースの横にあるチェックボックスをオンにします。
242
249
@@ -255,8 +262,8 @@ IAPアクセスを許可したいGoogleアカウント(メールアドレス
255
262
256
263
ここまででOAuthの設定は完了です。
257
264
258
-
259
265
## Kubernetes Secretの作成
266
+
260
267
GKEでCloud IAPを適用するためには、Kubernetes Secretを作成してBackendConfigに適用する必要があります。
261
268
先ほど作成してダウンロードしたOAuth認証情報のClient IDとClient Secretを指定してKubernetes Secretを作成します。
262
269
@@ -266,6 +273,7 @@ kubectl create secret generic oauth-secret --from-literal=client_id=xxxxxxxxxxxx
266
273
```
267
274
268
275
Kubernetes Secretが作成されていることを確認します。
276
+
269
277
``` bash
270
278
xxxxxxxxxxxxx@tky-bastion:~ $ kubectl describe secret oauth-secret
271
279
Name: oauth-secret
@@ -282,6 +290,7 @@ client_id: 73 bytes
282
290
```
283
291
284
292
## BackendConfigの作成
293
+
285
294
Kubernetes Secretで作成したSecretをBackendConfigに設定することでCloud IAPを適用することができます。
286
295
以下のmanifestファイルを用意します。
287
296
@@ -299,11 +308,13 @@ spec:
299
308
` ` `
300
309
301
310
kubectlコマンドでBackendConfigを作成します。
311
+
302
312
` ` ` bash
303
313
kubectl apply -f backendconfig.yaml
304
314
```
305
315
306
316
BackendConfigが作成されていることを確認します。
317
+
307
318
``` bash
308
319
xxxxxxxxxxxxx@tky-bastion:~ /manifest$ kubectl get backendconfig
309
320
NAME AGE
@@ -336,31 +347,29 @@ kubectl apply -f service.yaml
336
347
337
348
以上で、Cloud IAPの設定は完了です。
338
349
339
-
340
350
# Cloud IAPありでのアクセス確認
351
+
341
352
Cloud IAPの設定が完了したので、画面にアクセスしてCloud IAPが適用されているかを確認します。
342
353
343
354
## Cloud IAP認証対象外アカウントでのアクセス確認
355
+
344
356
Load Balancerに設定したドメインに対してアクセスを行うと、Cloud IAPによるGoogleアカウントログイン画面にリダイレクトされます。
345
357
346
358
<img src =" /images/20230113a/5-IAPアクセスなし①.png " alt =" 5-IAPアクセスなし①.png " width =" 469 " height =" 557 " loading =" lazy " >
347
359
348
360
本GoogleアカウントはCloud IAPのアクセスできる権限(** IAP で保護されたウェブアプリ ユーザー** )を持っていないため、画面にアクセスすることはできません。
349
361
<img src =" /images/20230113a/5-IAPアクセスなし②.png " alt =" 5-IAPアクセスなし②.png " width =" 426 " height =" 455 " loading =" lazy " >
350
362
351
-
352
-
353
363
## Cloud IAP認証対象アカウントでのアクセス確認
364
+
354
365
Load Balancerに設定したドメインに対してアクセスを行うと、Cloud IAPによるGoogleアカウントログイン画面にリダイレクトされます。
355
366
356
367
<img src =" /images/20230113a/6-IAPアクセスあり①.png " alt =" 6-IAPアクセスあり①.png " width =" 529 " height =" 565 " loading =" lazy " >
357
368
358
369
本GoogleアカウントはCloud IAPのアクセスできる権限(** IAP で保護されたウェブアプリ ユーザー** )を持っているため、画面にアクセスすることができました。
359
370
<img src =" /images/20230113a/6-IAPアクセスあり②.png " alt =" 6-IAPアクセスあり②.png " width =" 908 " height =" 299 " loading =" lazy " >
360
371
361
-
362
-
363
372
# 最後に
373
+
364
374
今回はGKE (Google Kubernetes Engine)でCloud IAP (Identity-Aware Proxy)を利用したGoogleアカウント認証について記事を書きました。
365
375
Google Cloudを利用していて、特定のGoogleアカウントにのみアクセスを許可したいケースはあるかと思いますので、その時にでも参考にしていただければ幸いです。
366
-
0 commit comments