2.8. 短期認証情報で Pod を認証する
一部の OpenShift Container Platform クラスターでは、クラスター外で作成および管理される コンポーネントごとの短期セキュリティー認証情報 を使用します。該当するクラスター上のカスタマーワークロード内のアプリケーションは、クラスターが使用する短期認証方法を使用して認証できます。
2.8.1. ワークロードの短期認証の設定
アプリケーションでこの認証方法を使用するには、次の手順を完了する必要があります。
- クラウドプロバイダーの Identity and Access Management (IAM) 設定で連携アイデンティティーサービスアカウントを作成します。
- クラウドプロバイダーのサービスアカウントに成り代わることができる OpenShift Container Platform サービスアカウントを作成します。
- アプリケーションに関連するワークロードを、OpenShift Container Platform サービスアカウントを使用するように設定します。
2.8.1.1. 環境とユーザーアクセスの要件
この認証方法を設定するには、次の要件を満たす必要があります。
- クラスターでは、短期セキュリティー認証情報 を使用する必要があります。
-
cluster-admin
ロールを持つユーザーとして OpenShift CLI (oc
) にアクセスできる必要があります。 - クラウドプロバイダーコンソールでは、Identity and Access Management (IAM) および連携アイデンティティー設定の管理権限を持つユーザーとしてアクセスできる必要があります。
2.8.2. GCP 上のアプリケーションに対する GCP Workload Identity 認証の設定
GCP Workload Identity 認証を使用する GCP クラスター上のアプリケーションに短期認証を使用するには、次の手順を完了する必要があります。
連携 GCP サービスアカウントの作成
Google Cloud コンソールを使用して、ワークロードアイデンティティープールとプロバイダーを作成し、OpenShift Container Platform サービスアカウントによる GCP サービスアカウントの成り代わりを許可できます。
前提条件
- GCP クラスターは OpenShift Container Platform バージョン 4.17.4 以降を実行しており、GCP Workload Identity を使用している。
- Identity and Access Management (IAM) とワークロードアイデンティティー設定を管理する権限を持つユーザーとして、Google Cloud コンソールにアクセスできる。
- アプリケーションで使用する Google Cloud プロジェクトが作成済みである。
手順
- Google Cloud プロジェクトの IAM 設定で、クラスターが GCP Workload Identity 認証に使用するアイデンティティープールとプロバイダーを特定します。
外部アイデンティティーが GCP サービスアカウントに成り代わるための権限を付与します。これらの権限により、OpenShift Container Platform サービスアカウントは連携ワークロードアイデンティティーとして機能できます。
詳細は、外部ワークロードによる Google Cloud リソースへのアクセスを許可する方法 に関する GCP ドキュメントを参照してください。
GCP 用の OpenShift Container Platform サービスアカウントを作成する
OpenShift Container Platform サービスアカウントを作成し、それにアノテーションを付けて GCP サービスアカウントに成り代わります。
前提条件
- GCP クラスターは OpenShift Container Platform バージョン 4.17.4 以降を実行しており、GCP Workload Identity を使用している。
- 連携 GCP サービスアカウントを作成した。
-
cluster-admin
ロールを持つユーザーとして OpenShift CLI (oc
) にアクセスできる。 -
Identity and Access Management (IAM) とワークロードアイデンティティー設定を管理する権限を持つユーザーとして、Google Cloud CLI (
gcloud
) にアクセスできる。
手順
次のコマンドを実行して、GCP Workload Identity Pod 認証に使用する OpenShift Container Platform サービスアカウントを作成します。
$ oc create serviceaccount <service_account_name>
次のコマンドを実行して、サービスアカウントに成り代わるアイデンティティープロバイダーと GCP サービスアカウントのアノテーションを付けます。
$ oc patch serviceaccount <service_account_name> -p '{"metadata": {"annotations": {"cloud.google.com/workload-identity-provider": "projects/<project_number>/locations/global/workloadIdentityPools/<identity_pool>/providers/<identity_provider>"}}}'
<project_number>
、<identity_pool>
、<identity_provider>
を実際の設定の値に置き換えます。注記<project_number>
には、プロジェクト ID ではなく、Google Cloud プロジェクト番号を指定します。次のコマンドを実行して、GCP サービスアカウントのメールアドレスをサービスアカウントにアノテーションとして追加します。
$ oc patch serviceaccount <service_account_name> -p '{"metadata": {"annotations": {"cloud.google.com/service-account-email": "<service_account_email>"}}}'
<service_account_email>
を、GCP サービスアカウントのメールアドレスに置き換えます。ヒント通常、GCP サービスアカウントのメールアドレス
<service_account_name>@<project_id>.iam.gserviceaccount.com
の形式を使用します。次のコマンドを実行して、
direct
外部認証情報設定注入モードを使用するようにサービスアカウントにアノテーションを付けます。$ oc patch serviceaccount <service_account_name> -p '{"metadata": {"annotations": {"cloud.google.com/injection-mode": "direct"}}}'
このモードでは、Workload Identity Federation Federation Webhook コントローラーが GCP 外部認証情報の設定を直接生成し、Pod に注入します。
Google Cloud CLI (
gcloud
) を使用して次のコマンドを実行し、ワークロードの権限を指定します。$ gcloud projects add-iam-policy-binding <project_id> --member "<service_account_email>" --role "projects/<project_id>/roles/<role_for_workload_permissions>"
<role_for_workload_permissions>
をワークロードのロールに置き換えます。ワークロードに必要な権限を付与するロールを指定します。
検証
サービスアカウントの設定を検証するには、次のコマンドを実行して
ServiceAccount
マニフェストを調べます。$ oc get serviceaccount <service_account_name>
次の例では、
service-a/app-x
OpenShift Container Platform サービスアカウントは、app-x
という GCP サービスアカウントに成り代わることができます。apiVersion: v1 kind: ServiceAccount metadata: name: app-x namespace: service-a annotations: cloud.google.com/workload-identity-provider: "projects/<project_number>/locations/global/workloadIdentityPools/<identity_pool>/providers/<identity_provider>" 1 cloud.google.com/service-account-email: "app-x@project.iam.googleapis.com" cloud.google.com/audience: "sts.googleapis.com" 2 cloud.google.com/token-expiration: "86400" 3 cloud.google.com/gcloud-run-as-user: "1000" cloud.google.com/injection-mode: "direct" 4
GCP Workload Identity で認証するカスタマーワークロードのデプロイ
アプリケーションで短期認証を使用するには、関連する Pod が OpenShift Container Platform サービスアカウントを使用するように設定する必要があります。OpenShift Container Platform サービスアカウントを使用すると、Pod を変更する Webhook がトリガーされ、GCP サービスアカウントへの成り代わりが可能になります。
次の例は、OpenShift Container Platform サービスアカウントを使用する Pod をデプロイし、設定を確認する方法を示しています。
前提条件
- GCP クラスターは OpenShift Container Platform バージョン 4.17.4 以降を実行しており、GCP Workload Identity を使用している。
- 連携 GCP サービスアカウントを作成した。
- GCP 用の OpenShift Container Platform サービスアカウントを作成した。
手順
GCP Workload Identity で認証する Pod を作成するには、次の例のようなデプロイメント YAML ファイルを作成します。
サンプルデプロイメント
apiVersion: apps/v1 kind: Deployment metadata: name: ubi9 spec: replicas: 1 selector: matchLabels: app: ubi9 template: metadata: labels: app: ubi9 spec: serviceAccountName: "<service_account_name>" 1 containers: - name: ubi image: 'registry.access.redhat.com/ubi9/ubi-micro:latest' command: - /bin/sh - '-c' - | sleep infinity
- 1
- OpenShift Container Platform サービスアカウントの名前を指定します。
次のコマンドを実行してデプロイメントファイルを適用します。
$ oc apply -f deployment.yaml
検証
Pod が短期認証を使用していることを確認するには、次のコマンドを実行します。
$ oc get pods -o json | jq -r '.items[0].spec.containers[0].env[] | select(.name=="GOOGLE_APPLICATION_CREDENTIALS")'
出力例
{ "name": "GOOGLE_APPLICATION_CREDENTIALS", "value": "/var/run/secrets/workload-identity/federation.json" }
GOOGLE_APPLICATION_CREDENTIALS
環境変数が存在する場合、それは GCP Workload Identity で認証する Pod を示しています。追加設定の詳細を確認するには、Pod 仕様を調べます。次の Pod 仕様の例は、Webhook によって変更される環境変数とボリュームフィールドを示しています。
direct
注入モードの Pod 仕様例:apiVersion: v1 kind: Pod metadata: name: app-x-pod namespace: service-a annotations: cloud.google.com/skip-containers: "init-first,sidecar" cloud.google.com/external-credentials-json: |- 1 { "type": "external_account", "audience": "//iam.googleapis.com/projects/<project_number>/locations/global/workloadIdentityPools/on-prem-kubernetes/providers/<identity_provider>", "subject_token_type": "urn:ietf:params:oauth:token-type:jwt", "token_url": "https://sts.googleapis.com/v1/token", "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/app-x@project.iam.gserviceaccount.com:generateAccessToken", "credential_source": { "file": "/var/run/secrets/sts.googleapis.com/serviceaccount/token", "format": { "type": "text" } } } spec: serviceAccountName: app-x initContainers: - name: init-first image: container-image:version containers: - name: sidecar image: container-image:version - name: container-name image: container-image:version env: 2 - name: GOOGLE_APPLICATION_CREDENTIALS value: /var/run/secrets/gcloud/config/federation.json - name: CLOUDSDK_COMPUTE_REGION value: asia-northeast1 volumeMounts: - name: gcp-iam-token readOnly: true mountPath: /var/run/secrets/sts.googleapis.com/serviceaccount - mountPath: /var/run/secrets/gcloud/config name: external-credential-config readOnly: true volumes: - name: gcp-iam-token projected: sources: - serviceAccountToken: audience: sts.googleapis.com expirationSeconds: 86400 path: token - downwardAPI: defaultMode: 288 items: - fieldRef: apiVersion: v1 fieldPath: metadata.annotations['cloud.google.com/external-credentials-json'] path: federation.json name: external-credential-config