GKE(kubernetes)管理しているサービスをIAPで保護する構成をTerraformで構成する
内容
GKEで運用しているサービスに対して、GCPのIAPで特定のユーザーのみアクセスできる構成をTerraformで実装します。
GKEの準備
GKEの作成方法はこちらで解説しているので、こちらに従ってSSL対応したGKEを作成してください。
こちらで作成できるIngressとnginx用のserviceを使って、今回は作成していきます。(kubernetesのリソースに対しては、Serviceにconfigを追加するだけなので、Kubernetesの理解がある方は、上記記事を読まなくとも理解できると思います)
OAuth Credentialsの取得
次に、OAuthで使用するCredentialsを取得します。 コンソールから作成する必要があるので、コンソールから作成します。
-
https://console.cloud.google.com/apis/credentials にアクセスし、
CREATE CREDENTIALS
をクリックし、OAuth client ID
を選択 - Web applicationを選択し、Nameに適当な名前を入力し、作成
- Credentialsが作成されるので、Client IDとClient Secretをメモしておく(後ほど、Kubernetesに設定します。)
- ↑で作成したIDを利用し、以下のURLを今作成した
OAuth 2.0 Client IDs
のリダイレクトURLに設定し保存するhttps://iap.googleapis.com/v1/oauth/clientIds/<ここにClient IDをペースト>:handleRedirect
※参照: https://cloud.google.com/iap/docs/enabling-kubernetes-howto#oauth-credentials
IAP resourceの作成
IAP resourcesをTerraformで作成します。
iap_brandの作成
main.tf
resource "google_iap_brand" "project_brand" {
support_email = "<メールアドレス>"
application_title = "IAP Test"
project = "<project-id>"
}
※Google APIの使用で、InternalモードでしかOauth brandを作成できません。もし、Externalで作成したい場合は、コンソールから作成してください。( https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/iap_brand )
iam_memberを作成
KubernetesのIngressによって作成されたBackendサービス名を取得し、Terraformの google_iap_web_backend_service_iam_binding
に設定します。
また、Kubernetesリソースにアクセスを許すGoogleアカウントのメールアドレスも設定します。
Backendサービス一覧
$ gcloud compute backend-services list
※上記コマンドで取得できるバックエンドサービス名をTerraformに設定する。
main.tf
resource "google_iap_brand" "project_brand" {
support_email = "<メールアドレス>"
application_title = "IAP Test"
project = "<project-id>"
}
# 追加
resource "google_iap_web_backend_service_iam_binding" "binding" {
project = "<project-id>"
web_backend_service = "<backend service name>"
role = "roles/iap.httpsResourceAccessor"
members = [
"user:<許可したいgoogleアカウントのメールアドレス>"
]
}
$ terraform apply
これで、TerraformにてIAPリソースとIAPで保護されているコンテンツへのアクセス権のあるユーザーの権限を作成できました。
KubernetesにSecretを設定する
最後に、Kubernetesに対して、IAPのSecretを設定し、OAuth認証にてリソースを保護できるようにします。
Secretの作成
先ほど取得した、OAuthのClient IDとSecret KeyをKubernetesのSecretに登録します。
$ kubectl create secret generic my-secret --from-literal=client_id=<cliend_id> --from-literal=client_secret=<client_secret>
kubernetesにIAPを導入
最後に、Kubernetesクラスターの保護したいServiceに対して、IAPを導入します。対応することは以下の二つです。
- backend-configの追加
- 保護したいserviceにannotationを追加
service.yaml
apiVersion: v1
kind: Service
metadata:
name: test-app
## 追加 ##
annotations:
beta.cloud.google.com/backend-config: '{"default": "config-default"}'
## 追加 ##
spec:
...
backend-config.yaml
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: config-default
spec:
iap:
enabled: true
oauthclientCredentials:
secretName: my-secret
$ kubectl apply -f service.yaml
$ kubectl apply -f backend-config.yaml
確認
最後に正常にサイトが保護されているか確認します。
IAPの確認
正常にIAPが設定されているか、以下のURLにアクセスして確認ができます。(Backend ServiceにIAPが付与されていたら、正常に設定ができています。)
※IAPのスイッチがOFFになっている場合は、ONにしてください。
ブラウザから確認
まずは、secretモード等でサイトにアクセスしてください。 You don't have access
という表示がされて、サイトが保護されていることが確認できます。
次に権限を与えたGoogleアカウントでログインしているブラウザから、サイトにアクセスしてみましょう。正常にサイトが表示されることが確認できるかと思います。
以上で、IAPでGKEを保護する構成が完成しました!
BASIC認証等でサイトを保護すると、どうしてもid,passwordを社内で管理しないといけないかつ、退職後の社員もテストサイトがみれてしまいます。そのため、社内のGoogleアカウントのみにアクセスを制限できるIAPはおすすめの選択肢です!
参照
note
勉強法やキャリア構築法など、エンジニアに役立つ記事をnoteで配信しています。
Discussion