使用 IAM 限制 Cloud Deploy 存取權

如同所有 Google Cloud 產品,身分與存取權管理功能會控制哪些已驗證的使用者和服務帳戶可以執行哪些動作,藉此保護 Cloud Deploy。

本文說明 IAM 的部分功能,並提供如何保護使用 Cloud Deploy 管理的應用程式提交作業的操作說明。以下是限制 Cloud Deploy 中動作和資源存取權的具體方式:

事前準備

關於 IAM 進階功能

除了角色和權限之外,Cloud Deploy 還會使用下列 IAM 功能提供這些控制項:

關於 IAM 政策

IAM 政策是繫結和中繼資料的集合。角色繫結可為一或多個主要使用者 (使用者、群組或服務帳戶) 授予單一角色,以及任何控管繫結是否生效的特定情境條件

如要進一步瞭解身分與存取權管理政策,請參閱「瞭解政策」。

關於 IAM 條件

您可以使用 IAM 條件,根據在執行階段計算的條件,控管 Cloud Deploy 資源和動作的存取權。舉例來說,您可以限制促銷活動的指定目標,例如只在特定時間範圍內放送。

關於 API 屬性

建構 IAM 條件時,您可以參照 API 屬性,取得要求的執行階段資訊。舉例來說,您可以使用 API 屬性取得要求所需資源的名稱。然後,您可以將其與主體可存取的資源進行比較。

使用進階身分與存取權管理功能授予精細存取權

這些進階 IAM 功能可讓您在特定情況下,控管特定資源和資源類型的存取權。

本節的程序會授予存取特定資源 (目標、提交管道) 的權限。您也可以在專案層級授予存取權,這會影響該專案中的所有提交管道或所有目標。如要為專案設定 IAM 政策,請使用 gcloud projects set-iam-policy 指令:

gcloud projects set-iam-policy PROJECT_ID POLICY_FILE

授予特定提交管道的存取權

只要授予適當的角色,即可授予主體建立、修改及刪除所有提交管道的權限。不過,有時您可能會想將這項存取權授予一位或多位實體,用於一或多個特定管道。

如要這麼做,請使用角色繫結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 會採用鍵/值組合,其中鍵為 expression,值則為 CEL 運算式。這個運算式會參照要求的一系列關聯屬性,並評估為布林值。

    在這種情況下,當管理員嘗試推送版本時,系統會評估表達式,確認推送目標是否與表達式中的目標相符。

    這項運算式使用 API 屬性 clouddeploy.googleapis.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 會採用鍵/值組合,其中鍵為 expression,值則為 CEL 運算式。這項運算式會參照要求的一系列關聯屬性,並評估為布林值。

    在這種情況下,當管理員嘗試核准推行時,系統會評估表式,確認目標是否與表式中的目標相符。

    此運算式使用 API 屬性 clouddeploy.googleapis.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 會採用鍵/值組合,其中鍵為 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 會採用鍵/值組合,其中鍵為 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 會採用鍵/值組合,其中鍵為 expression,值則為 CEL 運算式。這項運算式會參照一組關於要求的內容屬性,並評估為布林值。

    在這種情況下,當使用者嘗試重試工作時,系統會評估表達式,確認工作類型與表達式中的工作類型相符。

    這項運算式使用 API 屬性 clouddeploy.googleapis.com/jobType,該屬性可以是 deployverify

  2. 為特定提交管道設定繫結:

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

    如果您想為所有提交管道設定此繫結,可以改為在專案層級設定:

    gcloud projects set-iam-policy PROJECT POLICY_FILE