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

本文档介绍了如何将 Container Registry 角色映射到 Artifact Registry 角色,并将其应用于 Artifact Registry 代码库。您也可以使用自动迁移工具完成相同的步骤。

Container Registry 和 Artifact Registry 使用不同的 Identity and Access Management (IAM) 角色来控制对存储在注册库中的容器映像的访问权限。

为帮助您从 Container Registry 迁移到 Artifact Registry,您可以运行以下 Google Cloud CLI 命令:

  • 确定适用于存储 Container Registry 映像的 Cloud Storage 存储分区的许可政策
  • 返回具有类似 Artifact Registry 角色的政策,以便您向现有 Container Registry 用户授予对 Artifact Registry 代码库的访问权限。

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

准备工作

  1. 创建 Artifact Registry 仓库。如果您选择了手动方法进行转换,请按照相应步骤手动迁移到 Artifact Registry 中的 gcr.io 仓库手动迁移到 pkg.dev 仓库

  2. Enable the Cloud Asset API.

    Enable the API

    您必须在要分析现有许可政策的项目中启用该 API。

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

    gcloud components update
    

所需的角色

如需获得分析许可政策和授予对 Artifact Registry 代码库的访问权限所需的权限,请让管理员向您授予您要分析权限的项目、文件夹或组织的以下 IAM 角色:

  • 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 代码库的访问权限,您需要具备以下权限:

  • 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 角色。如需将 Cloud Storage 权限与 Artifact Registry 角色进行比较,请参阅角色映射

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

  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 格式)。

    以下示例命令会分析项目 my-projectgcr.io 的存储分区,以查找直接应用于该存储分区或从父级组织 ID 101231231231 及其子级继承的允许政策。

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

    该命令会根据存储分区的现有许可政策,返回一个包含 Artifact Registry 角色绑定的 YAML 格式政策文件。如果存储分区的父级项目位于某个组织中,则政策文件会包含在文件夹级别或组织级别获得访问权限的主账号。

    例如,以下示例包含以下 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 Create-on-push Repository Administrator 角色允许主账号在 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-projectgcr-io-policy.yaml 文件中的政策应用于 us 多区域中名为 gcr.io 的代码库:

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

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

角色映射

下表显示了应根据现有 Container Registry 用户拥有的 Cloud Storage 权限,向他们授予哪些预定义 Artifact Registry 角色。

角色中所需的权限 Artifact Registry 角色
storage.objects.get
storage.objects.list
Artifact Registry Reader
storage.buckets.get
storage.objects.get
storage.objects.list
storage.objects.create
Artifact Registry Writer
storage.buckets.get
storage.objects.get
storage.objects.list
storage.objects.create
storage.objects.delete
Artifact Registry Repository Administrator
storage.buckets.get
storage.objects.get
storage.objects.list
storage.objects.create
storage.buckets.create
Artifact Registry Administrator