Cloud IAM ポリシーの作成

このページでは、Google Kubernetes Engine での承認に使用する Cloud Identity and Access Management(Cloud IAM)ポリシーの作成方法について説明します。

概要

Google Cloud Platform(GCP)、GKE、Kubernetes API のすべての呼び出しにおいて、リクエストを行うアカウントには必要な権限が付与されている必要があります。デフォルトでは、自身以外のユーザーはプロジェクトやそのリソースにアクセスできません。Cloud Identity and Access Management を使用すると、プロジェクトにアクセスできるユーザーと許可する内容を管理できます。Cloud IAM のアクセス許可は、Kubernetes RBAC と連携して動作します。これにより、クラスタまたはネームスペース内の特定のオブジェクトに対するきめ細かいアクセス制御が実現されます。Cloud IAM は GCP プロジェクトおよび組織レベルでのアクセス許可に重点を置いており、GKE に固有の定義済みの役割を用意しています。

ユーザーとサービス アカウントに GCP プロジェクトへのアクセスを許可するには、それらをプロジェクト チームメンバーとして追加してから、チームメンバーに役割を割り当てます。役割では、アカウントがアクセスできる GCP リソースと実行可能なオペレーションが定義されています。

GKE では Cloud IAM を使用して、クラスタへのアクセスを許可するユーザーとサービス アカウント、クラスタ内で実行できるオペレーションを管理します。

始める前に

このタスクの準備として、次の手順を行います。

  • Google Kubernetes Engine API が有効になっていることを確認します。
  • Google Kubernetes Engine API の有効化
  • Cloud SDK がインストール済みであることを確認します。
  • デフォルトのプロジェクト ID を設定します。
    gcloud config set project [PROJECT_ID]
  • ゾーンクラスタを使用する場合は、デフォルトのコンピューティング ゾーンを設定します。
    gcloud config set compute/zone [COMPUTE_ZONE]
  • リージョン クラスタを使用する場合は、デフォルトのコンピューティング リージョンを設定します。
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud を最新バージョンに更新します。
    gcloud components update

Kubernetes RBAC との連携

Kubernetes 独自の役割ベースのアクセス制御(RBAC)システムでも、クラスタへのアクセスを管理します。Cloud IAM はプロジェクト レベルでアクセスを制御するのに対し、RBAC はクラスタレベルと名前空間レベルでアクセスを制御します。

Cloud IAM と RBAC は連携して動作できるため、クラスタ内のリソースを操作するには、エンティティが各レベルの十分な権限を持っている必要があります。

Cloud IAM の役割

以降のセクションでは、GCP で使用できる Cloud IAM の役割について説明します。

事前定義された GKE の役割

Cloud IAM には事前定義された役割が用意されています。こうした役割を使用すると、特定の GCP リソースへのアクセス権を付与し、その他のリソースへの許可されていないアクセスを防ぐことができます。

GKE 用に Cloud IAM で提供されている事前定義の役割は次のとおりです。

Kubernetes Engine の役割

役割 役職 説明 権限 最下位のリソース
roles/
container.admin
Kubernetes Engine 管理者 コンテナ クラスタと、それらの Kubernetes API オブジェクトのすべてを管理できるアクセス権を付与します。 container.*
resourcemanager.projects.get resourcemanager.projects.list
プロジェクト
roles/
container.clusterAdmin
Kubernetes Engine Cluster 管理者 コンテナ クラスタを管理できるアクセス権を付与します。 container.clusters.create
container.clusters.delete container.clusters.get container.clusters.list container.clusters.update container.operations.* resourcemanager.projects.get resourcemanager.projects.list
プロジェクト
roles/
container.clusterViewer
Kubernetes Engine Cluster 閲覧者 Kubernetes クラスタへの読み取り専用アクセス権。 container.clusters.get
container.clusters.list resourcemanager.projects.get resourcemanager.projects.list
roles/
container.developer
Kubernetes Engine デベロッパー コンテナ クラスタ内の Kubernetes API オブジェクトに対する完全アクセス権を付与します。 container.apiServices.*
container.backendConfigs.* container.bindings.* container.certificateSigningRequests.create container.certificateSigningRequests.delete container.certificateSigningRequests.get container.certificateSigningRequests.list container.certificateSigningRequests.update container.certificateSigningRequests.updateStatus container.clusterRoleBindings.get container.clusterRoleBindings.list container.clusterRoles.get container.clusterRoles.list container.clusters.get container.clusters.list container.componentStatuses.* container.configMaps.* container.controllerRevisions.get container.controllerRevisions.list container.cronJobs.* container.customResourceDefinitions.* container.daemonSets.* container.deployments.* container.endpoints.* container.events.* container.horizontalPodAutoscalers.* container.ingresses.* container.initializerConfigurations.* container.jobs.* container.limitRanges.* container.localSubjectAccessReviews.* container.namespaces.* container.networkPolicies.* container.nodes.* container.persistentVolumeClaims.* container.persistentVolumes.* container.petSets.* container.podDisruptionBudgets.* container.podPresets.* container.podSecurityPolicies.get container.podSecurityPolicies.list container.podTemplates.* container.pods.* container.replicaSets.* container.replicationControllers.* container.resourceQuotas.* container.roleBindings.get container.roleBindings.list container.roles.get container.roles.list container.scheduledJobs.* container.secrets.* container.selfSubjectAccessReviews.* container.serviceAccounts.* container.services.* container.statefulSets.* container.storageClasses.* container.subjectAccessReviews.* container.thirdPartyObjects.* container.thirdPartyResources.* container.tokenReviews.* resourcemanager.projects.get resourcemanager.projects.list
プロジェクト
roles/
container.hostServiceAgentUser
Kubernetes Engine Host サービス エージェント ユーザー Kubernetes Engine Host サービス エージェントの使用アクセス権。 compute.firewalls.get
container.hostServiceAgent.*
roles/
container.viewer
Kubernetes Engine 閲覧者 GKE リソースに対する読み取り専用アクセス権を付与します。 container.apiServices.get
container.apiServices.list container.backendConfigs.get container.backendConfigs.list container.bindings.get container.bindings.list container.certificateSigningRequests.get container.certificateSigningRequests.list container.clusterRoleBindings.get container.clusterRoleBindings.list container.clusterRoles.get container.clusterRoles.list container.clusters.get container.clusters.list container.componentStatuses.* container.configMaps.get container.configMaps.list container.controllerRevisions.get container.controllerRevisions.list container.cronJobs.get container.cronJobs.getStatus container.cronJobs.list container.customResourceDefinitions.get container.customResourceDefinitions.list container.daemonSets.get container.daemonSets.getStatus container.daemonSets.list container.deployments.get container.deployments.getStatus container.deployments.list container.endpoints.get container.endpoints.list container.events.get container.events.list container.horizontalPodAutoscalers.get container.horizontalPodAutoscalers.getStatus container.horizontalPodAutoscalers.list container.ingresses.get container.ingresses.getStatus container.ingresses.list container.initializerConfigurations.get container.initializerConfigurations.list container.jobs.get container.jobs.getStatus container.jobs.list container.limitRanges.get container.limitRanges.list container.namespaces.get container.namespaces.getStatus container.namespaces.list container.networkPolicies.get container.networkPolicies.list container.nodes.get container.nodes.getStatus container.nodes.list container.operations.* container.persistentVolumeClaims.get container.persistentVolumeClaims.getStatus container.persistentVolumeClaims.list container.persistentVolumes.get container.persistentVolumes.getStatus container.persistentVolumes.list container.petSets.get container.petSets.list container.podDisruptionBudgets.get container.podDisruptionBudgets.getStatus container.podDisruptionBudgets.list container.podPresets.get container.podPresets.list container.podSecurityPolicies.get container.podSecurityPolicies.list container.podTemplates.get container.podTemplates.list container.pods.get container.pods.getStatus container.pods.list container.replicaSets.get container.replicaSets.getScale container.replicaSets.getStatus container.replicaSets.list container.replicationControllers.get container.replicationControllers.getScale container.replicationControllers.getStatus container.replicationControllers.list container.resourceQuotas.get container.resourceQuotas.getStatus container.resourceQuotas.list container.roleBindings.get container.roleBindings.list container.roles.get container.roles.list container.scheduledJobs.get container.scheduledJobs.list container.serviceAccounts.get container.serviceAccounts.list container.services.get container.services.getStatus container.services.list container.statefulSets.get container.statefulSets.getStatus container.statefulSets.list container.storageClasses.get container.storageClasses.list container.thirdPartyObjects.get container.thirdPartyObjects.list container.thirdPartyResources.get container.thirdPartyResources.list container.tokenReviews.* resourcemanager.projects.get resourcemanager.projects.list
プロジェクト

Cloud IAM 役割によって付与される権限については、Cloud IAM 役割によって付与される権限を参照してください。

Cloud IAM の基本の役割

Cloud IAM の基本の役割では、すべての GCP リソースへのグローバルなプロジェクト レベルのアクセス権がユーザーに付与されます。プロジェクトとクラスタを安全に保つため、事前定義された役割をできるだけ使用してください。

基本の役割の詳細については、Cloud Identity and Access Management ドキュメントの基本の役割を参照してください。

サービス アカウント ユーザーの役割

サービス アカウント ユーザーは、GCP ユーザー アカウントに、あたかもサービス アカウントが実行しているかのようにアクションを実行する権限を付与します。

  • プロジェクトのユーザーに iam.serviceAccountUser 役割を付与すると、今後作成される可能性があるサービス アカウントを含む、プロジェクト内のすべてのサービス アカウントに付与されているすべての役割がユーザーに付与されます。

  • 特定のサービス アカウントのユーザーに iam.serviceAccountUser 役割を付与すると、そのサービス アカウントに付与されているすべての役割がユーザーに付与されます。

ServiceAccountUser 役割の詳細については、Cloud IAM のドキュメントの ServiceAccountUser を参照してください。

次のコマンドは、サービス アカウント ユーザーの役割を付与するための構文を示しています。

gcloud iam service-accounts add-iam-policy-binding \
  [SA_NAME]@[PROJECT_ID].iam.gserviceaccount.com \
  --member=user:[USER] \
  --role=roles/iam.serviceAccountUser
roles/
iam.serviceAccountUser
Service Account User Run operations as the service account. iam.serviceAccounts.actAs
iam.serviceAccounts.get
iam.serviceAccounts.list
resourcemanager.projects.get
resourcemanager.projects.list
Service Account
役割 タイトル 説明 権限 最下位のリソース

Host サービス エージェント ユーザーの役割

Host サービス エージェント ユーザーの役割は、共有 VPC クラスタでのみ使用されます。

roles/
container.hostServiceAgentUser
Kubernetes Engine Host Service Agent User Use access of the Kubernetes Engine Host Service Agent. compute.firewalls.get
container.hostServiceAgent.*
役割 タイトル 説明 権限 最下位のリソース

カスタムの役割

事前定義された役割がニーズに合わない場合は、権限を定義してカスタムの役割を作成できます。

カスタムの役割を作成して割り当てる方法については、カスタムの役割の作成と管理をご覧ください。

Cloud Identity and Access Management 役割によって付与された権限の確認

gcloud コマンドライン ツールまたは GCP Console を使用して、各役割で付与される権限を確認できます。

gcloud

特定の役割で付与される権限を確認するには、次のコマンドを実行します。[ROLE] はクラウド ID およびアクセス管理のための役割です。GKE の役割には接頭辞 roles/container. が付きます。

gcloud iam roles describe roles/[ROLE]

例:

gcloud iam roles describe roles/container.admin

Console

特定の役割で付与される権限を確認するには、次の操作を行います。

  1. GCP Console で、IAM メニューの [役割] セクションにアクセスします。

    IAM メニューにアクセスする

  2. [表をフィルタリング] フィールドに「GKE」と入力します。

  3. 目的の役割を選択します。

Cloud Identity and Access Management 役割の管理

ユーザーの Cloud IAM 役割と権限を管理する方法については、Cloud IAM ドキュメントにおけるプロジェクト メンバーへのアクセスの許可、変更、取り消しをご覧ください。

サービス アカウントについては、サービス アカウントへの役割の付与をご覧ください。

GKE での Cloud Identity and Access Management の使用例を以下にご紹介します。

  • 新しい社員が入社したとします。この社員を GCP プロジェクトに追加する必要がありますが、この社員に許可するのは、プロジェクトのクラスタと他の GCP リソースの閲覧のみです。プロジェクトの所有者は、プロジェクト レベルの Compute 閲覧者の役割を割り当てます。この役割は、Compute Engine リソースであるノードを取得して一覧表示する読み取り専用アクセスを付与します。
  • この社員は運用を担当しており、gcloud や Google Cloud Platform Console を使用してクラスタを更新する必要があります。この操作には container.clusters.update 権限が必要なので、プロジェクト所有者は社員に Kubernetes Engine Cluster 管理者の役割を割り当てます。これで、社員は Kubernetes Engine Cluster 管理者の役割と Compute 閲覧者の役割の両方によって付与された権限を持ちます。
  • この社員は、Deployment に発生している問題の原因を調査することになりました。kubectl get pods を実行して、クラスタ内で実行されているポッドを確認する必要があります。社員はすでに Compute 閲覧者の役割を持っていますが、これはポッドをリストするには不十分です。Kubernetes Engine 閲覧者の役割が必要です。
  • この社員は新しいクラスタを作成することになりました。そこでプロジェクト所有者は、この社員に [PROJECT_NUMBER]-compute@developer.gserviceaccount.com サービス アカウントのサービス アカウント ユーザーの役割を付与します。これで、この社員のアカウントで Compute Engine のデフォルトのサービス アカウントにアクセスできます。このサービス アカウントには編集者の役割があり、これにより広範な権限が与えられます。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Kubernetes Engine のドキュメント