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 允许政策。
准备工作
启用 Cloud Asset API。
您必须在所需的项目或组织中启用此 API 来分析现有的允许政策
安装并初始化 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 权限,请参阅 角色映射。
如需使用角色映射工具,请执行以下操作:
运行映射工具:
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
从政策中移除 Container Registry 服务代理的行 文件,因为该服务账号不需要访问您的 Artifact Registry 代码库服务代理电子邮件地址的后缀为
containerregistry.iam.gserviceaccount.com
.在上一步的示例政策中,包含 Container Registry 服务代理:
- serviceAccount:service-1231231231231@containerregistry.iam.gserviceaccount.com
查看其他角色绑定,确认它们是否合适。
Artifact Registry 拥有其他预定义角色,您可能需要 考虑的因素。例如 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
如果要将角色绑定应用于更高级别的资源,请修改 现有项目、文件夹或组织政策 您要添加的绑定关系。
角色映射
下表显示了应授予哪些预定义的 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 管理员 |