使用标记和拒绝政策控制代码库访问权限

您可以将 Identity and Access Management (IAM) 拒绝政策与标记结合使用,以阻止对 Developer Connect 连接中的 Git 代码库链接执行特定操作。

您需要将标记附加到连接,然后创建条件与该标记匹配的拒绝政策。连接中的每个 Git 代码库链接都会继承该标记,因此拒绝政策会应用于通过该连接关联的所有代码库。

何时使用标记和拒绝政策

IAM 允许政策用于授予权限。借助拒绝政策,您可以设置优先于允许政策的护栏,无论主账号具有哪些角色。通过将拒绝政策与标记结合使用,您可以将这些护栏应用于所选连接,而不是项目中的每个连接。

例如,您可以使用此方法执行以下操作:

  • 允许 AI 智能体或自动化服务账号通过 Developer Connect 读取提交和拉取请求,但禁止其在生产代码库中打开、修改拉取请求或对拉取请求发表评论。
  • 针对一组主账号,阻止其在连接到敏感代码库的连接上执行所有代码库操作,同时保留其对同一项目中其他连接的访问权限。
  • 通过在组织级层创建标记和拒绝政策,在多个项目中应用一组一致的限制。

标签如何应用于 Git 代码库链接

在 Developer Connect 中,您可以将标签附加到连接,但不能直接附加到 Git 代码库链接。

Git 代码库链接是其连接的子资源。当 IAM 针对 Git 代码库链接上的操作评估拒绝政策时,系统会根据链接的有效标记评估条件。有效标记包括附加到父级连接的标记,以及从连接的项目、文件夹和组织继承的标记。

由于 Git 代码库链接会从其连接继承标记,因此本文档中的控制措施适用于每个连接。如果您需要对不同的代码库使用不同的控制措施,请通过不同的连接关联这些代码库,然后分别为每个连接添加标记。

准备工作

  • 确保您有一个 Developer Connect 连接,其中至少有一个关联的 Git 代码库。
  • 确保您知道组织 ID 以及包含连接的项目的项目编号。
  • 如需使用本文档中的命令行示例,请安装并配置 Google Cloud CLI。

所需的角色

如需获得创建标记、将标记附加到连接以及创建拒绝政策所需的权限,请让管理员向您授予组织的以下 IAM 角色:

  • 创建和管理标记键和标记值:Tag Administrator (roles/resourcemanager.tagAdmin)
  • 如需将标记值附加到连接,请执行以下操作:针对标记值的 Tag User (roles/resourcemanager.tagUser) 角色,以及针对连接的 Developer Connect Admin (roles/developerconnect.admin) 角色
  • Deny Admin (roles/iam.denyAdmin)(如需创建、更新和删除拒绝政策)

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

您可以拒绝的权限

您可以拒绝 Git 代码库链接的以下权限。在拒绝政策中,请使用 developerconnect.googleapis.com/gitRepositoryLinks.PERMISSION 格式。

读取代码库数据

权限 允许主账号
developerconnect.googleapis.com/gitRepositoryLinks.fetchCommit 获取提交。
developerconnect.googleapis.com/gitRepositoryLinks.fetchCommitList 列出提交。
developerconnect.googleapis.com/gitRepositoryLinks.diffCommit 获取提交之间的差异。
developerconnect.googleapis.com/gitRepositoryLinks.fetchFileBlame 获取文件的 blame 信息。
developerconnect.googleapis.com/gitRepositoryLinks.fetchPullRequest 获取拉取请求。
developerconnect.googleapis.com/gitRepositoryLinks.fetchPullRequestList 列出拉取请求。
developerconnect.googleapis.com/gitRepositoryLinks.fetchGitRefs 列出分支和标记。

更改代码库数据

权限 允许主账号
developerconnect.googleapis.com/gitRepositoryLinks.openPullRequest 打开拉取请求。
developerconnect.googleapis.com/gitRepositoryLinks.modifyPullRequest 修改拉取请求,例如其标题、说明或状态。
developerconnect.googleapis.com/gitRepositoryLinks.addPullRequestComment 向拉取请求添加评论。
developerconnect.googleapis.com/gitRepositoryLinks.addPullRequestReviewComment 向拉取请求添加审核评论。

访问令牌和 Git 代理

权限 允许主账号
developerconnect.googleapis.com/gitRepositoryLinks.fetchReadToken 获取代码库的只读访问令牌。
developerconnect.googleapis.com/gitRepositoryLinks.fetchReadWriteToken 获取代码库的读写权限访问令牌。
developerconnect.googleapis.com/gitRepositoryLinks.gitProxyRead 通过 Developer Connect 代理从代码库中读取数据。
developerconnect.googleapis.com/gitRepositoryLinks.gitProxyWrite 通过 Developer Connect 代理写入代码库。

如需查看拒绝政策支持的权限的完整列表,请参阅拒绝政策中支持的权限。

创建标记并将其附加到连接

在此示例中,您将创建一个名为 scm-agent-access 的标记键,其标记值为 read-only,然后将该标记值附加到连接。

  1. 创建标记键。以下命令会在您的组织中创建标记键,以便您可以在任何项目的连接上使用该标记键:

    gcloud resource-manager tags keys create scm-agent-access \
        --parent=organizations/ORGANIZATION_ID \
        --description="Controls agent access to Developer Connect repositories"

    将 ORGANIZATION_ID 替换为您的组织 ID。

    您还可以通过将 --parent 设置为 projects/PROJECT_ID,在项目中创建标记键。项目级标记键只能附加到该项目中的资源。

  2. 创建标记值:

    gcloud resource-manager tags values create read-only \
        --parent=ORGANIZATION_ID/scm-agent-access
  3. 将标记值附加到连接:

    gcloud resource-manager tags bindings create \
        --tag-value=ORGANIZATION_ID/scm-agent-access/read-only \
        --parent=//developerconnect.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/connections/CONNECTION_ID \
        --location=LOCATION

    替换以下内容:

    • PROJECT_NUMBER:包含连接的项目的编号。
    • LOCATION:连接的区域,例如 us-central1。
    • CONNECTION_ID:连接的 ID。
  4. 验证该标记是否已附加到连接:

    gcloud resource-manager tags bindings list \
        --parent=//developerconnect.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/connections/CONNECTION_ID \
        --location=LOCATION

如需详细了解如何创建和附加标记,请参阅创建和管理标记。

创建拒绝政策

以下拒绝政策会阻止服务账号在任何连接的 scm-agent-access 标记设置为 read-only 的 Git 代码库链接中打开、修改或评论拉取请求,以及获取读写令牌或通过 Developer Connect 代理进行写入。如果允许政策授予服务账号这些权限,则服务账号仍然可以读取提交和拉取请求。

  1. 创建一个名为 policy.json 的文件,其中包含以下内容:

    {
      "displayName": "Read-only Developer Connect access for agents",
      "rules": [
        {
          "denyRule": {
            "deniedPrincipals": [
              "principal://iam.googleapis.com/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL"
            ],
            "deniedPermissions": [
              "developerconnect.googleapis.com/gitRepositoryLinks.openPullRequest",
              "developerconnect.googleapis.com/gitRepositoryLinks.modifyPullRequest",
              "developerconnect.googleapis.com/gitRepositoryLinks.addPullRequestComment",
              "developerconnect.googleapis.com/gitRepositoryLinks.addPullRequestReviewComment",
              "developerconnect.googleapis.com/gitRepositoryLinks.fetchReadWriteToken",
              "developerconnect.googleapis.com/gitRepositoryLinks.gitProxyWrite"
            ],
            "denialCondition": {
              "title": "Connection is tagged scm-agent-access=read-only",
              "expression": "resource.matchTag('ORGANIZATION_ID/scm-agent-access', 'read-only')"
            }
          }
        }
      ]
    }

    将 SERVICE_ACCOUNT_EMAIL 替换为您要限制的服务账号的电子邮件地址。如需限制其他类型的主账号(例如用户或群组),请参阅主账号标识符。

  2. 创建拒绝政策并将其附加到您的组织:

    gcloud iam policies create scm-agent-read-only \
        --attachment-point=cloudresourcemanager.googleapis.com/organizations/ORGANIZATION_ID \
        --kind=denypolicies \
        --policy-file=policy.json

    您还可以将拒绝政策附加到文件夹或项目。拒绝政策适用于其连接点下的所有资源。

如需详细了解如何创建拒绝政策,请参阅拒绝访问资源。

验证拒绝政策

对标记和拒绝政策的更改具有最终一致性。新的标记绑定或拒绝政策可能需要几分钟才能生效。如需了解详情,请参阅标记更改的影响和访问权限更改传播。

更改传播后,如果被拒绝的主账号在带标记的连接中请求 Git 代码库链接的被拒绝权限,则请求会失败,并显示 HTTP 403 PERMISSION_DENIED 错误。出错提示会指明权限和 Git 代码库链接,并说明 IAM 拒绝政策拒绝了访问权限。例如:

Permission 'developerconnect.gitRepositoryLinks.openPullRequest' denied on resource '//developerconnect.googleapis.com/projects/my-project/locations/us-central1/connections/my-connection/gitRepositoryLinks/my-repo' due to an IAM deny policy.

如果请求的权限未被政策拒绝,或者请求的 Git 代码库链接位于不具有该标记的连接中,则这些请求不受拒绝政策的影响。

如需检查拒绝政策是否适用于主账号和 Git 代码库链接,请使用政策问题排查工具:

gcloud policy-intelligence troubleshoot-policy iam \
    //developerconnect.googleapis.com/projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID/gitRepositoryLinks/GIT_REPOSITORY_LINK_ID \
    --principal-email=SERVICE_ACCOUNT_EMAIL \
    --permission=developerconnect.googleapis.com/gitRepositoryLinks.openPullRequest

解除限制

如需从单个连接中移除限制,请从该连接中删除标记绑定:

gcloud resource-manager tags bindings delete \
    --tag-value=ORGANIZATION_ID/scm-agent-access/read-only \
    --parent=//developerconnect.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/connections/CONNECTION_ID \
    --location=LOCATION

如需从所有连接中移除限制,请删除拒绝政策:

gcloud iam policies delete scm-agent-read-only \
    --attachment-point=cloudresourcemanager.googleapis.com/organizations/ORGANIZATION_ID \
    --kind=denypolicies

限制

  • 代码是按连接附加的。您可以将标记附加到连接,但不能附加到 Git 代码库链接。连接中的所有 Git 代码库链接都会共享连接的标记。
  • 拒绝条件仅支持标记。拒绝规则中的条件只能使用标记函数,例如 resource.matchTag() 和 resource.hasTagKey()。您无法根据代码库名称或其他资源属性编写拒绝条件。如需了解详情,请参阅拒绝条件。
  • 标记键必须具有命名空间。在 resource.matchTag() 中,通过标记键的命名空间名称(例如 ORGANIZATION_ID/scm-agent-access 或 PROJECT_ID/scm-agent-access)而不是其简称来标识标记键。
  • 更改需要一段时间才能生效。新的标记绑定、更改的标记值和拒绝政策不会立即生效,移除标记也不会立即恢复访问权限。每项更改都需要几分钟时间,请先测试您的配置,然后再依赖它。
  • 有效标记会列在连接上。如需查看应用于 Git 代码库链接的标签,请列出其父级连接的有效标签。

后续步骤