配置访问权限控制

本页面介绍如何授予对 Artifact Registry 代码库的权限。

准备工作

  1. 启用 Artifact Registry,包括启用 API 和安装 Cloud SDK。
  2. 如果要应用代码库特有的权限,请为软件包创建代码库

概览

Artifact Registry 可与 Google Cloud 服务完全集成以实现 CI/CD 流水线,并具备默认权限,可最大限度减少设置工作。您还可以将 Artifact Registry 与第三方 CI/CD 工具集成,并配置访问代码库所需的权限和身份验证。

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

Google Cloud 集成

默认情况下,以下权限适用于与 Artifact Registry 属于同一项目的 Google Cloud CI/CD 服务:

如果您的所有服务都在同一个 Google Cloud 项目中,并且默认权限可满足您的需求,则无需配置权限。

在以下情况下,您必须为这些服务配置 Artifact Registry 权限:

  • 您想使用这些服务访问另一个项目中的 Artifact Registry。在包含 Artifact Registry 的项目中,为每个服务的帐号授予所需角色。
  • 您使用的 GKE 版本对于从 Artifact Registry 拉取映像未提供内置支持。如需了解配置说明,请参阅 GKE 部分。
  • 您希望默认服务帐号拥有代码库的读写权限。如需了解详情,请参阅以下信息:
  • 您在运行时环境中使用自定义服务帐号,而不是默认服务帐号。在包含 Artifact Registry 的项目中,向您的服务帐号授予所需的角色。

第三方集成

对于第三方应用,您必须同时配置权限和身份验证。

  1. 创建一个服务帐号代表您的应用执行操作,或选择一个现有服务帐号进行持续集成/持续交付自动化。
  2. 向服务帐号授予适当的 Artifact Registry 角色,以提供代码库访问权限。
  3. 配置第三方应用以通过 Artifact Registry 进行身份验证。

角色与权限

通过授予包含权限的角色来授予 Identity and Access Management (IAM) 权限。使用 Artifact Registry 角色可控制代码库访问权限。您可以在项目或代码库级层授予权限。

虽然您可以使用基本角色 OwnerEditorViewer 授予代码库访问权限,但您可以通过使用 Artifact Registry 角色来应用最小权限安全原则,以便用户和服务帐号仅拥有所需的权限。

Artifact Registry 权限

下表列出了 Artifact Registry IAM 角色及其具备的权限:

角色 说明 权限
roles/artifactregistry.reader Artifact Registry Reader

查看和获取工件

  • artifactregistry.repositories.list
  • artifactregistry.repositories.get
  • artifactregistry.repositories.downloadArtifacts
  • artifactregistry.files.list
  • artifactregistry.files.get
  • artifactregistry.packages.list
  • artifactregistry.packages.get
  • artifactregistry.tags.list
  • artifactregistry.tags.get
  • artifactregistry.versions.list
  • artifactregistry.versions.get
roles/artifactregistry.writer Artifact Registry Writer

读取和写入工件

所有 roles/artifactregistry.reader 权限,以及:

  • artifactregistry.repositories.uploadArtifacts
  • artifactregistry.tags.create
  • artifactregistry.tags.update
roles/artifactregistry.repoAdmin Artifact Registry Repository Administrator

读取、写入和删除工件

所有 roles/artifactregistry.writer 权限,以及:

  • artifactregistry.repositories.deleteArtifacts
  • artifactregistry.packages.delete
  • artifactregistry.tags.delete
  • artifactregistry.versions.delete
roles/artifactregistry.admin Artifact Registry Administrator

创建和管理代码库和工件

所有 roles/artifactregistry.repoAdmin 权限,以及:

  • artifactregistry.repositories.create
  • artifactregistry.repositories.update
  • artifactregistry.repositories.delete
  • artifactregistry.repositories.getIamPolicy
  • artifactregistry.repositories.setIamPolicy

下表列出了在引入 IAM 之前已存在的基本角色,以及它们包含的 Artifact Registry IAM 角色:

角色 角色名称 包含的角色
roles/viewer Viewer roles/artifactregistry.reader
roles/editor Editor roles/artifactregistry.writer
roles/owner Owner
  • roles/artifactregistry.repoAdmin
  • roles/artifactregistry.admin

授予权限

如果项目中的所有代码库都应用相同的权限,请在项目级层授予权限。如果某些帐号需要不同级层的访问权限,请在代码库级层授予角色。

如果要使用 gcloud 命令授予角色,您可以为成员指定单个角色绑定,或使用政策文件来定义多个绑定。

以下参考政策模板用于本页中的示例。参考政策文件名为 policy.yaml。该模板包含示例用户和服务帐号名称。请根据您的项目的具体情况替换这些示例用户和服务帐号。

如需详细了解政策格式,请参阅 IAM 政策文档

bindings:

- members:
  - user: user@gmail.com
  role: roles/owner

- members:
  - serviceAccount: repo-readonly@iam.gserviceaccount.com
  - user: user2@gmail.com
  role: roles/artifactregistry.reader

- members:
  - serviceAccount: repo-write@iam.gserviceaccount.com
  role: roles/artifactregistry.writer

- members:
  - serviceAccount: repo-admin@iam.gserviceaccount.com
  role: roles/artifactregistry.repoAdmin

- members:
  - serviceAccount: ar-admin@iam.gserviceaccount.com
  role: roles/artifactregistry.admin

授予项目范围权限

如果项目中的所有代码库都应用相同的权限,请在项目级层授予角色。

要将团队成员添加到项目并向其授予 Artifact Registry 角色,请执行以下操作:

控制台

  1. 在 Cloud Console 中打开 IAM 页面。

    打开 IAM 页面

  2. 点击选择项目,选择 Artifact Registry 运行所在的项目,然后点击打开

  3. 点击添加

  4. 输入电子邮件地址。您可以将个人、服务帐号或 Google 群组添加为成员。要使用 Alpha 版功能,用户必须是 Google 群组 ar-trusted-testers@googlegroups.com 的成员。

  5. 为该成员选择一个角色。遵循最小权限安全原则,考虑授与可防止对其他资源进行不必要访问所需的最小权限。

  6. 点击保存

gcloud

要为单个成员授予角色,请运行以下命令:

gcloud projects add-iam-policy-binding PROJECT --member=MEMBER --role=ROLE

其中

  • PROJECT 是运行 Artifact Registry 的项目的 ID。
  • MEMBER 是要添加绑定的成员。使用 user|group|serviceAccount:emaildomain:domain 格式。

    示例:user:test-user@gmail.comgroup:admins@example.comserviceAccount:test123@example.domain.comdomain:example.domain.com

  • ROLE 是您要授予的角色

如需了解详情,请参阅 add-iam-policy-binding 文档。

要使用政策文件授予角色,请运行以下命令:

gcloud projects set-iam-policy PROJECT /PATH/TO/policy.yaml

其中

  • PROJECT 是运行 Artifact Registry 所在项目的 ID 或完全限定标识符。
  • /PATH/TO/policy.yaml 是政策文件的路径和文件名。

要获取当前配置的政策,请运行以下命令:

gcloud projects get-iam-policy PROJECT

其中,PROJECT 是项目 ID 或项目的完全限定标识符。

如需了解详情,请参阅 set-iam-policy 文档。

授予特定于代码库的权限

如果您希望用户或服务帐号对项目中的每个代码库拥有不同级别的访问权限,请授予代码库级层的权限。

控制台

如需授予对特定代码库的访问权限,请执行以下操作:

  1. 在 Cloud Console 中打开 代码库页面。

    打开代码库页面

  2. 选择相应的代码库。

  3. 如果信息面板未显示,请点击菜单栏中的显示信息面板

  4. 在“权限”标签页中,点击添加成员

  5. 输入电子邮件地址。您可以将个人、服务帐号或 Google 群组添加为成员以便访问 Alpha 版功能。用户必须是 Google 群组 ar-trusted-testers@googlegroups.com 的成员。

  6. 为该成员选择一个角色。我们建议授予成员其所需的最小权限。

  7. 点击保存

gcloud

您可以设置一组 IAM 政策绑定或使用政策文件。

要为单个成员授予角色,请运行以下命令:

gcloud artifacts repositories add-iam-policy-binding REPOSITORY \
--location LOCATION --member=MEMBER --role=ROLE

其中

  • REPOSITORY 是代码库的 ID。
  • MEMBER 是要添加绑定的成员。使用 user|group|serviceAccount:emaildomain:domain 格式。

    示例:user:test-user@gmail.comgroup:admins@example.comserviceAccount:test123@example.domain.comdomain:example.domain.com

  • ROLE 是您要授予的角色

  • LOCATION 是代码库的单区域或多区域位置

例如,要为使用位置 --us-central1 中代码库 my-repo 的用户 write@gmail.com 的角色 roles/artifactregistry.writer 添加 IAM 政策绑定,请运行以下命令:

gcloud artifacts repositories add-iam-policy-binding my-repo \
 --location=us-central1 --member='user:write@gmail.com' --role='roles/artifactregistry.writer'

要使用政策文件授予角色,请运行以下命令:

gcloud artifacts repositories set-iam-policy REPOSITORY /PATH/TO/policy.yaml --location=LOCATION

其中

  • REPOSITORY 是代码库的 ID。
  • /PATH/TO/policy.yaml 是政策文件的路径和文件名。
  • LOCATION 是代码库的单区域或多区域位置

例如,如需使用 policy.yaml 中定义的政策为 --us-central1 位置中的代码库 my-repo 设置 IAM 政策,请运行以下命令:

gcloud artifacts repositories set-iam-policy my-repo policy.yaml --location=us-central1

Terraform

如需了解如何使用 Terraform 预配代码库并授予代码库权限,请参阅与 Terraform 集成

配置对代码库的公共访问权限

如果您希望互联网上未经身份验证的所有人都可以使用工件,请将它们存储在您公开的代码库中。

如需将代码库配置为允许公开只读访问,请向成员 allUsers 授予 Artifact Registry Reader 角色。

控制台

  1. 在 Cloud Console 中打开 代码库页面。

    打开代码库页面

  2. 选择相应的代码库。

  3. 如果信息面板未显示,请点击菜单栏中的显示信息面板

  4. 在“权限”标签页中,点击添加成员

  5. 新成员字段中,输入 allUsers

  6. 选择 Artifact Registry Reader 角色

gcloud

运行以下命令:

gcloud artifacts repositories add-iam-policy-binding REPOSITORY \
--LOCATION --member='allUsers' --role=ROLE

其中

  • REPOSITORY 是代码库的 ID。
  • MEMBER 是要添加绑定的成员。使用 user|group|serviceAccount:emaildomain:domain 格式。

    示例:user:test-user@gmail.comgroup:admins@example.comserviceAccount:test123@example.domain.comdomain:example.domain.com

  • ROLE 是您要授予的角色

  • LOCATION 是代码库的单区域或多区域位置

例如,将位置 --us-central1 中的代码库 my-repo 配置为公开,并运行以下命令:

gcloud artifacts repositories add-iam-policy-binding my-repo \
 --location=us-central1 --member='allUsers' --role='roles/artifactregistry.reader'

撤消权限

如需撤消代码库访问权限,请从已获授权的成员列表中移除该成员。

如需移除代码库的公开访问权限,请移除 allUsers 成员。

控制台

如需撤消权限,请执行以下操作:

  1. 在 Cloud Console 中打开 代码库页面。

    打开代码库页面

  2. 选择相应的代码库。

  3. 如果信息面板未显示,请点击菜单栏中的显示信息面板

  4. 在“权限”标签中展开相应成员。如果您要将公共代码库设为不公开,请展开 allUsers 成员。

  5. 点击移除成员以撤消访问权限。

gcloud

如需撤消项目级层的角色,请运行以下命令:

gcloud projects remove-iam-policy-binding PROJECT --member=MEMBER --role=ROLE
  • PROJECT 是项目 ID。
  • MEMBER 是要移除绑定的成员。使用 user|group|serviceAccount:emaildomain:domain 格式。

    示例:user:test-user@gmail.comgroup:admins@example.comserviceAccount:test123@example.domain.comdomain:example.domain.com

  • ROLE 是要撤消的角色

如需撤消代码库的角色,请运行以下命令:

gcloud artifacts repositories remove-iam-policy-binding REPOSITORY --member=MEMBER --role=ROLE

其中

  • REPOSITORY 是代码库的 ID。
  • MEMBER 是要移除绑定的成员。使用 user|group|serviceAccount:emaildomain:domain 格式。

    示例:user:test-user@gmail.comgroup:admins@example.comserviceAccount:test123@example.domain.comdomain:example.domain.com

    如需撤消该代码库的公共访问权限,请指定成员 allUsers

  • ROLE 是要撤消的角色

例如,要为使用位置 --us-central1my-repo 代码库的用户 write@gmail.com 的角色 roles/artifactregistry.writer 移除政策绑定,请运行以下命令:

gcloud artifacts repositories remove-policy-binding my-repo \
 --location=us-central1 --member='user:write@gmail.com' --role='roles/artifactregistry.writer'

要撤消对 --us-central1my-repo 的公开访问权限,请运行以下命令:

gcloud artifacts repositories remove-policy-binding my-repo \
 --location=us-central1 --member='allUsers' --role='roles/artifactregistry.reader'
 

授予对 Compute Engine 实例的访问权限

访问代码库的虚拟机实例必须同时配置 Artifact Registry 权限和存储空间访问权限范围

服务帐号的访问权限级别是由授予该服务帐号的 IAM 角色决定的,而虚拟机实例上的访问权限范围决定了通过实例上的 gcloud 工具和客户端库发出的请求的默认 OAuth 范围。因此,在使用应用默认凭据进行身份验证时,访问权限范围可以进一步限制对 API 方法的访问。

默认情况下,默认 Compute Engine 的默认服务帐号对同一项目中的资源以及对 read-only 存储空间访问权限范围具有编辑者权限。该服务帐号电子邮件地址的后缀为 @developer.gserviceaccount.com

虽然 Editor 权限通常授予写入权限,但 read-only 访问权限范围仅允许实例服务帐号从同一项目中的任何代码库下载工件。

在以下情况下,您必须配置服务帐号的访问权限范围:

  • 虚拟机服务帐号需要访问其他项目中的代码库。
  • 除了从代码库读取工件之外,虚拟机服务帐号还需要执行一些操作。这通常适用于虚拟机上需要推送映像或运行 Artifact Registry gcloud 命令的第三方工具。

如需配置权限并设置访问权限范围,请执行以下操作:

  1. 在包含虚拟机实例的项目中,获取 Compute Engine 默认服务帐号的名称。该服务帐号电子邮件地址的后缀为 @developer.gserviceaccount.com

  2. 在包含代码库的项目中,授予权限以便服务帐号可以访问代码库。

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

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

    2. 使用以下命令设置访问权限范围:

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

      SCOPE 替换为适当的值。

      • 对于 Docker,支持以下选项:

        • storage-ro - 仅授予拉取映像的读取权限。
        • storage-rw - 授予推送或拉取映像的读写权限。
        • cloud-platform - 查看和管理整个 Google Cloud 服务中的数据(包括元数据)。
      • 对于其他格式,您必须使用 cloud-platform 范围。

    3. 重启虚拟机实例。请参阅启动已停止的实例

授予对 Google Kubernetes Engine 集群的访问权限

如果满足以下所有要求,GKE 集群就可以在不进行额外配置的情况下拉取容器:

如果您的 GKE 环境不符合上述要求,则授予访问权限的说明取决于您是使用 Compute Engine 默认服务帐号还是自定义服务帐号作为节点的身份。

默认服务帐号

以下配置要求适用于 Compute Engine 默认服务帐号

  1. 如需推送映像、与代码库进行交互以了解容器以外的格式,或从集群运行 gcloud 命令,您必须在创建集群时为服务帐号设置访问权限范围

  2. 如果 GKE 与 Artifact Registry 位于不同的项目中,请向服务帐号授予所需权限。

  3. 如果您使用的不是受支持的 GKE 版本,请配置 imagePullSecrets

设置访问权限范围

如需在创建集群时指定访问权限范围,请运行以下命令:

gcloud container clusters create CLUSTER-NAME --scopes=SCOPE

其中

CLUSTER-NAME 是集群的名称。 SCOPE 是符合您需求的范围:

  • 对于 Docker 代码库,请选择以下任一选项:

    • storage-ro - 仅授予拉取映像的读取权限。
    • storage-rw - 授予推送或拉取映像的读写权限。
    • cloud-platform - 查看和管理整个 Google Cloud 服务中的数据(包括元数据)。
  • 对于其他代码库,您必须使用 cloud-platform 范围。

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

配置 imagePullSecret

如需配置 imagePullSecret,请执行以下操作:

  1. 在包含 GKE 的项目中,找到 Compute Engine 默认服务帐号。该帐号电子邮件地址的后缀为 @developer.gserviceaccount.com

  2. 为服务帐号下载服务帐号密钥

  3. 在包含代码库的项目中,验证您是否已向代码库授予权限

  4. 在包含集群的项目中,使用服务帐号密钥创建名为 artifact-registryimagePullSecret 密文。

    kubectl create secret docker-registry artifact-registry \
    --docker-server=https://LOCATION-docker.pkg.dev \
    --docker-email=SERVICE-ACCOUNT-EMAIL \
    --docker-username=_json_key \
    --docker-password="$(cat KEY-FILE)"
    

    其中

    • LOCATION 是代码库的单区域或多区域位置
    • SERVICE-ACCOUNT-EMAIL 是 Compute Engine 服务帐号的电子邮件地址。
    • KEY-FILE 是您的服务帐号密钥文件的名称。例如 key.json
  5. 打开默认服务帐号:

    kubectl edit serviceaccount default --namespace default

    Kubernetes 集群中的每个命名空间都有一个名为 default 的默认服务帐号。此默认服务帐号用于拉取容器映像。

  6. 将新创建的 imagePullSecret Secret 添加到您的默认服务帐号:

    imagePullSecrets:
    - name: artifact-registry
    

    您的服务帐号现在应如下所示:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: default
      namespace: default
      ...
    secrets:
    - name: default-token-zd84v
    # The secret you created:
    imagePullSecrets:
    - name: artifact-registry
    

现在,当前 default 命名空间中创建的所有新 Pod 都将定义了 imagePullSecret Secret。

配置自定义服务帐号

对于使用自定义服务帐号作为其身份的集群,您必须从 Artifact Registry 运行所在的 Google Cloud 项目向服务帐号授予所需权限。

后续步骤

设置权限后,详细了解如何使用工件。