OIDC で GKE Identity Service のクラスタを設定する

このドキュメントは、個々のクラスタで GKE Identity Service を設定し、デベロッパーと他のユーザーが OpenID Connect(OIDC)プロバイダから既存の ID の詳細を使用してクラスタにログインできるようにすることを必要とするクラスタ管理者またはアプリケーション オペレーターを対象としています。

前提条件

  • クラスタは、オンプレミス(VMware またはベアメタル)、AWS、または Azure 上の GKE クラスタである必要があります。クラスタごとの OIDC 構成は、アタッチされたクラスタまたは GKE クラスタではサポートされていません。
  • Google Cloud コンソールで認証するには、OIDC 認証用に構成する各クラスタをプロジェクト フリートに登録する必要があります。

準備

  • 設定を開始する前に、プラットフォーム管理者から、プロバイダへの GKE Identity Service の登録からの必要なすべての情報(GKE Identity Service のクライアント ID やシークレットなど)が提供されていることを確認します。
  • 次のコマンドライン ツールがインストールされていることを確認します。

    • Google Cloud CLI の最新バージョン。Google Cloud とやり取りするためのコマンドライン ツールである gcloud が含まれています。Google Cloud CLI をインストールする必要がある場合は、インストール ガイドをご覧ください。
    • Kubernetes クラスタに対してコマンドを実行するために使用する kubectlkubectl をインストールする必要がある場合は、以下の手順に沿ってください。

    Google Cloud を操作するシェル環境として Cloud Shell を使用する場合は、これらのツールがインストールされます。

  • クラスタが登録されているプロジェクトで使用するために、gcloud CLI が初期化済みであることを確認します。

  • 現在の VPC の外部にある AWS または Azure GKE クラスタのコントロール プレーンを踏み台インスタンス経由で接続する必要がある場合は、この設定を行う前に踏み台インスタンスを作成し、ポート 8118 で SSH トンネルを開始してください。次に、このガイドに従って HTTPS_PROXY=http://localhost:8118 を使用する際に、kubectl コマンドを先頭に付けます。SSH トンネルの開始時に別のポートを使用した場合は、8118 を選択したポートに置き換えます。

クラスタの構成

選択したプロバイダを使用するようにクラスタを構成するには、ID プロバイダの詳細、ユーザー ID として ID プロバイダが提供する JWT トークンの情報、クライアント アプリケーションとしてGKE Identity Service に登録する際に提供されたその他の情報を指定する必要があります。

たとえば、プロバイダが(特に)次のフィールドで ID トークンを作成する場合を考えます。ここで、iss は ID プロバイダの URI、sub はユーザーの指定、groupList はユーザーが属するセキュリティ グループのリストです。

{
  'iss': 'https://server.example.com'
  'sub': 'u98523-4509823'
  'groupList': ['developers@example.corp', 'us-east1-cluster-admins@example.corp']
  ...
}

ユーザー側の設定には次の対応するフィールドがあります。

issuerURI: 'https://server.example.com'
userClaim: 'sub'
groupsClaim: 'groupList'
...

構成の作成に必要な情報のほとんどは、プラットフォーム管理者または組織の ID 管理者から提供されます。

GKE Identity Service は、ClientConfig という Kubernetes カスタム リソースタイプ(CRD)を使用してクラスタを構成します。ClientConfigには、GKE Identity Service が ID プロバイダとやり取りするために必要なすべての情報のフィールドが含まれています。 各 GKE クラスタには、以下の手順に沿って構成の詳細で更新する kube-public 名前空間に default という ClientConfig リソースがあります。

広く使用されているプロバイダ用の具体的な構成例については、プロバイダ固有の構成をご覧ください。

kubectl

デフォルトの ClientConfig を編集する場合は、kubectl を介してクラスタに接続できることを確認し、次のコマンドを実行します。

kubectl --kubeconfig=KUBECONFIG_PATH edit ClientConfigs default -n kube-public

KUBECONFIG_PATH は、クラスタの kubeconfig ファイルへのパス(例:$HOME/.kube/config)に置き換えます。

テキスト エディタがクラスタの ClientConfig リソースを読み込みます。下に示すように、spec.authentication.oidc オブジェクトを追加します。すでに書き込まれているデフォルトのデータは変更しないでください。

apiVersion: authentication.gke.io/v2alpha1
kind: ClientConfig
metadata:
  name: default
  namespace: kube-public
spec:
  authentication:
  - name: NAME
    oidc:
      certificateAuthorityData: CERTIFICATE_STRING
      clientID: CLIENT_ID
      clientSecret: CLIENT_SECRET
      deployCloudConsoleProxy: PROXY_BOOLEAN
      extraParams: EXTRA_PARAMS
      groupsClaim: GROUPS_CLAIM
      groupPrefix: GROUP_PREFIX
      issuerURI: ISSUER_URI
      kubectlRedirectURI: KUBECTL_REDIRECT_URI
      scopes: SCOPES
      userClaim: USER_CLAIM
      userPrefix: USER_PREFIX
      enableAccessToken: ENABLE_ACCESS_TOKEN
    proxy: PROXY_URL

# Rest of the resource is managed by Google. DO NOT MODIFY.
...

次の表に、ClientConfig oidc オブジェクトのフィールドを示します。ほとんどのフィールドは省略できます。追加する必要があるフィールドは、ID プロバイダと、GKE Identity Service のプロバイダを構成するときにプラットフォーム管理者が選択する設定オプションによって変わります。

フィールド 必須 説明 形式
name この構成を識別するために使用する名前で、通常は ID プロバイダ名です。構成名は、先頭が文字で、その後に最大 39 文字の小文字、数字、ハイフンで構成します。末尾をハイフンにすることはできません。 文字列
certificateAuthorityData × プラットフォーム管理者が指定した場合は、ID プロバイダ用の PEM でエンコードされた証明書の文字列。結果の文字列は certificateAuthorityData に 1 行で含めます。 文字列
clientID プロバイダに GKE Identity Service を登録するときに返されたクライアント ID。 文字列
clientSecret × OIDC クライアント アプリケーションと OIDC プロバイダ間の共有シークレット。 文字列
deployCloudConsoleProxy × Google Cloud コンソールを接続できるようにするプロキシを、インターネット経由で一般公開されていないオンプレミスの ID プロバイダにデプロイするかどうかを指定します。デフォルトは false です。 ブール値
extraParams × ID プロバイダに送信する追加の Key=Value パラメータ。カンマ区切りのリストとして指定します(例:「prompt=consent,access_type=offline」)。 カンマ区切りのリスト
groupsClaim × JWT クレーム(フィールド名)。プロバイダがアカウントのセキュリティ グループを返すために使用します。 文字列
groupPrefix × 複数の ID プロバイダの構成がある場合に、アクセス制御ルールの既存の名前と競合しないように、セキュリティ グループ名に追加する接頭辞(通常はプロバイダ名)。 文字列
issuerURI ID プロバイダに対して認可リクエストを行う URI。URI には HTTPS を使用し、末尾にスラッシュを付けないでください。 URL 文字列
kubectlRedirectURI gcloud CLI で使用され、プラットフォーム管理者が登録時に指定したリダイレクト URL とポート(通常は http://localhost:PORT/callback の形式)。 URL 文字列
scopes OpenID プロバイダに送信する追加のスコープ。たとえば、Microsoft Azure と Okta では、offline_access スコープが必要です。 カンマ区切りのリスト
userClaim × プロバイダがユーザー アカウントの識別に使用する JWT クレーム(フィールド名)。ここで値を指定しない場合、GKE Identity Service は「sub」を使用します。これは多くのプロバイダで使用されるユーザー ID クレームです。OpenID プロバイダによっては、「email」や「name」などの他のクレームを選択できます。名前が競合しないように、「email」以外のクレームには、には発行者の URL が先頭に付加されます。 文字列
userPrefix × デフォルトの接頭辞を使用しない場合にユーザーのクレームの先頭に付加する接頭辞。これにより、既存の名前と競合しないようにします。 文字列
enableAccessToken × 有効になっている場合、GKE Identity Service は、ユーザーがコマンドラインからログインしたときに、ID プロバイダの userinfo エンドポイントを使用してグループ情報を取得できます。グループ クレームを提供するプロバイダ(Okta など)がある場合は、このエンドポイントからセキュリティ グループを使用して認可を行えます。設定されていない場合は、false とみなされます。 ブール値
プロキシ × ID プロバイダへの接続に使用するプロキシ サーバーのアドレス(該当する場合)。たとえば、クラスタがプライベート ネットワークにあり、パブリック ID プロバイダに接続する必要がある場合に、これを設定する必要があります。例: http://user:password@10.10.10.10:8888 文字列

ClientConfig が完成したら、ファイルを保存します。これにより、クラスタの ClientConfig が更新されます。構文エラーがある場合は、構成ファイルを再編集して修正するように求められます。

プロバイダ特有の構成

このセクションでは、一般的な OIDC プロバイダの構成ガイダンスについて説明します。これには独自の詳細をコピーして編集できる構成例も含まれます。

Azure AD

これは、Azure AD で GKE Identity Service を設定するためのデフォルトの構成です。この構成を使用すると、GKE Identity Service で Azure AD からユーザーとグループ メンバーシップの情報を取得できます。また、グループに基づいて Kubernetes のロールベース アクセス制御(RBAC)を設定できます。ただし、この構成を使用することによって、ユーザーごとに取得できるグループに対して約 200 個の上限が設けられます。

ユーザーあたり 200 個を超えるグループを取得する必要がある場合は、Azure AD(上級)の手順をご覧ください。

...
spec:
  authentication:
  - name: oidc-azuread
    oidc:
      clientID: CLIENT_ID
      clientSecret: CLIENT_SECRET
      cloudConsoleRedirectURI: https://console.cloud.google.com/kubernetes/oidc
      extraParams: prompt=consent, access_type=offline
      issuerURI: https://login.microsoftonline.com/TENANT_ID/v2.0
      kubectlRedirectURI: http://localhost:PORT/callback
      scopes: openid,email,offline_access
      userClaim: email

# Rest of the resource is managed by Google. DO NOT MODIFY.
...

次のように置き換えます。

  • CLIENT_ID: プロバイダに GKE Identity サービスを登録するときに返されたクライアント ID。
  • CLIENT_SECRET: OIDC クライアント アプリケーションと OIDC プロバイダ間の共有シークレット。
  • TENANT: 認証する Azure AD アカウントの種類。サポートされている値は、テナント ID または特定のテナントに属するアカウントのテナント名です。テナント名はプライマリ ドメインとしても知られています。これらの値を確認する方法について詳しくは、Microsoft Azure AD テナント ID とプライマリ ドメイン名を確認するをご覧ください。
  • PORT: 登録時にプラットフォーム管理者が指定した、gcloud CLI で使用されるリダイレクト URL 用に選択されたポート番号。

Azure AD(上級)

Azure AD のこのオプション構成では、ユーザーあたりのグループ数に制限はありません。GKE Identity Service で Microsoft Graph API を使用して、ユーザーとグループの情報を取得できます。

この構成をサポートするプラットフォームについては、Azure AD の高度な設定に関するページをご覧ください。

ユーザーあたり 200 個未満のグループを取得する必要がある場合は、ClientConfig の oidc アンカーを使用してデフォルト構成を使用することをおすすめします。詳細については、Azure AD の手順をご覧ください。

構成例の以下のフィールドはすべて必須です。

...
spec:
  authentication:
  - name: NAME
    proxy: PROXY_URL
    azureAD:
      clientID: CLIENT_ID
      clientSecret: CLIENT_SECRET
      tenant: TENANT_ID
      kubectlRedirectURI: http://localhost:PORT/callback
      groupFormat: GROUP_FORMAT
      userClaim: USER_CLAIM

# Rest of the resource is managed by Google. DO NOT MODIFY.
...

次のように置き換えます。

  • NAME: この構成を識別するために使用する名前で、通常は ID プロバイダ名です。構成名は、先頭が文字で、その後に最大 39 文字の小文字、数字、ハイフンで構成します。末尾をハイフンにすることはできません。
  • PROXY_URL: ID プロバイダへの接続に使用するプロキシ サーバーのアドレス(該当する場合)。たとえば、クラスタがプライベート ネットワークにあり、パブリック ID プロバイダに接続する必要がある場合に、これを設定する必要があります。例: http://user:password@10.10.10.10:8888
  • CLIENT_ID: プロバイダに GKE Identity サービスを登録するときに返されたクライアント ID。
  • CLIENT_SECRET: OIDC クライアント アプリケーションと OIDC プロバイダ間の共有シークレット。
  • TENANT: 認証する Azure AD アカウントの種類。サポートされている値は、テナント ID または特定のテナントに属するアカウントのテナント名です。テナント名はプライマリ ドメインとしても知られています。これらの値を確認する方法について詳しくは、Microsoft Azure AD テナント ID とプライマリ ドメイン名を確認するをご覧ください。
  • PORT: 登録時にプラットフォーム管理者が指定した、gcloud CLI で使用されるリダイレクト URL 用に選択されたポート番号。
  • GROUP_FORMAT: グループ情報を取得する形式。このフィールドには、ユーザー グループの ID または NAME に対応する値を指定できます。この設定は現在、ベアメタル Google Distributed Cloud デプロイのクラスタでのみ使用できます。
  • USER_CLAIM(省略可): プロバイダがアカウントの識別に使用する JWT クレーム(フィールド名)。ここで値を指定しない場合、GKE Identity Service は、「email」、「preferred_username」、「sub」の順番で値を使用してユーザーの詳細情報を取得します。この属性は、GKE Enterprise バージョン 1.28 以降で使用できます。

Okta

Okta を ID プロバイダとし、ユーザーとグループの両方を使用して認証を設定する手順は次のとおりです。この構成により、Anthos Identity Service は、アクセス トークンと Okta の userinfo エンドポイントを使用して、ユーザーとグループのクレームを取得します。

...
spec:
  authentication:
  - name: okta
    oidc:
      clientID: CLIENT_ID
      clientSecret: CLIENT_SECRET
      cloudConsoleRedirectURI: https://console.cloud.google.com/kubernetes/oidc
      enableAccessToken: true
      extraParams: prompt=consent
      groupsClaim: groups
      issuerURI: https://OKTA_ISSUER_URI/
      kubectlRedirectURI: http://localhost:PORT/callback
      scopes: offline_access,email,profile,groups
      userClaim: email

# Rest of the resource is managed by Google. DO NOT MODIFY.
...

グループ アクセスの上限

Okta ユーザーの場合、Anthos Identity Service は、連結時のグループ名が 170,000 文字未満のユーザーのグループ情報を取得できます。これは、Okta の最大グループ長が与えられた約 650 グループのメンバーシップに相当します。ユーザーが所属するグループが多すぎる場合、認証の呼び出しは失敗します。

次のステップ

構成が適用されたら、クラスタにユーザー アクセスを設定するに進みます。