IAM を使用した Cloud Deploy アクセスの制限

すべての Google Cloud プロダクトと同様に、Identity and Access Management は、認証されたユーザーとサービス アカウントがどのアクションを実行できるかを制御することで Cloud Deploy を保護します。

このドキュメントでは、IAM のいくつかの機能について説明し、Cloud Deploy を使用して管理されるアプリケーションの配信を保護する手順を説明します。Cloud Deploy のアクションとリソースへのアクセスを制限する具体的な方法をいくつか紹介します。

始める前に

IAM の高度な機能について

Cloud Deploy では、ロールと権限のほかに、IAM の次の機能を使用して制御を行います。

IAM ポリシーについて

IAM ポリシーは、バインディングとメタデータから構成されます。ロール バインディングは、1 つ以上のプリンシパル(ユーザー、グループ、またはサービス アカウント)に単一のロールを付与します。また、バインディングを有効にするかどうかを制御するコンテキスト固有の条件を付与します。

IAM ポリシーの詳細については、ポリシーについてをご覧ください。

IAM の条件について

IAM の条件を使用すると、実行時に計算された条件に基づいて、Cloud Deploy リソースとアクションへのアクセスを制御できます。たとえば、指定された期間にだけ許可されるように、特定のターゲットへのプロモーションを制限できます。

API 属性について

IAM 条件を作成する際、API 属性を参照してリクエストに関するランタイム情報を取得できます。たとえば、API 属性を使用して、リクエストの対象となるリソースの名前を取得できます。次に、プリンシパルがアクセスできるリソースと比較できます。

高度な IAM 機能を使用してきめ細かいアクセス権を付与する

これらの高度な IAM 機能を使用すると、特定の条件下で、特定のリソースやリソースタイプへのアクセスを制御できます。

このセクションの手順では、特定のリソース(ターゲット、デリバリー パイプライン)へのアクセスを許可します。また、プロジェクト レベルでアクセス権を付与することもできます。これは、プロジェクト内のすべてのデリバリー パイプラインまたはすべてのターゲットに影響します。プロジェクトの IAM ポリシーを設定するには、gcloud projects set-iam-policy コマンドを使用します。

gcloud projects set-iam-policy PROJECT_ID POLICY_FILE

特定のデリバリー パイプラインへのアクセスを許可する

適切なロールを付与するだけで、プリンシパルにすべてのデリバリー パイプラインの作成、変更、削除を行う権限を付与できます。しかし、1 つ以上の特定のパイプラインに対して、プリンシパルにこのアクセス権を付与することもできます。

これを行うには、ロール バインディングを使用して、roles/clouddeploy.developer ロールをそのプリンシパルにバインドします。次に、ポリシーを適用する際に(setIamPolicy を使用して)アクセス権を付与するデリバリー パイプラインを指定します。

特定のデリバリー パイプラインへのアクセス権を付与するには:

  1. 次の情報を含む ポリシー ファイルを作成します。

    bindings:
    - role: roles/clouddeploy.developer
      members:
      - user:fatima@example.com
    

    上記の例では、ユーザーにロールを付与していますが、グループまたはサービス アカウントにロールを付与することもできます。

  2. 次のコマンドを呼び出して、ポリシー ファイルを特定のデリバリー パイプラインに適用します。

    gcloud deploy delivery-pipelines set-iam-policy --delivery-pipeline=PIPELINE_NAME --region=REGION POLICY_FILE
    

特定のターゲットを構成するためのアクセス権を付与する

プリンシパルに特定のターゲットへのアクセス権を付与するには、ロール バインディングを使用します。これを行うには、roles/clouddeploy.operator ロールをそのプリンシパルにバインドし、ポリシーを適用する際に(setIamPolicy を使用して)アクセス権を付与するターゲットを指定します。

特定のターゲットにアクセスすると、プリンシパルはそのターゲットを更新、削除できます。

  1. 次の情報を含む ポリシー ファイルを作成します。

    bindings:
    - role: roles/clouddeploy.operator
      members:
      - group:cd_operators@example.com
    

    上記の例では、ユーザーにロールを付与していますが、グループまたはサービス アカウントにロールを付与することもできます。

  2. 次のコマンドを呼び出して、ポリシー ファイルを特定のターゲットに適用します。

    gcloud deploy targets set-iam-policy TARGET --region=REGION POLICY_FILE
    

特定のターゲットへのリリースを昇格させる権限を付与する

この手順では、プリンシパルにロールをバインドするポリシーがすでに設定されていることを前提としています。ここで、ターゲットを指定する条件を追加します。

  1. 次のバインドを含むポリシー ファイルを作成します。

    bindings:
    - role: roles/clouddeploy.operator
      members:
      - serviceAccount:prod_operator@project-12345.iam.gserviceaccount.com
      condition:
        expression: api.getAttribute("clouddeploy.googleapis.com/rolloutTarget", "") == "prod"
        title: Deploy to prod
    

    このロール バインディングでは、condition が Key-Value ペアを受け取ります。ここで、キーは expression、値は CEL 式です。 この式は、リクエストについての一連のコンテキスト属性を参照し、ブール値として評価します。

    この場合、プリンシパルがリリースを昇格させようとすると、式が評価され、プロモーション ターゲットが式のターゲットと一致することを確認します。

    式では、プリンシパルが昇格しようとしているターゲットである API 属性 clouddeploy.com/rolloutTarget を使用しています。式は、プリンシパルに昇格アクセス権が付与されているターゲットと比較します。

  2. 特定のデリバリー パイプラインのバインディングを設定します。

    gcloud deploy delivery-pipelines set-iam-policy PIPELINE_NAME --region=REGION POLICY_FILE
    

    このバインディングをすべてのデリバリー パイプラインに設定する場合は、プロジェクト レベルで設定できます。

    gcloud projects set-iam-policy PROJECT POLICY_FILE
    

特定のターゲットにロールアウトを承認する権限を付与する

このセクションのバインディングでは、パイプラインのロールアウトを承認する権限をプリンシパルに付与し、prod ターゲットの権限を適用する条件が含まれます。

  1. 次のバインドを含むポリシー ファイルを作成します。

    bindings:
    - role: roles/clouddeploy.approver
      members:
      - serviceAccount:prod_operator@project-12345.iam.gserviceaccount.com
      condition:
        expression: api.getAttribute("clouddeploy.googleapis.com/rolloutTarget", "") == "prod"
        title: Deploy to prod
    

    このロール バインディングでは、condition が Key-Value ペアを受け取ります。ここで、キーは expression、値は CEL 式です。 この式は、リクエストについての一連のコンテキスト属性を参照し、ブール値として評価します。

    この場合、プリンシパルがロールアウトを承認しようとしたときに式が評価され、ロールアウト ターゲットが式のターゲットと一致することを確認します。

    式は API 属性 clouddeploy.com/rolloutTarget(ロールアウトのターゲット)を使用し、プリンシパルに承認アクセス権が付与されているターゲットと比較します。clouddeploy.googleapis.com/rolloutTarget 属性は、Cloud Deploy がサポートする唯一の API 属性です。

  2. 特定のデリバリー パイプラインのバインディングを設定します。

    gcloud deploy delivery-pipelines set-iam-policy PIPELINE_NAME --region=REGION POLICY_FILE
    

    このバインディングをすべてのデリバリー パイプラインに設定する場合は、プロジェクト レベルで設定できます。

    gcloud projects set-iam-policy PROJECT POLICY_FILE
    

特定の期間にリリースを昇格させる権限を付与する

このセクションのバインディングでは、パイプラインのリリースを昇格させる権限をプリンシパルに付与し、バインディングが有効である時間枠を指定する条件が含まれます。

  1. 次のバインドを含むポリシー ファイルを作成します。

    bindings:
    - role: roles/clouddeploy.operator
      members:
      - serviceAccount:prod_operator@project-12345.iam.gserviceaccount.com
      condition:
        expression: request.time.getDayOfWeek("America/Los_Angeles") > 0 && request.time.getDayOfWeek("America/Los_Angeles") < 6
        title: Promote during safe window
    

    このロール バインディングでは、condition は Key-Value ペアを受け取ります。ここで、キーは expression、値は CEL 式です。 式は、リクエストに関する一連のコンテキスト属性を参照し、ブール値に評価されます。この式により、リクエストの時刻が月曜日から金曜日までであることを確認します。

    この場合、プリンシパルがリリースを昇格させようとすると、式が評価され、プロモーション ターゲットが式のターゲットと一致することを確認します。

  2. 特定のデリバリー パイプラインのバインディングを設定します。

    gcloud deploy delivery-pipelines set-iam-policy PIPELINE_NAME --region=REGION POLICY_FILE
    

    このバインディングをすべてのデリバリー パイプラインに設定する場合は、プロジェクト レベルで設定できます。

    gcloud projects set-iam-policy PROJECT POLICY_FILE
    

特定の時間枠でロールアウトを承認する権限を付与する

このセクションのバインディングでは、ロールアウトを承認する権限をプリンシパルに付与し、バインディングが有効である時間枠を指定する条件が含まれます。

  1. 次のバインドを含むポリシー ファイルを作成します。

    bindings:
    - role: roles/clouddeploy.approver
      members:
      - serviceAccount:prod_operator@project-12345.iam.gserviceaccount.com
      condition:
        expression: request.time.getDayOfWeek("America/Los_Angeles") > 0 && request.time.getDayOfWeek("America/Los_Angeles") < 6
        title: Approve during safe window
    

    このロール バインディングでは、condition が Key-Value ペアを受け取ります。ここで、キーは expression、値はリクエストについての一連のコンテキスト属性を参照し、ブール値として評価する CEL 式です。 この式により、リクエストの時刻が月曜日から金曜日までであることを確認します。

    この場合、プリンシパルがロールアウトを承認しようとしたときに式が評価され、ロールアウト ターゲットが式のターゲットと一致することを確認します。

  2. 特定のデリバリー パイプラインのバインディングを設定します。

    gcloud deploy delivery-pipelines set-iam-policy PIPELINE_NAME --region=REGION POLICY_FILE
    

    このバインディングをすべてのデリバリー パイプラインに設定する場合は、プロジェクト レベルで設定できます。

    gcloud projects set-iam-policy PROJECT POLICY_FILE
    

ジョブタイプに基づいてジョブを再試行する権限を付与する

このセクションのバインディングでは、ジョブの種類に基づいて、Cloud Deploy ジョブを再試行する権限をプリンシパルに付与します。

  1. 次のバインドを含むポリシー ファイルを作成します。

    bindings:
    - role: roles/clouddeploy.operator
      members:
      - serviceAccount:prod_operator@project-12345.iam.gserviceaccount.com
      condition:
        expression: api.getAttribute("clouddeploy.googleapis.com/jobType", "") == "deploy"
        title: Retry deploy job
    

    このロール バインディングでは、condition が Key-Value ペアを受け取ります。ここで、キーは expression、値は CEL 式です。 この式は、リクエストについての一連のコンテキスト属性を参照し、ブール値として評価します。

    この場合、プリンシパルがジョブを再試行しようとすると、式が評価され、ジョブタイプが式のジョブタイプと一致することを確認します。

    この式では、API 属性 clouddeploy.com/jobTypedeploy または verify のいずれか)が使用されます。

  2. 特定のデリバリー パイプラインのバインディングを設定します。

    gcloud deploy delivery-pipelines set-iam-policy PIPELINE_NAME --region=REGION POLICY_FILE
    

    このバインディングをすべてのデリバリー パイプラインに設定する場合は、プロジェクト レベルで設定できます。

    gcloud projects set-iam-policy PROJECT POLICY_FILE