🐡

GKE(kubernetes)管理しているサービスをIAPで保護する構成をTerraformで構成する

2023/01/15に公開

内容

GKEで運用しているサービスに対して、GCPのIAPで特定のユーザーのみアクセスできる構成をTerraformで実装します。

GKEの準備

GKEの作成方法はこちらで解説しているので、こちらに従ってSSL対応したGKEを作成してください。

https://zenn.dev/ring_belle/articles/gcp-gke-domain

こちらで作成できる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が付与されていたら、正常に設定ができています。) 

https://console.cloud.google.com/security/iap
※IAPのスイッチがOFFになっている場合は、ONにしてください。

ブラウザから確認

まずは、secretモード等でサイトにアクセスしてください。 You don't have access という表示がされて、サイトが保護されていることが確認できます。 
次に権限を与えたGoogleアカウントでログインしているブラウザから、サイトにアクセスしてみましょう。正常にサイトが表示されることが確認できるかと思います。 
 
以上で、IAPでGKEを保護する構成が完成しました!

BASIC認証等でサイトを保護すると、どうしてもid,passwordを社内で管理しないといけないかつ、退職後の社員もテストサイトがみれてしまいます。そのため、社内のGoogleアカウントのみにアクセスを制限できるIAPはおすすめの選択肢です!

参照

https://cloud.google.com/iap/docs/enabling-kubernetes-howto

note

勉強法やキャリア構築法など、エンジニアに役立つ記事をnoteで配信しています。

https://note.com/ring_belle/membership

Discussion