Artifact Registry 是一项支持软件包和其他格式的通用软件包管理服务。了解如何从 Container Registry 过渡,以便更灵活地控制您的工件。

配置访问权限控制

本页面介绍控制对 Container Registry 的访问权限的权限。

配置权限后,您便可以为用于推送和拉取映像的 Docker 客户端配置身份验证

如果您使用 Container Analysis 来处理容器元数据(例如映像中发现的漏洞),请参阅 Container Analysis 文档,了解如何授予查看或管理元数据的访问权限。

准备工作

验证您拥有管理用户的权限。您必须拥有以下任一角色中的权限:

  • Project IAM Admin (roles/resourcemanager.projectIamAdmin)
  • Security Admin (roles/iam.securityAdmin)

除了授予这些角色,您还可以使用具有相同权限的自定义角色预定义角色

权限和角色

与 Container Registry 进行交互的所有用户、服务帐号和其他身份都必须具有 Cloud Storage 的相应 Identity and Access Management (IAM) 权限。

  • 通常访问 Container Registry 的 Google Cloud 服务会配置同一 Google Cloud 项目中的注册表的默认权限。如果默认权限不能满足您的需求,您必须配置适当的权限。
  • 对于其他身份,您必须配置所需的权限。

下表介绍了 Container Registry 操作所需的权限和角色。

操作 权限 角色 权限范围
  • 将第一个映像推送到注册表主机,以向项目添加注册表
  • 推送(写入)和拉取(读取)映像

storage.buckets.create

storage.buckets.delete

storage.buckets.get

storage.buckets.list

storage.buckets.update

storage.objects.create

storage.objects.delete

storage.objects.get

storage.objects.list

storage.objects.update

Storage Admin (roles/storage.admin) 在项目级层配置
为项目中的现有注册表主机推送(写入)和拉取(读取)映像

storage.objects.create

storage.objects.delete

storage.objects.get

storage.objects.list

storage.objects.update

Storage Object Admin (roles/storage.objectAdmin) 在现有注册表的存储分区上配置
拉取映像(只读)

storage.objects.get

storage.objects.list

Storage Object Viewer (roles/storage.objectViewer) 在现有注册表的存储分区上配置

Cloud Build 对同一 Google Cloud 项目中的注册表拥有 Storage Admin 角色中的权限。因此,如果您使用 Cloud Build 构建映像并将其推送到 Container Registry,则无论您是将映像推送到现有注册表,还是使用初始映像推送创建新注册表都无关紧要。

但是,如果您使用 Docker 或其他工具创建映像并将其推送到注册表,请考虑使用具有更高级 Storage Admin 角色的帐号将注册表添加到项目中,然后向需要推送和拉取映像的其他帐号授予 Storage Object Admin 和 Storage Object Viewer 角色。

如需详细了解 Cloud Storage 角色和权限,请参阅 Cloud Storage 文档

授予 IAM 权限

Container Registry 使用 Cloud Storage 存储分区作为容器映像的底层存储空间。您可以通过授予注册表存储分区的权限来控制对映像的访问权限。

  • 第一次将映像推送到主机时,系统会将注册表及其存储分区添加到项目中。例如,第一次推送到 gcr.io/my-project 时,系统会将 gcr.io 注册表主机添加到项目 my-project,并为注册表创建一个存储分区。

    这意味着,具有项目级 Storage Admin 权限或 Owner 角色的 Google Cloud 帐号必须先推送初始映像,然后您才能配置注册表存储分区以供其他用户访问。

  • 在初始映像推送到注册表主机后,您可以授予注册表存储分区的权限以控制对注册表中映像的访问权限:

    • Storage Object Admin:推送和拉取
    • Storage Object Viewer:仅拉取

确定注册表的存储分区

存储映像的存储分区的名称采用 BUCKET-NAME 格式:

  • artifacts.PROJECT-ID.appspot.com(适用于推送到主机 gcr.io 中注册表的映像)或
  • STORAGE-REGION.artifacts.PROJECT-ID.appspot.com

其中

  • PROJECT-ID 是您的 Google Cloud Console 项目 ID
  • STORAGE-REGION 是存储分区的位置:
    • us(适用于主机 us.gcr.io 中的注册表)
    • eu(适用于主机 eu.gcr.io 中的注册表)
    • asia(适用于主机 asia.gcr.io 中的注册表)

您可以使用 Google Cloud Consolegsutil 命令行工具授予对存储分区的权限。

授予权限

  1. 如果项目中还没有注册表主机,则在项目级层拥有 Storage Admin 或 Owner 角色的帐号必须将第一个映像推送到注册表。这会为注册表主机创建存储分区。Cloud Build 拥有在同一项目中执行初始映像推送所需的权限。

    如果您要使用其他工具推送映像,请验证您用于向 Container Registry 进行身份验证的 Google Cloud 帐号的权限。

    如需详细了解如何使用 Docker 推送初始映像,请参阅添加注册表

  2. 在使用 Container Registry 的项目中,授予注册表主机使用的 Cloud Storage 存储分区的适当权限。

    控制台

    1. 转到 Cloud Console 中的 Cloud Storage 页面
    2. 点击存储分区的 artifacts.PROJECT-ID.appspot.comSTORAGE-REGION.artifacts.PROJECT-ID.appspot.com 链接。

      PROJECT-ID 替换为托管 Container Registry 的项目的 Google Cloud 项目 ID,将 STORAGE-REGION 替换为托管映像的注册表的多区域asiaeuus)。

    3. 选择权限标签。

    4. 点击添加

    5. 成员字段中,输入需要访问权限的帐号的电子邮件地址(以英文逗号分隔)。此电子邮件地址可以是以下各项之一:

      • Google 帐号(例如 someone@example.com
      • Google 群组(例如 my-developer-team@googlegroups.com
      • IAM 服务帐号

        请参阅通常访问注册表的 Google Cloud 服务的列表,以查找关联服务帐号的电子邮件地址。如果服务不在 Container Registry 所在项目中运行,请确保您使用的是其他项目中的服务帐号的电子邮件地址。

    6. 选择角色下拉菜单中,选择 Cloud Storage 类别,然后选择适当的权限。

      • Storage Object Viewer:仅拉取映像
      • Storage Object Admin:推送和拉取映像
    7. 点击添加

    gsutil

    1. 运行以下命令列出项目中的存储分区:

      gsutil ls
      

      响应如下例所示:

      gs://[BUCKET_NAME1]/
      gs://[BUCKET_NAME2]/
      gs://[BUCKET_NAME3]/ ...
      
    2. 在 shell 或终端窗口中运行以下命令:

      gsutil iam ch TYPE:EMAIL-ADDRESS:ROLE gs://BUCKET_NAME
      

      其中

      • TYPE 可以是以下各项之一:
        • serviceAccount(如果 EMAIL-ADDRESS 指定服务帐号)。
        • user(如果 EMAIL-ADDRESS 是 Google 帐号)。
        • group(如果 EMAIL-ADDRESS 是 Google 群组)。
      • EMAIL-ADDRESS 可以是下列选项之一:

        • Google 帐号(例如 someone@example.com
        • Google 群组(例如 my-developer-team@googlegroups.com
        • IAM 服务帐号

          请参阅通常访问注册表的 Google Cloud 服务的列表,以查找关联服务帐号的电子邮件地址。如果服务不在 Container Registry 所在项目中运行,请确保您使用的是其他项目中的服务帐号的电子邮件地址。

      • ROLE 是您要授予的 Cloud Storage 角色。

        • objectViewer:拉取映像
        • objectAdmin:推送和拉取映像
      • BUCKET_NAME 是格式为 artifacts.PROJECT-ID.appspot.comSTORAGE-REGION.artifacts.PROJECT-ID.appspot.com 的 Cloud Storage 存储分区的名称

    例如,以下命令会向服务帐号 my-account@my-project.iam.gserviceaccount.com 授予在存储分区 my-example-bucket 中推送和拉取映像的权限:

    gsutil iam ch \
      serviceAccount:my-account@my-project.iam.gserviceaccount.com:objectAdmin \
      gs://my-example-bucket
    

    gsutil iam ch 命令会更改托管镜像仓库的存储分区的 IAM 权限。如需查看其他示例,请参阅 gsutil 文档

  3. 如果您要为将映像推送到 Container Registry 的 Compute Engine 虚拟机或 GKE 节点配置访问权限,请参阅配置虚拟机和集群,了解其他配置步骤。

配置对映像的公共访问权限

如果主机位置的底层存储分区可公开访问,则 Container Registry 便可公开访问。在项目范围内,每个主机位置中的所有映像要么都公开,要么都不公开。 不能仅公开提供一个项目主机中的特定映像。如果您想要公开特定映像,请按以下所述操作:

  • 确保将这些映像保存在您公开的一个单独主机位置中,或者
  • 创建一个新项目来存储可公开访问的映像。

如需公开提供容器映像,请按照以下步骤将底层存储分区设为可公开访问:

控制台

  1. 确保已将映像推送到 Container Registry,以使系统创建底层存储分区。

  2. 打开 Cloud Console 中的 Container Registry 页面。

    打开 Container Registry 页面

  3. 在左侧面板中,点击设置

  4. 设置页面的公共访问权限下,将公开范围切换为公开不公开。此设置用于控制对底层存储分区的访问。

    如果主机的公开范围设为公开,您的 Google Cloud 项目中位于该主机位置的所有映像都可公开访问。

gsutil

  1. 确保已将映像推送到 Container Registry,以使系统创建底层存储分区。

  2. 找到该注册表对应的 Cloud Storage 存储分区名称。为此,请列出各存储分区:

    gsutil ls
    

    您的 Container Registry 存储分区网址将列为 gs://artifacts.PROJECT-ID.appspot.comgs://STORAGE-REGION.artifacts.PROJECT-ID.appspot.com,其中:

    • PROJECT-ID 是您的 Google Cloud Console 项目 ID网域级项目将域名作为项目 ID 的一部分。
    • STORAGE-REGION 是存储分区的位置:
      • us(适用于主机 us.gcr.io 中的注册表)
      • eu(适用于主机 eu.gcr.io 中的注册表)
      • asia(适用于主机 asia.gcr.io 中的注册表)
  3. 运行以下命令,将 Container Registry 的存储分区设为可公开访问。此命令将使存储分区中的所有映像都可公开访问。

    gsutil iam ch allUsers:objectViewer gs://BUCKET-NAME
    

    其中:

    • gs://BUCKET-NAME 是 Container Registry 的存储分区网址

如果 Container Registry 可公开访问,那么任何人都可以拉取其映像。如需查看相关说明,请参阅从注册表中拉取映像

撤消权限

按照以下步骤操作以撤消 IAM 权限。

控制台

  1. 访问 Cloud Console 中的 Cloud Storage 页面
  2. 点击存储分区的 artifacts.PROJECT-ID.appspot.comSTORAGE-REGION.artifacts.PROJECT-ID.appspot.com 链接。其中,PROJECT-ID 是托管 Container Registry 的项目的 Google Cloud 项目 ID,而 STORAGE-REGION 是托管映像的注册表的多区域asiaeuus)。

  3. 选择权限标签页。

  4. 点击要移除的任何成员旁边的垃圾箱图标。

gsutil

在 shell 或终端窗口中运行以下命令:

gsutil iam ch -d MEMBER gs://BUCKET-NAME

其中:

  • MEMBER 可以是以下各项之一:
    • user:EMAIL-ADDRESS(适用于 Google 帐号)
    • serviceAccount:EMAIL-ADDRESS(适用于 IAM 服务帐号)
    • group:EMAIL-ADDRESS(适用于 Google 群组)。
    • allUsers(用于撤消公开访问权限)
  • BUCKET-NAME 是所需存储分区的名称

与 Google Cloud 服务集成

对于大多数 Google Cloud 服务帐号,配置对注册表的访问权限只需授予适当的 IAM 权限。

Google Cloud 服务的默认权限

Cloud Build 或 Google Kubernetes Engine 等 Google Cloud 服务使用默认服务帐号或 Google 管理的服务帐号与同一项目中的资源进行交互。

在下列情况下,您必须自行配置或修改权限:

  • Google Cloud 服务与 Container Registry 属于不同的项目。
  • 默认权限不能满足您的需求。例如,默认的 Compute Engine 服务帐号对同一项目中的存储空间具有只读权限。如果要将虚拟机中的映像推送到注册表,您必须修改虚拟机服务帐号的权限,或使用具有存储空间写入权限的帐号向注册表进行身份验证。
  • 您使用自定义服务帐号与 Container Registry 进行交互

以下服务帐号通常访问 Container Registry。服务帐号的电子邮件地址包含运行服务的项目的 Google Cloud 项目 ID 或项目编号

服务 服务帐号 电子邮件地址 权限
App Engine 柔性环境 App Engine 默认服务帐号 PROJECT-ID@appspot.gserviceaccount.com Editor 角色,可以读取和写入存储空间
Compute Engine Compute Engine 默认服务帐号 PROJECT-NUMBER-compute@developer.gserviceaccount.com Editor 角色,仅拥有对存储空间的只读权限
Cloud Build Cloud Build 服务帐号 PROJECT-NUMBER@cloudbuild.gserviceaccount.com 默认权限包括创建存储分区以及读写存储空间。
Cloud Run Compute Engine 默认服务帐号
修订版本的默认运行时服务帐号。
PROJECT-NUMBER-compute@developer.gserviceaccount.com Editor 角色,仅拥有对存储空间的只读权限
GKE Compute Engine 默认服务帐号
节点的默认服务帐号。
PROJECT-NUMBER-compute@developer.gserviceaccount.com Editor 角色,仅拥有对存储空间的只读权限

配置虚拟机和集群以推送映像

Compute Engine 以及任何使用 Compute Engine 的 Google Cloud 服务都将 Compute Engine 默认服务帐号用作默认身份。

IAM 权限和访问权限范围会影响虚拟机读写存储空间的能力。

  • IAM 权限决定了是否能够访问资源。
  • 对于通过 gcloud 工具和虚拟机实例上的客户端库发出的请求,访问权限范围决定了这些请求的默认 OAuth 范围。因此,在使用应用默认凭据进行身份验证时,访问权限范围可以进一步限制对 API 方法的访问。
    • 如需拉取私有映像,虚拟机服务帐号必须具有映像存储分区的 read 权限。
    • 如需推送私有映像,虚拟机服务帐号必须具有映像存储分区的 read-writecloud-platformfull-control 访问权限范围。

默认情况下,Compute Engine 默认服务帐号具有 Editor 角色,其中包含为大多数 Google Cloud 服务创建和更新资源的权限。但是,对于与虚拟机关联的默认服务帐号或自定义服务帐号,存储分区的默认访问权限范围都是只读。这意味着,默认情况下,虚拟机无法推送映像。

如果您只打算将映像部署到 Compute Engine 和 GKE 等环境,则无需修改访问权限范围。如果您希望在这些环境中运行将映像推送到注册表的应用,则必须执行其他配置。

以下设置需要更改 IAM 权限或访问权限范围配置。

从虚拟机或集群推送映像
如果要推送映像,虚拟机实例服务帐号必须具有 storage-rw 范围,而不是 storage-ro
虚拟机和 Container Registry 位于不同的项目中
您必须向服务帐号授予 IAM 权限以访问 Container Registry 使用的存储分区。
在虚拟机上运行 gcloud 命令
服务帐号必须具有 cloud-platform 范围。此范围授予推送和拉取映像以及运行 gcloud 命令的权限。

以下部分介绍了配置范围的步骤。

为虚拟机配置范围

如需在创建虚拟机时设置访问权限范围,请使用 --scopes 选项。

gcloud compute instances create INSTANCE --scopes=SCOPE

其中

  • INSTANCE 是虚拟机实例名称。
  • SCOPE 是您要为虚拟机服务帐号配置的范围:
    • 拉取映像:storage-ro
    • 拉取并推送映像:storage-rw
    • 如需拉取并推送映像,请运行 gcloud 命令:cloud-platform

如需更改现有虚拟机实例的范围,请执行以下操作:

使用 --scopes 选项设置访问权限范围。

  1. 停止虚拟机实例。请参阅停止实例

  2. 使用以下命令更改访问权限范围。

    gcloud compute instances set-service-account INSTANCE --scopes=SCOPE
    

    其中

    • INSTANCE 是虚拟机实例名称。
    • SCOPE 是您要为虚拟机服务帐号配置的范围:
      • 拉取映像:storage-ro
      • 拉取并推送映像:storage-rw
      • 如需拉取并推送映像,请运行 gcloud 命令:cloud-platform
  3. 重启虚拟机实例。请参阅启动已停止的实例

如果要为虚拟机使用自定义服务帐号而不是默认服务帐号,则您可以在创建虚拟机修改虚拟机设置时指定要使用的服务帐号和访问权限范围。

为 Google Kubernetes Engine 集群配置范围

默认情况下,创建新的 GKE 集群时,系统会为其分配针对 Cloud Storage 存储分区的只读权限。

如需在创建 Google Kubernetes Engine 集群时设置 read-write 存储范围,请使用 --scopes 选项。例如,以下命令会创建一个范围为 bigquerystorage-rwcompute-ro 的集群:

gcloud container clusters create example-cluster \
--scopes=bigquery,storage-rw,compute-ro

如需详细了解创建新集群时可设置的范围,请参阅 gcloud container clusters create 命令的文档。

Container Registry 服务帐号

Container Registry Service Agent 是一个 Google 管理的服务帐号,该帐号在与 Google Cloud 服务交互时会代表 Container Registry 执行操作。如果您在 2020 年 10 月 5 日之后启用 Container Registry API,则该服务帐号具有所需的最小权限集。服务帐号之前具有 Editor 角色。如需详细了解该帐号以及如何修改其权限,请参阅 Container Registry 服务帐号

亲自尝试

如果您是 Google Cloud 新手,请创建一个帐号来评估 Container Registry 在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。

免费试用 Container Registry