Container Registry 和 Artifact Registry 使用不同的 Identity and Access Management 角色来控制对注册表中存储的容器映像的访问权限。
为帮助您从 Container Registry 转换到 Artifact Registry,您可以运行以下 Google Cloud CLI 命令:
- 确定适用于存储 Container Registry 映像的 Cloud Storage 存储桶的允许政策
- 返回具有类似 Artifact Registry 角色的政策,以便您可以向现有 Container Registry 用户授予对 Artifact Registry 代码库的访问权限。
该命令使用 IAM 政策分析器来分析 IAM 允许政策。
准备工作
启用 Cloud Asset API。
您必须在要分析现有允许政策的项目或组织中启用该 API。
安装并初始化 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 Administrator
如需详细了解如何授予角色,请参阅管理访问权限。
这些预定义角色包含分析允许政策以及授予对 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 角色,请参阅角色映射。
如需使用角色映射工具,请执行以下操作:
运行映射工具:
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-project
中gcr.io
的存储桶,以查找直接应用于存储桶或从父级组织 ID101231231231
及其后代继承的允许政策。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
从政策文件中移除 Container Registry 服务代理的行,因为该服务帐号不需要访问您的 Artifact Registry 代码库。服务代理电子邮件地址的后缀为
containerregistry.iam.gserviceaccount.com
。在上一步的示例政策中,Container Registry 服务代理所在的行是:
- serviceAccount:service-1231231231231@containerregistry.iam.gserviceaccount.com
查看其他角色绑定,确认它们是否合适。
对于某些主帐号,Artifact Registry 具有额外的预定义角色,您可能需要考虑使用这些角色。例如,Artifact Registry Create-on-push Repository Administrator 允许主账号在 Artifact Registry 中创建 gcr.io 代码库,但不允许他们创建其他 Artifact Registry 代码库。
为政策文件中缺少的任何主账号添加角色绑定。
返回的政策文件中可能缺少以下主账号:
- 具有自定义角色的主账号以及这些自定义角色不具备该工具用于映射角色的权限集。
- 被授予对父级文件夹或组织的访问权限的主账号(如果您无权查看父级文件夹或组织)。
将政策绑定应用于您的 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
如果要将角色绑定应用于更高级别的资源,请修改包含要添加的绑定的现有项目、文件夹或组织政策。
角色映射
下表显示了应根据现有 Container Registry 用户拥有的 Cloud Storage 权限,向其授予哪些预定义的 Artifact 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 Repository Administrator |
storage.buckets.get storage.objects.get storage.objects.list storage.objects.create storage.buckets.create |
Artifact Registry Administrator |