使用 IAM 限制 Cloud Deploy 访问权限

与所有 Google Cloud 产品一样,Identity and Access Management 可以为 Cloud Deploy 提供保护 通过控制哪些经过身份验证的用户和服务账号可以执行哪些操作, 操作。

本文档介绍了 IAM 的一些功能,并说明了如何保护使用 Cloud Deploy 管理的应用交付。以下是您可以限制对 Cloud Deploy 中操作和资源的访问权限的一些特定方法:

准备工作

IAM 高级功能简介

除了角色和权限之外,Cloud Deploy 使用 IAM 的以下功能来提供这些控制:

IAM 政策简介

IAM 政策是角色绑定和元数据的集合。角色绑定会向单个主账号(用户、群组或服务账号)授予单个角色,以及控制绑定是否生效的任何上下文特定条件

如需详细了解 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

授予对特定交付流水线的访问权限

您只需授予适当的角色,即可为主账号授予创建、修改和删除所有交付流水线的权限。但有时您可能想向主账号授予一个或多个特定流水线的此访问权限。

为此,可使用角色绑定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