配置访问权限控制

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

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

常规访问权限要求

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

对于 Compute Engine 虚拟机(包括 Google Kubernetes Engine 集群中的虚拟机)使用的服务帐号,访问权限取决于 IAM 权限和访问权限范围。

IAM 权限

IAM 权限决定谁可以访问资源。与 Container Registry 进行交互的所有用户、服务帐号和其他身份都必须具有相应的 Cloud Storage 权限。

默认情况下,Google Cloud 使用默认服务帐号与同一项目中的资源进行交互。例如,当 Container Registry 位于同一项目中时,Cloud Build 服务帐号可以推送和拉取映像。

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

  • 您使用一个项目中的服务帐号访问另一个项目中的 Container Registry
  • 您使用的是默认服务帐号,该帐号拥有对存储空间的只读权限,但您希望能够拉取和推送映像
  • 您使用自定义服务帐号与 Container Registry 进行交互

虚拟机和集群的访问权限范围

对于与 Compute Engine 虚拟机(包括 GKE 集群中的虚拟机)关联的服务帐号,存储空间的访问权限取决于 IAM 权限和配置的存储空间访问权限范围

Compute Engine 默认服务帐号配置为拉取虚拟机所在项目中的映像。如果您需要虚拟机或 GKE 集群来拉取映像或与其他项目中的 Container Registry 进行交互,请参阅将 Container Registry 与 Google Cloud 搭配使用

配置 IAM 权限

Container Registry 使用 Cloud Storage 存储分区作为容器映像的底层存储空间。您可以通过向用户、群组、服务帐号或其他身份授予相应的 Cloud Storage 权限来控制映像的访问权限。

在项目级层授予的 Cloud Storage 权限适用于项目中的所有存储分区,而不仅仅是 Container Registry 使用的存储分区。如需配置特定于 Container Registry 的权限,请授予对注册表使用的存储分区的权限。Container Registry 会忽略对存储分区中的各个对象设置的权限。

虽然您还可以使用项目级层角色 OwnerEditorViewer 授予访问权限,但 Cloud Storage 角色可让您应用最小权限安全原则,以便用户和服务帐号仅拥有所需的权限。

与 Google Cloud 进行交互的 Google Cloud 产品和应用使用服务帐号与 Container Registry 进行交互。以下注意事项适用于服务帐号访问权限:

  • 默认情况下,部分常见集成的服务帐号会配置为访问同一项目中的 Container Registry。例如,默认情况下,Cloud Build 服务帐号可以推送和拉取同一项目中的映像。
  • 如果服务帐号需要访问其他项目中的 Container Registry,您必须授予所需的权限以便访问项目中的 Container Registry。
  • 虚拟机实例(包括 Google Kubernetes Engine 集群中的实例)必须配置正确的存储空间访问权限范围,以便推送或拉取映像。 默认情况下,当 Container Registry 位于同一项目中时,虚拟机可以拉取映像。

权限和角色

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

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

操作 权限 角色 角色名称
推送(读取和写入)

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

roles/storage.admin Storage Admin
拉取(只读)

storage.objects.get

storage.objects.list

roles/storage.objectViewer Storage Object Viewer

授予 IAM 权限

授予对 Container Registry 使用的存储分区的权限。

授予权限

  1. 如果项目中尚不存在 Container Registry 主机位置(gcr.io、asia.gcr.io、eu.gcr.io、us.gcr.io),则拥有 Owner、Editor 或 Storage Admin 权限的用户必须通过将映像推送到主机来建立存储分区。
  2. 在包含 Container Registry 的项目中,请授予对主机名使用的 Cloud Storage 存储分区的相应权限。

    存储映像的存储分区的名称采用 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. 访问 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 服务帐号
      • 另一个项目的 Compute Engine 默认服务帐号。默认情况下,Google Kubernetes Engine 使用此帐号来拉取容器映像集群。该帐号采用 PROJECT-NUMBER-compute@developer.gserviceaccount.com 格式,其中 PROJECT-NUMBER 是运行 Google Kubernetes Engine 集群的项目的 Google Cloud 项目编号
    6. 选择角色下拉菜单中,选择存储类别,然后选择适当的权限。

      • 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 服务帐号
        • 另一个项目的 Compute Engine 默认服务帐号。默认情况下,Google Kubernetes Engine 使用此帐号来拉取容器映像集群。该帐号采用 PROJECT_NUMBER-compute@developer.gserviceaccount.com 格式,其中 PROJECT_NUMBER 是运行 Google Kubernetes Engine 集群的项目的 Google Cloud 项目编号
      • ROLE 是您要授予的 Cloud Storage 角色。
        • objectViewer:拉取映像
        • objectAdmin:推送和拉取映像
      • BUCKET_NAME 是格式为 artifacts.PROJECT-ID.appspot.comSTORAGE-REGION.artifacts.PROJECT-ID.appspot.com 的 Cloud Storage 存储分区的名称

    gsutil iam ch 命令会更改托管镜像仓库的存储分区的 IAM 权限。向某帐号授予 objectViewer 权限后,该帐号便可从注册表中拉取映像。

    如需详细了解该命令,请参阅 gsutil iam 文档。

  3. 默认情况下,Compute Engine 和 Google Kubernetes Engine 配置了相应的权限,可从位于同一项目的 Container Registry 中拉取映像。 如果您对这些集成有其他要求,请参阅与 Google Cloud 服务集成

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

如果主机位置的底层存储分区可公开访问,则 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 服务集成

默认情况下,部分常见集成的服务帐号会配置访问权限,以在同一项目中拉取或拉取和推送映像。访问权限取决于 IAM 权限,如果服务帐号连接到其他项目中的 Container Registry,则您只需要配置权限

与 Compute Engine 虚拟机实例(包括 GKE 集群中的虚拟机)关联的服务帐号具有额外要求。虚拟机对存储空间的访问权限取决于授予的 IAM 权限和存储空间访问权限范围

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

默认情况下,默认 Compute Engine 的默认服务帐号对同一项目中的资源以及对 read-only 存储空间访问权限范围具有编辑者权限。read-only 范围限制虚拟机只能拉取映像。 默认服务帐号的后缀为 @developer.gserviceaccount.com

以下设置要求您更改默认权限或范围配置。

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

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

为虚拟机配置 IAM 权限

默认情况下,Compute Engine 虚拟机只能访问同一项目中的存储空间。 如果虚拟机需要访问其他项目中的 Container Registry,您必须向该虚拟机服务帐号授予权限。

  1. 在具有虚拟机实例的项目中,获取 Compute Engine 默认服务帐号或与该虚拟机实例关联的服务帐号的名称。默认服务帐号的后缀为 @developer.gserviceaccount.com

  2. 在具有 Container Registry 的项目中,授予权限以便服务帐号可以访问 Container Registry。

为虚拟机配置范围

如需在创建虚拟机时设置访问权限范围,请使用 --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 命令的文档。