8.11.2.3. サービスアカウントのなりすましをコンピュートノードサービスアカウントに制限する
Cloud Credential Operator ユーティリティー (ccoctl) がクラスターのリソースを作成した後、ccoctl ユーティリティーが Machine API コントローラーサービスアカウントに付与した Google Cloud iam.serviceAccounts.actAs 権限を、コンピュートノードサービスアカウントに制限することができます。
サービスアカウントのなりすましをコンピュートノードのサービスアカウントに限定することは任意です。組織でこの変更が必要ない場合は、「Cloud Credential Operator ユーティリティーマニフェストの組み込み」に進んでください。
ccoctl ユーティリティーが OpenShift Container Platform コンポーネントのサービスアカウントにカスタムロールと Google Cloud の事前定義ロールを割り当てると、Google Cloud プロジェクトレベルで Machine API コントローラーサービスアカウントに iam.serviceAccounts.actAs 権限が付与されます。iam.serviceAccounts.actAs 権限の範囲を縮小するには、Machine API コントローラーサービスアカウントのカスタムロールを特定し、より制限された権限セットを持つロールに置き換えます。このコンポーネントを機能させるには、Machine API コントローラーのサービスアカウントに、コンピュートノードのサービスアカウント上で Service Account User ロールを代わりに付与します。
前提条件
- クラスターをホストするクラウドプラットフォームでアカウントを設定した。
-
ccoctlユーティリティーを使用して、クラスター用のクラウドプロバイダーリソースを作成した。 -
install-config.yamlファイルにアクセスできる。 -
サービスアカウントとロールを管理する権限を持つユーザーとして、Google Cloud CLI (
gcloud) にログインした。
手順
install-config.yamlファイルから以下の値を取得します。-
Google Cloud プロジェクト名。YAML ファイルでは、これは
platform.gcp.projectIDパラメーターの値です。 -
クラスター名。YAML ファイルでは、これは
metadata.nameパラメーターの値です。 -
コンピュートノード用のサービスアカウント。YAML ファイルでは、これは
compute[0].platform.gcp.serviceAccountパラメーターの値です。
-
Google Cloud プロジェクト名。YAML ファイルでは、これは
ccoctlユーティリティーが作成した Machine API コントローラーのサービスアカウントを取得するには、次のコマンドを実行します。$ gcloud iam service-accounts list \ --filter="displayName=<cluster_name>-openshift-machine-api-gcp" \ --format='value(email)'ここで、
<cluster_name>は、install-config.yamlファイル内のmetadata.nameパラメーターに指定された値です。Machine API コントローラーサービスアカウントのカスタムロールのロール ID を取得するには、次のコマンドを実行します。
$ gcloud projects get-iam-policy <project_name> \ --flatten='bindings[].members' \ --format='table(bindings.role)' \ --filter="bindings.members:<machine_api_controller_service_account>"ここで、
<machine_api_controller_service_account>は、Machine API コントローラーのサービスアカウントです。Machine API コントローラーサービスアカウントのカスタムロール権限をリスト表示するには、次のコマンドを実行します。
$ gcloud iam roles describe <machine_api_role> \ --project <project_name>ここで、
<machine_api_role>は、Machine API コントローラーサービスアカウントのカスタムロールのロール ID です。出力例
etag: <etag_value> includedPermissions: - compute.acceleratorTypes.get - compute.acceleratorTypes.list - compute.disks.create - compute.disks.createTagBinding ... - compute.zones.get - compute.zones.list - iam.serviceAccounts.actAs - iam.serviceAccounts.get - iam.serviceAccounts.list - resourcemanager.tagValues.get - resourcemanager.tagValues.list - serviceusage.quotas.get - serviceusage.services.get - serviceusage.services.list name: projects/<project_name>/roles/<machine_api_role> stage: GA title: <project_name>-openshift-machine-api-gcpここで、
<project_name>は、install-config.yamlファイルで指定されている Google Cloud プロジェクト名です。注記この省略された出力例は、お使いのクラスターの権限リストと一致しない可能性があります。
以下のようなコマンドを実行して、出力から
iam.serviceAccounts.actAs権限を除外したすべての権限を含むカスタムロールを作成します。$ gcloud iam roles create <machine_api_role>_without_actas \ --project=<project_name> \ --title=<machine_api_role>_without_actas \ --description="Required permissions for the Machine API controller without the iam.serviceAccounts.actAs permission" \ --permissions=compute.acceleratorTypes.get,\ compute.acceleratorTypes.list,\ compute.disks.create,\ compute.disks.createTagBinding,\ ... compute.zones.get,\ compute.zones.list,\ iam.serviceAccounts.get,\ iam.serviceAccounts.list,\ resourcemanager.tagValues.get,\ resourcemanager.tagValues.list,\ serviceusage.quotas.get,\ serviceusage.services.get,\ serviceusage.services.listこの例では、新しいロール名は、元のカスタムロール名である
<machine_api_role>で、末尾に_without_actasという文字列を追加したものです。重要この省略されたコマンド例は、お使いのクラスターの権限リストと一致しない可能性があります。クラスター上で、
gcloud iam roles describe <machine_api_role> --project <project_name>コマンドの出力から得られる権限リストを使用する必要があります。以下のコマンドを実行して、Machine API コントローラーサービスアカウントから
iam.serviceAccounts.actAs権限を含むカスタムロールを削除します。$ gcloud projects remove-iam-policy-binding <project_name> \ --member "serviceAccount:<machine_api_controller_service_account>" \ --role "projects/<project_name>/roles/<machine_api_role>"ここで、
<machine_api_role>は元のカスタムロールです。以下のコマンドを実行して、Machine API コントローラーサービスアカウントに
iam.serviceAccounts.actAs権限を除外するカスタムロールを付与します。$ gcloud projects add-iam-policy-binding <project_name> \ --member "serviceAccount:<machine_api_controller_service_account>" \ --role "projects/<project_name>/roles/<machine_api_role>_without_actasここで、
<machine_api_role>_without_actasは新しいカスタムロールです。オプション: Machine API コントローラーサービスアカウントに正しいロールが付与されていることを確認するには、次のコマンドを実行して、アタッチされているロール ID を確認します。
$ gcloud projects get-iam-policy <project_name> \ --flatten='bindings[].members' \ --format='table(bindings.role)' \ --filter="bindings.members:<machine_api_controller_service_account>"出力例
ROLE projects/<project_name>/roles/<machine_api_role>_without_actas以下のコマンドを実行して、Machine API コントローラーサービスアカウントに、コンピュートノードのサービスアカウント上で Service Account User ロールを付与します。
$ gcloud iam service-accounts add-iam-policy-binding <compute_nodes_service_account> \ --member="serviceAccount:<machine_api_controller_service_account>" \ --role=roles/iam.serviceAccountUserここで、
<compute_nodes_service_account>は、コンピュートノードのサービスアカウントです。この値は、install-config.yamlファイル内のcompute[0].platform.gcp.serviceAccountパラメーターです。