将 IAM 角色从 Container Registry 映射到 Artifact Registry

Container Registry 和 Artifact Registry 使用不同的 Identity and Access Management 角色来控制 访问存储在注册表中的容器映像。

为了帮助您从 Container Registry 过渡到 Artifact Registry,您可以 Google Cloud CLI 命令,该命令可执行以下操作:

  • 标识应用于 Cloud Storage 存储桶的允许政策 用于存储 Container Registry 映像
  • 返回具有类似 Artifact Registry 角色的政策,以便您可以授予 现有 Container Registry 用户对 Artifact Registry 代码库的访问权限。

该命令使用 IAM 政策分析器 分析 IAM 允许政策。

准备工作

  1. 启用 Cloud Asset API。

    启用 API

    您必须在所需的项目或组织中启用此 API 来分析现有的允许政策

  2. 安装并初始化 gcloud CLI。对于 现有安装,请使用以下命令更新到最新版本:

    gcloud components update
    

所需的角色

为了获得分析允许政策以及授予对 Artifact Registry 代码库的访问权限所需的权限, 请让管理员向您授予 针对您要 分析权限:

  • Cloud Asset Viewer (roles/cloudasset.viewer)
  • 如需分析使用自定义 IAM 角色的政策,请执行以下操作: Role Viewer (roles/iam.roleViewer)
  • 如需使用 Google Cloud CLI 分析政策,请执行以下操作: Service Usage Consumer (roles/serviceusage.serviceUsageConsumer)
  • 如需授予针对 Artifact Registry 代码库的角色,请执行以下操作: Artifact Registry 管理员

如需详细了解如何授予角色,请参阅管理访问权限

这些预定义角色包含 分析允许政策以及授予对 Artifact Registry 代码库的访问权限所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

如需分析允许政策并授予对 Artifact Registry 代码库的访问权限,需要以下权限:

  • cloudasset.assets.analyzeIamPolicy
  • cloudasset.assets.searchAllResources
  • cloudasset.assets.searchAllIamPolicies
  • 如需分析使用自定义 IAM 角色的政策,请执行以下操作: iam.roles.get
  • 如需使用 Google Cloud CLI 分析政策,请执行以下操作: serviceusage.services.use
  • 如需授予针对 Artifact Registry 代码库的角色,请执行以下操作: artifactregistry.repositories.setIamPolicy

您也可以使用自定义角色或其他预定义角色来获取这些权限。

使用地图绘制工具

映射工具会检查指定 Container Registry 的允许政策 主机名,例如 gcr.io

该工具会检查预定义 Cloud Storage 角色,并将其映射到 Artifact Registry 角色。比较 有关 Artifact Registry 角色的 Cloud Storage 权限,请参阅 角色映射

如需使用角色映射工具,请执行以下操作:

  1. 运行映射工具:

    gcloud beta artifacts docker upgrade print-iam-policy HOSTNAME \
        --project=PROJECT_ID > POLICY_FILENAME
    

    替换以下值:

    • HOSTNAME 是所需的 Container Registry 主机名 工具分析:

      • gcr.io
      • asia.gcr.io
      • eu.gcr.io
      • us.gcr.io
    • PROJECT_ID 是 Google Cloud 项目的 ID 与您正在分析的注册表主机关联的凭据。

    • POLICY_FILE 是政策的文件名,采用 YAML 格式。 该工具将返回的内容

    以下示例命令会分析 Google Cloud 中 gcr.io 的存储桶 项目 my-project,用于直接应用于 或者继承自父级组织 ID“101231231231”和 其后代。

    gcloud beta artifacts docker upgrade print-iam-policy gcr.io \
        --project=my-project > gcr-io-policy.yaml
    

    该命令会返回 YAML 格式的具有 Artifact Registry 角色的政策文件 绑定数量。如果 存储桶的父项目位于组织中,则政策 文件中包含拥有该文件夹或 组织级别。

    例如,以下示例包含用于以下各项的 Artifact Registry 角色绑定:

    • Cloud Build、Compute Engine 和 Container Registry 服务代理。服务代理代表 Google Cloud 服务。
    • 用户账号 user@example.com
    • 用户代管式服务账号 deploy@my-project.iam.gserviceaccount.com.
    bindings:
    - members:
      - service-3213213213213@gcp-sa-cloudbuild.iam.gserviceaccount.com
      - user:user@example.com
      role: roles/artifactregistry.repoAdmin
    - members:
      - serviceAccount:deploy@my-project.iam.gserviceaccount.com
      - serviceAccount:service-1231231231231@@compute-system.iam.gserviceaccount.com
      - serviceAccount:service-1231231231231@containerregistry.iam.gserviceaccount.com
      role: roles/artifactregistry.reader
    
  2. 从政策中移除 Container Registry 服务代理的行 文件,因为该服务账号不需要访问您的 Artifact Registry 代码库服务代理电子邮件地址的后缀为 containerregistry.iam.gserviceaccount.com.

    在上一步的示例政策中,包含 Container Registry 服务代理:

    - serviceAccount:service-1231231231231@containerregistry.iam.gserviceaccount.com
    
  3. 查看其他角色绑定,确认它们是否合适。

    Artifact Registry 拥有其他预定义角色,您可能需要 考虑的因素。例如 Artifact Registry “推送时创建”代码库管理员允许主账号创建 gcr.io 代码库,但不允许其创建 其他 Artifact Registry 代码库

  4. 为政策文件中缺少的任何主账号添加角色绑定。

    返回的政策文件中可能缺少以下主账号:

    • 拥有自定义角色的主账号,而这些自定义角色没有 工具用于映射角色的权限集。
    • 在以下情形下被授予对父级文件夹或组织的访问权限的主账号 您无权查看父级文件夹或组织。
  5. 将政策绑定应用于您的 Artifact Registry 代码库。

    gcloud artifacts repositories set-iam-policy REPOSITORY FILENAME \
        --project=PROJECT_ID \
        --location=LOCATION
    

    替换以下值:

    • REPOSITORY 是代码库的名称。
    • POLICY_FILENAME 是您配置的政策文件的名称, 将应用于代码库
    • PROJECT_ID 是项目 ID。
    • LOCATION 是代码库的单区域或多区域位置

    以下示例针对项目 my-project 将政策应用于 将文件 gcr-io-policy.yaml 复制到 us 中名为 gcr.io 的仓库中 多区域:

    gcloud artifacts repositories set-iam-policy gcr.io gcr-io-policy.yaml \
        --project=my-project \
        --location=us
    

    如果要将角色绑定应用于更高级别的资源,请修改 现有项目、文件夹或组织政策 您要添加的绑定关系。

角色映射

下表显示了应授予哪些预定义的 Artifact Registry 角色 现有的 Container Registry 用户 权限。

角色所需的权限 Artifact Registry 角色
storage.objects.get
storage.objects.list
Artifact Registry 读取者
storage.buckets.get
storage.objects.get
storage.objects.list
storage.objects.create
Artifact Registry 写入者
storage.buckets.get
storage.objects.get
storage.objects.list
storage.objects.create
storage.objects.delete
Artifact Registry 代码库管理员
storage.buckets.get
storage.objects.get
storage.objects.list
storage.objects.create
storage.buckets.create
Artifact Registry 管理员