外部 ID を使用して GKE on AWS に対して認証を行う

Workforce Identity 連携は、Google 以外の ID に Google Cloud サービスへのアクセスを許可します。GKE on AWS のコンテキストでは、既存の外部 ID を使用して、Google の認証情報に依存せずに GKE クラスタを作成したり、GKE クラスタにアクセスできます。

Workforce Identity 連携を使用するメリットは次のとおりです。

  • 異なるプラットフォームやプロバイダでアカウントの複製を作成する必要がなくなる。
  • 権限設定は 1 回のみ行い、複数のプラットフォームで構成する必要がなくなる。
  • ログインとパスワードを求められる回数が少なくなるため、ユーザー アクセスが簡素化される。

始める前に

外部ユーザーやグループが GKE クラスタにアクセスできるようにするには、次の手順を実行する必要があります。

  1. 外部ユーザーまたはグループが GKE on AWS API を使用できるように、Workforce Identity 連携を構成します。

  2. 外部ユーザーやグループに gkemulticloud.viewer ロールを割り当て、クラスタにアクセスできるようにします。Google Cloud コンソールでクラスタを表示するには、container.clusterViewer のロールを割り当てます。

    ロールは権限の集合体です。ロールをエンティティ(ユーザー、グループ、またはサービス アカウント)に割り当てると、そのロールに含まれるすべての権限がそのエンティティに付与されます。

    ユーザー

    個別のユーザーには、gkemulticloud.viewer ロールを割り当てる必要があります。

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --role="roles/gkemulticloud.viewer" \
      --member="principal://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/subject/SUBJECT_VALUE"
    

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

    • PROJECT_ID: Google Cloud プロジェクトの ID。
    • WORKFORCE_POOL_ID: Google Cloud の Workforce Identity プールを一意に識別する ID。ID の形式を設定する場合は、IAM ドキュメントのクエリ パラメータに記載の推奨ガイドラインに従ってください。
    • SUBJECT_VALUE: 外部ユーザーを一意に識別する ID。たとえば、ID にはメールアドレス(alex@cymbalgroup.com など)を使用できます。

    グループ

    グループには、gkemulticloud.viewer ロールを割り当てる必要があります。

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --role="roles/gkemulticloud.viewer" \
      --member="principalSet://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/group/GROUP_ID"
    

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

    • PROJECT_ID: Google Cloud プロジェクトの ID。
    • WORKFORCE_POOL_ID: Google Cloud の Workforce Identity プールを一意に識別する ID。ID の形式を設定する場合は、IAM ドキュメントのクエリ パラメータに記載の推奨ガイドラインに従ってください。
    • GROUP_ID: 外部グループを一意に識別する ID。
  3. 省略可: 外部ユーザーまたはグループに適切な Identity and Access Management(IAM)のロールを割り当てます。このステップは、ユーザーまたはグループにクラスタを作成または更新する権限を付与する場合にのみ必要です。単にクラスタにアクセスする場合は必要ありません

    ユーザー

    個別のユーザーには、gkemulticloud.admin ロールを割り当てる必要があります。

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --role="roles/gkemulticloud.admin" \
      --member="principal://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/subject/SUBJECT_VALUE"
    

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

    • PROJECT_ID: Google Cloud プロジェクトの ID。
    • WORKFORCE_POOL_ID: Google Cloud の Workforce Identity プールを一意に識別する ID。ID の形式を設定する場合は、IAM ドキュメントのクエリ パラメータに記載の推奨ガイドラインに従ってください。
    • SUBJECT_VALUE: 外部ユーザーを一意に識別する ID。たとえば、ID にはメールアドレス(alex@cymbalgroup.com など)を使用できます。

    グループ

    グループには、gkemulticloud.admin ロールを割り当てる必要があります。

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --role="roles/gkemulticloud.admin" \
      --member="principalSet://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/group/GROUP_ID"
    

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

    • PROJECT_ID: Google Cloud プロジェクトの ID。
    • WORKFORCE_POOL_ID: Google Cloud の Workforce Identity プールを一意に識別する ID。ID の形式を設定する場合は、IAM ドキュメントのクエリ パラメータに記載の推奨ガイドラインに従ってください。
    • GROUP_ID: 外部グループを一意に識別する ID。

GKE on AWS に必要な API のロールと権限の詳細については、API のロールと権限をご覧ください。

GKE クラスタへの外部アクセス権を付与する

外部ユーザーまたはグループが GKE クラスタにアクセスできるように Workforce Identity 連携を設定する方法は 2 つあります。

方法 #1 では、RBAC ファイルを定義してクラスタに適用する必要があります。この方法では、ユーザーに広範なアクセス権を付与せずに、リソースに対する読み取り専用アクセス権を付与するなど、権限を細かく制御できます。

方法 #2 では、クラスタを作成または更新するときに外部 ID のアクセスを指定する必要があります。このメソッドは、指定されたユーザーまたはグループに完全な管理者権限を付与します。

目的のアクセス制御レベルに最も適した方法(よりきめ細かいアクセス許可の場合は方法 #1、完全なクラスタ管理者権限を付与する場合には方法 #2)を選択します。

方法 1: RBAC ファイルを使用する

GKE クラスタへの外部アクセスを許可する 1 つ目の方法では、RBAC ファイルを使用します。以下の手順に沿って登録してください。

  1. 対象(ユーザーまたはグループ)と GKE クラスタ内で付与する権限を含む RBAC YAML ファイルを定義します。個別のユーザーとグループの RBAC YAML 構成の例を以下に示します。

    ユーザー

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: gateway-cluster-admin-user
    subjects:
    - kind: User
      name: principal://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/subject/SUBJECT_VALUE
    roleRef:
      kind: ClusterRole
      name: cluster-admin
      apiGroup: rbac.authorization.k8s.io
    

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

    • WORKFORCE_POOL_ID: Google Cloud の Workforce Identity プールを一意に識別する ID。ID の形式を設定する場合は、IAM ドキュメントのクエリ パラメータに記載の推奨ガイドラインに従ってください。
    • SUBJECT_VALUE: 外部ユーザーを一意に識別する ID。たとえば、ID にはメールアドレス(alex@cymbalgroup.com など)を使用できます。

    グループ

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: gateway-cluster-admin-group
    subjects:
    - kind: Group
      name: principalSet://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/group/GROUP_ID
    roleRef:
      kind: ClusterRole
      name: cluster-admin
      apiGroup: rbac.authorization.k8s.io
    

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

    • WORKFORCE_POOL_ID: Google Cloud の Workforce Identity プールを一意に識別する ID。ID の形式を設定する場合は、IAM ドキュメントのクエリ パラメータに記載の推奨ガイドラインに従ってください。
    • GROUP_ID: 外部グループを一意に識別する ID。
  2. 次のコマンドを使用して、構成する GKE クラスタを識別し、アクティブ コンテキストとして設定します。

      kubectl config use-context CLUSTER_CONTEXT
    

    CLUSTER_CONTEXT は、クラスタの適切なコンテキスト名に置き換えます。

  3. 目的の GKE クラスタをアクティブ コンテキストとして設定し、次のコマンドを使用して RBAC 構成をクラスタに適用します。

    kubectl apply -f RBAC_PATH
    

    RBAC_PATH は、作成または編集した RBAC ファイルのパスに置き換えます。

    このコマンドを実行すると、RBAC ルールで定義されるように、RBAC 構成で指定されたユーザーまたはグループが、対象の GKE クラスタへのアクセスと管理の権限を持つようになります。

  4. 後に権限の変更が必要になった場合は、RBAC ファイルを変更し、上記の手順を繰り返してクラスタに再適用します。

方法 #2: クラスタの作成時または更新時に外部 ID へのアクセスを許可する

方法 #2 は、クラスタの作成または更新プロセス中に外部 ID へのアクセスを許可します。

クラスタを作成するには、クラスタの作成の手順に沿って操作します。クラスタを更新するには、クラスタを更新するの手順に沿って操作します。

gcloud コマンドを実行してクラスタを作成または更新する場合は、次のように admin-users パラメータと admin-groups パラメータの両方またはどちらか一方を指定します。

gcloud container aws clusters [create|update] CLUSTER_NAME \
    --location=LOCATION
    --admin-users=principal://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/subject SUBJECT_VALUE \
    --admin-groups=principalSet://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/group/GROUP_ID

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

  • CLUSTER_NAME: クラスタの名前。
  • LOCATION: クラスタが管理されている Google Cloud リージョン。
  • WORKFORCE_POOL_ID: Google Cloud の Workforce Identity プールを一意に識別する ID。ID の形式を設定する場合は、IAM ドキュメントのクエリ パラメータに記載の推奨ガイドラインに従ってください。
  • SUBJECT_VALUE: 外部ユーザーを一意に識別する ID。たとえば、ID にはメールアドレス(alex@cymbalgroup.com など)を使用できます。
  • GROUP_ID: 外部グループを一意に識別する ID。

外部 ID に対する GKE クラスタへのアクセス権付与の概要

方法 #1 または方法 #2 のいずれかを実行すると、指定した外部ユーザーまたはグループは、Google Cloud コンソールを使用してクラスタに接続し、詳細を表示できます。または、gcloud CLI の ID で kubectl を使用して、クラスタの管理や操作、クラスタとの通信を行うこともできます。

GKE クラスタに対して kubectl コマンドを実行する方法については、kubeconfig エントリを生成するをご覧ください。