本页介绍了如何在 Artifact Registry 中使用 Identity and Access Management (IAM) 进行访问权限控制。
Artifact Registry 的默认权限可最大限度减少实现 CI/CD 流水线时的设置工作。您还可以将 Artifact Registry 与第三方 CI/CD 工具集成,并配置访问代码库所需的权限和身份验证。
如果您使用 Artifact Analysis 来处理容器元数据(例如映像中发现的漏洞),请参阅 Artifact Analysis 文档,了解如何授予查看或管理元数据的访问权限。准备工作
- 启用 Artifact Registry,包括启用 API 和安装 Google Cloud CLI。
- 如果您要应用代码库特有的权限,请为软件包创建 Artifact Registry 制品库。
概览
IAM 权限和角色决定了您能否在 Artifact Registry 仓库中创建、查看、修改或删除数据。
角色是一组权限的集合。您不能直接向主账号授予权限,而是需要向主账号授予角色。为主账号授予一个角色就是授予该角色包含的所有权限。您可以为同一位主账号授予多个角色。
Google Cloud 默认权限
默认情况下,以下权限适用于与 Artifact Registry 属于同一项目的 Google Cloud CI/CD 服务:
- Cloud Build 权限包含上传和下载工件的权限。
- Compute Engine、支持的 Google Kubernetes Engine 版本以及 Cloud Run 使用 Compute Engine 默认服务账号,该账号拥有对存储空间的只读权限。
如果您的所有服务都在同一个 Google Cloud 项目中,并且默认权限可满足您的需求,则无需配置权限。
在以下情况下,您必须为这些服务配置 Artifact Registry 权限:
- 您想使用这些服务访问另一个项目中的 Artifact Registry。在包含 Artifact Registry 的项目中,为每个服务的工作负载身份池或服务账号授予所需角色。如果连接到 Cloud Run,请向 Cloud Run Service Agent 授予所需的角色。
- 您使用的 GKE 版本对于从 Artifact Registry 拉取映像未提供内置支持。如需了解配置说明,请参阅 GKE 部分。
- 您希望默认服务账号拥有代码库的读写权限。如需了解详情,请参阅以下信息:
- 您在运行时环境中使用用户提供的服务账号,而不是默认服务账号。在包含 Artifact Registry 的项目中,向您的服务账号授予所需的角色。
第三方集成
对于第三方客户端,您必须同时配置权限和身份验证。
传统上,在 Google Cloud 外部运行的应用使用服务账号密钥来访问 Google Cloud 资源。但是,服务账号密钥是强大的凭据,如果管理不当,则可能会带来安全风险。
借助 Workload Identity Federation,您可以使用 Identity and Access Management 授予外部身份 IAM 角色,包括模拟服务账号的功能。此方法可消除与服务账号密钥相关的维护和安全负担。
使用 Workload Identity 联合:
- 创建 Workload Identity 联合池。
- 创建 Workload Identity 联合提供方。
- 向工作负载身份池授予适当的 Artifact Registry 角色,以允许访问代码库。
配置第三方客户端以通过 Artifact Registry 进行身份验证。
使用服务账号:
- 创建一个服务账号代表您的应用执行操作,或选择一个现有服务账号进行持续集成/持续交付自动化。
- 向服务账号授予适当的 Artifact Registry 角色,以提供代码库访问权限。
配置第三方客户端以通过 Artifact Registry 进行身份验证。
Google Cloud上的 GitLab
Google Cloud 上的 GitLab 集成使用工作负载身份联合对 Google Cloud 上的 GitLab 工作负载进行授权和身份验证,而无需使用服务账号或服务账号密钥。如需详细了解此合作伙伴关系中如何使用工作负载身份联合,请参阅 Google Cloud 工作负载身份联合和 IAM 政策。
如需为 Google Cloud上的 GitLab 设置 Workload Identity Federation 和必要的 IAM 角色,请参阅 GitLab 教程 Google Cloud Workload Identity Federation 和 IAM 政策。
如需连接 Artifact Registry 代码库,请按照 GitLab 教程 Google Artifact Registry 中的说明操作。
角色与权限
每个 Artifact Registry API 方法都要求发出请求的正文具有使用相应资源所需的权限。您可以通过设置政策向主账号授予对资源的预定义角色,从而向主账号授予相应权限。
您可以在 Google Cloud 项目或 Artifact Registry 仓库中授予角色。
预定义的 Artifact Registry 角色
IAM 提供的预定义角色可以授予对特定 Google Cloud 资源的访问权限。
为pkg.dev
网域中的代码库使用以下预定义角色:
角色 | 说明 |
---|---|
Artifact Registry Reader ( roles/artifactregistry.reader ) |
查看和获取工件,查看代码库元数据。 |
Artifact Registry Writer ( roles/artifactregistry.writer ) |
读取和写入工件。 |
Artifact Registry Repository Administrator ( roles/artifactregistry.repoAdmin ) |
读取、写入和删除工件。 |
Artifact Registry Administrator ( roles/artifactregistry.admin ) |
创建和管理代码库和工件。 |
角色 | 说明 |
---|---|
Container Registry -> Artifact Registry Migration Admin
(roles/artifactregistry.containerRegistryMigrationAdmin ) |
包含运行迁移工具所需的所有权限 |
Artifact Registry Create-on-push Writer
(roles/artifactregistry.createOnPushWriter ) |
读取和写入工件。推送到 gcr.io 网址时,创建 gcr.io 代码库。 |
Artifact Registry Create-on-push Repository Administrator
(roles/artifactregistry.createOnPushRepoAdmin ) |
读取、写入和删除工件。创建 gcr.io 代码库。 |
gcloud iam roles describe
命令查看每个角色中的权限列表。
基本 IAM 角色
基本角色是在引入 IAM 之前就已存在的高度宽松角色。您不应在生产环境中授予基本角色,但可以在开发或测试环境中授予这些角色。
尽可能使用预定义角色来访问代码库,以便用户和服务账号仅拥有所需的权限。
如需详细了解基本角色,请参阅 IAM 基本角色和预定义角色参考文档。
正在授予角色
如果项目中的所有代码库都应用相同的角色,请在项目级层授予角色。如果某些账号需要不同级层的访问权限,请在代码库级层授予角色。
如果您要为虚拟仓库授予角色,则这些角色会应用于通过虚拟仓库提供的所有上游仓库,而无需考虑各个仓库的权限。如果要使用 gcloud
命令授予角色,您可以为主账号指定单个角色绑定,也可以通过获取资源的允许政策、对其进行修改,然后设置修改后的允许政策来进行大规模政策更改。如需了解详情,请参阅以编程方式授予或撤消多个角色。
授予项目级角色
如果项目中的所有代码库都应用相同的权限,请在项目级层授予角色。
如需将用户或服务账号添加到项目并向其授予 Artifact Registry 角色,请执行以下操作:
控制台
在 Google Cloud 控制台中打开 IAM 页面。
点击选择项目,选择 Artifact Registry 运行所在的项目,然后点击打开。
点击添加。
输入电子邮件地址。您可以将个人、服务账号或 Google 群组网添加为主账号。
为主账号选择一个角色。遵循最小权限安全原则,考虑授与可访问所需 Artifact Registry 资源所需的最小权限。如需了解 Artifact Registry 预定义角色和权限,请参阅 Artifact Registry 预定义角色。
点击保存。
gcloud
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
如需向单个主账号授予角色,请运行以下命令:
gcloud projects add-iam-policy-binding PROJECT \ --member=PRINCIPAL \ --role=ROLE
其中
- PROJECT 是运行 Artifact Registry 的项目的 ID。
PRINCIPAL 是要添加绑定的主账号。使用
user|group|serviceAccount:email
或domain:domain
格式。示例:
user:test-user@gmail.com
、group:admins@example.com
、serviceAccount:test123@example.domain.com
或domain:example.domain.com
。ROLE 是您要授予的角色。
如需了解详情,请参阅 add-iam-policy-binding 文档。
如需使用政策文件授予角色,请参阅以编程方式授予或撤消多个角色
授予特定于制品库的角色
如果您希望用户或服务账号对项目中的每个代码库拥有不同级别的访问权限,请授予代码库级角色。
控制台
如需授予对特定代码库的访问权限,请执行以下操作:
在 Google Cloud 控制台中打开制品库页面。
选择相应的代码库。
如果信息面板未显示,请点击菜单栏中的显示信息面板。
在“权限”标签页中,点击添加主账号。
输入电子邮件地址。您可以将个人、服务账号或 Google 群组添加为主账号。
为主账号选择一个角色。遵循最小权限安全原则,考虑授与可访问所需 Artifact Registry 资源所需的最小权限。如需了解 Artifact Registry 预定义角色和权限,请参阅 Artifact Registry 预定义角色。
点击保存。
gcloud
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
您可以设置一组 IAM 政策绑定或使用政策文件。
如需向单个主账号授予角色,请运行以下命令:
gcloud artifacts repositories add-iam-policy-binding REPOSITORY \ --location=LOCATION \ --member=PRINCIPAL \ --role=ROLE
其中
- REPOSITORY 是代码库的 ID。
PRINCIPAL 是要添加绑定的主账号。使用
user|group|serviceAccount:email
或domain:domain
格式。示例:
user:test-user@gmail.com
、group:admins@example.com
、serviceAccount:test123@example.domain.com
或domain:example.domain.com
。ROLE 是您要授予的角色。
LOCATION 是代码库的单区域或多区域位置。
例如,要为使用位置
--us-west1
中代码库my-repo
的用户write@gmail.com
的角色roles/artifactregistry.writer
添加 IAM 政策绑定,请运行以下命令:gcloud artifacts repositories add-iam-policy-binding my-repo \ --location=us-west1 --member=user:write@gmail.com --role=roles/artifactregistry.writer
如需使用政策文件授予角色,请使用程序化地授予或撤消多个角色中所述的流程,并使用 gcloud artifacts repositories get-iam-policy 和 gcloud artifacts repositories set-iam-policy 命令。
Terraform
使用 google_artifact_registry_repository_iam 资源配置 IAM 政策。以下示例定义了一个资源名称为 repo-account
的服务账号,并为其授予对资源名称为 my-repo
的代码库的读取权限。
如果您刚开始使用 Terraform for Google Cloud,请参阅 HashiCorp 网站上的使用入门 - Google Cloud 页面。
provider "google" {
project = "PROJECT-ID"
}
resource "google_artifact_registry_repository" "my-repo" {
provider = google-beta
location = "LOCATION"
repository_id = "REPOSITORY"
description = "DESCRIPTION"
format = "FORMAT"
}
resource "google_service_account" "repo-account" {
provider = google-beta
account_id = "ACCOUNT-ID"
display_name = "Repository Service Account"
}
resource "google_artifact_registry_repository_iam_member" "repo-iam" {
provider = google-beta
location = google_artifact_registry_repository.my-repo.location
repository = google_artifact_registry_repository.my-repo.name
role = "roles/artifactregistry.reader"
member = "serviceAccount:${google_service_account.repo-account.email}"
}
ACCOUNT-ID 是服务账号的 ID。这是服务账号电子邮件字段中位于 @
符号之前的部分。
如需查看其他示例,请参阅 google_artifact_registry_repository_iam 资源的文档。
配置对代码库的公共访问权限
如果您希望互联网上未经身份验证的所有人都可以使用工件,请将它们存储在您公开的代码库中。
如需将代码库配置为允许公开只读访问,请向主账号 allUsers
授予 Artifact Registry Reader 角色。我们还建议您限制用户请求配额,以免单个用户耗尽项目的总配额。
控制台
gcloud
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
运行以下命令:
gcloud artifacts repositories add-iam-policy-binding REPOSITORY \ --location=LOCATION --member=allUsers --role=ROLE
其中
例如,将位置
--us-west1
中的代码库my-repo
配置为公开,并运行以下命令:gcloud artifacts repositories add-iam-policy-binding my-repo \ --location=us-west1 --member=allUsers --role=roles/artifactregistry.reader
为 Artifact Registry API 请求设置每位用户的限制,以防止未经身份验证的用户滥用。如需了解相关说明,请参阅限制用量。
正在撤消角色
如需撤消对代码库的访问权限,请从已获授权的主账号列表中移除相应主账号。
如需移除代码库的公开访问权限,请移除 allUsers
主账号。
控制台
如需撤消权限,请执行以下操作:
在 Google Cloud 控制台中打开制品库页面。
选择相应的代码库。
如果信息面板未显示,请点击菜单栏中的显示信息面板。
在“权限”标签页中,展开相应主账号。如果您要将公共代码库设为不公开,请展开
allUsers
正文。点击移除主账号以撤消访问权限。
gcloud
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
如需撤消项目级层的角色,请运行以下命令:
gcloud projects remove-iam-policy-binding PROJECT \ --member=PRINCIPAL \ --role=ROLE
- PROJECT 是项目 ID。
PRINCIPAL 是要解除绑定的主账号。使用
user|group|serviceAccount:email
或domain:domain
格式。示例:
user:test-user@gmail.com
、group:admins@example.com
、serviceAccount:test123@example.domain.com
或domain:example.domain.com
。ROLE 是您要撤消的角色。
如需撤消仓库的角色,请运行以下命令:
gcloud artifacts repositories remove-iam-policy-binding REPOSITORY --location=LOCATION \ --member=PRINCIPAL \ --role=ROLE
其中
- REPOSITORY 是代码库的 ID。
PRINCIPAL 是要解除绑定的主账号。使用
user|group|serviceAccount:email
或domain:domain
格式。示例:
user:test-user@gmail.com
、group:admins@example.com
、serviceAccount:test123@example.domain.com
或domain:example.domain.com
。如需撤消对该代码库的公共访问权限,请指定主账号
allUsers
。ROLE 是您要撤消的角色。
例如,要为使用位置
--us-west1
中my-repo
代码库的用户write@gmail.com
的角色roles/artifactregistry.writer
移除政策绑定,请运行以下命令:gcloud artifacts repositories remove-iam-policy-binding my-repo \ --location=us-west1 \ --member=user:write@gmail.com \ --role=roles/artifactregistry.writer
如需撤消对
--us-west1
中my-repo
的公开访问权限,请运行以下命令:gcloud artifacts repositories remove-iam-policy-binding my-repo \ --location=us-west1 \ --member=allUsers \ --role=roles/artifactregistry.reader
使用标记授予条件式访问权限
项目管理员可以为 Google Cloud中的资源创建标记,并在 Resource Manager 中管理这些标记。将标记附加到 Artifact Registry 制品库后,管理员可以将该标记与 IAM 条件搭配使用,以有条件地授予对制品库的访问权限。
您无法为单个工件附加标记。
如需了解详情,请参阅以下文档:
与 Google Cloud 服务集成
对于大多数 Google Cloud 服务账号,配置对注册表的访问权限只需授予适当的 IAM 角色。
Google Cloud 服务的默认服务账号
Cloud Build 或 Google Kubernetes Engine 等Google Cloud 服务使用默认服务账号或服务代理与同一项目中的资源进行交互。
在下列情况下,您必须自行配置或修改权限:
- Google Cloud 服务与 Artifact Registry 属于不同的项目。
- 默认权限无法满足您的需求。
- 您使用用户提供的服务账号与 Artifact Registry 进行交互,而不是使用默认服务账号。
- 您的组织政策配置会阻止向默认服务账号自动授予角色。
以下服务账号通常访问 Artifact Registry。服务账号的电子邮件地址包含运行服务的 Google Cloud 项目 ID 或项目编号。
服务 | 服务账号 | 电子邮件地址 |
---|---|---|
App Engine 柔性环境 | App Engine 服务账号 | PROJECT-ID@appspot.gserviceaccount.com |
Compute Engine | Compute Engine 默认服务账号 | PROJECT-NUMBER-compute@developer.gserviceaccount.com |
Cloud Build | Compute Engine 服务账号 或 旧版 Cloud Build 服务账号 |
默认服务账号电子邮件地址取决于您的组织设置,可能是以下任一地址:
|
Cloud Run |
Cloud Run 服务代理run.googleapis.com 的服务代理。 |
service-PROJECT-NUMBER@serverless-robot-prod.iam.gserviceaccount.com |
GKE |
Compute Engine 默认服务账号 节点的默认服务账号。 |
PROJECT-NUMBER-compute@developer.gserviceaccount.com |
根据您的组织政策配置,默认服务账号可能会自动获得项目的 Editor 角色。我们强烈建议您通过强制执行 iam.automaticIamGrantsForDefaultServiceAccounts
组织政策限制条件来停用自动角色授予功能。如果您的组织是在 2024 年 5 月 3 日之后创建的,则默认情况下会强制执行此限制条件。
如果您停用自动角色授予功能,则必须决定向默认服务账号授予哪些角色,然后自行授予这些角色。
如果默认服务账号已具有 Editor 角色,我们建议您将 Editor 角色替换为权限较少的角色。如需安全地修改服务账号的角色,请使用 Policy Simulator 查看更改的影响,然后授予和撤消相应的角色。
授予对 Compute Engine 实例的访问权限
访问代码库的虚拟机实例必须同时配置 Artifact Registry 权限和存储空间访问权限范围。
服务账号的访问权限级别是由授予该服务账号的 IAM 角色决定的,而虚拟机实例上的访问权限范围决定了通过实例上的 gcloud CLI 和客户端库发出的请求的默认 OAuth 范围。因此,在使用应用默认凭据进行身份验证时,访问权限范围可能会进一步限制对 API 方法的访问。
Compute Engine 使用以下默认值:
- Compute Engine 默认服务账号是虚拟机实例的身份。该服务账号电子邮件地址的后缀为 @developer.gserviceaccount.com。
- 默认服务账号具有 IAM 基本 Editor 角色(如果您尚未停用此行为)。
- 您使用默认服务账号创建的实例具有 Compute Engine 默认访问权限范围,包括对存储空间的只读访问权限。虽然“Editor”角色通常会授予写入权限,但
read-only
存储空间访问权限范围仅允许实例服务账号从同一项目中的任何代码库下载工件。
在以下情况下,您必须配置服务账号的访问权限范围:
- 虚拟机服务账号需要访问其他项目中的代码库。
- 除了从代码库读取工件之外,虚拟机服务账号还需要执行一些操作。这通常适用于虚拟机上需要推送映像或运行 Artifact Registry
gcloud
命令的第三方工具。
如需配置角色并设置访问权限范围,请执行以下操作:
在包含虚拟机实例的项目中,获取 Compute Engine 默认服务账号的名称。该服务账号电子邮件地址的后缀为 @developer.gserviceaccount.com。
在包含代码库的项目中,授予权限以便服务账号可以访问代码库。
使用 --scopes 选项设置访问权限范围。
授予对 Google Kubernetes Engine 集群的访问权限
如果满足以下所有要求,GKE 集群和节点池就可以在不进行额外配置的情况下拉取容器:
- GKE 与 Artifact Registry 位于同一项目中
- 节点使用默认服务账号,即 Compute Engine 默认服务账号
- 节点是通过以下方式创建的,且具有对存储空间的读取权限:
- 使用 Compute Engine 默认访问权限范围。
- 授予
cloud-platform
访问权限范围或包含对存储空间的读取访问权限的其他范围。
- 您运行的是受支持的 GKE 版本
如果您的 GKE 环境不符合上述要求,则授予访问权限的说明取决于您是使用 Compute Engine 默认服务账号还是用户提供的服务账号作为节点的身份。
- 默认服务账号
以下配置要求适用于 Compute Engine 默认服务账号:
如果 GKE 与 Artifact Registry 位于不同的项目中,请向服务账号授予所需权限。
如需推送映像、与代码库进行交互以了解容器以外的格式,或从集群运行
gcloud
命令,您必须在创建集群或节点池时为服务账号设置访问权限范围。如果您使用的不是受支持的 GKE 版本,请配置 imagePullSecrets。
- 用户提供的服务账号
如果您想使用用户提供的服务账号作为集群的身份,则必须满足以下条件:
从 Artifact Registry 运行所在的Google Cloud 项目向服务账号授予所需权限。
默认情况下,使用用户提供的服务账号创建集群或节点池会授予
cloud-platform
访问权限范围。如果您将
--scopes
标志与 gcloud container clusters create 或 gcloud container node-pools create 命令搭配使用,则必须添加适当的访问权限范围,以便与 Artifact Registry 搭配使用。
设置访问权限范围
访问权限范围是为 Compute Engine 虚拟机指定授权的传统方法。如需从 Artifact Registry 代码库拉取映像,GKE 节点必须具有存储空间只读访问权限范围,或者具有包含存储空间读取访问权限的其他存储空间访问权限范围。
您只能在创建集群或节点池时设置访问权限范围。您无法更改现有节点的访问权限范围。
- 如果您使用 Compute Engine 默认服务账号,GKE 会使用 Compute Engine 默认访问范围(包括对存储空间的只读访问权限)创建节点。
- 如果您使用的是用户提供的服务账号,GKE 会创建具有
cloud-platform
范围的节点,这是大多数Google Cloud 服务所需的范围。
如需在创建集群时指定访问权限范围,请运行以下命令:
gcloud container clusters create NAME --scopes=SCOPES
如需在创建节点池时指定访问权限范围,请运行以下命令:
gcloud container node-pools create NAME --scopes=SCOPES
替换以下值:
- NAME 是集群或节点池的名称。
SCOPES 是逗号分隔的要授予的访问权限范围列表。
如需访问 Docker 代码库,请使用以下任一范围:
storage-ro
- 授予拉取映像的只读权限。storage-rw
- 授予推送或拉取映像的读写权限。cloud-platform
- 查看和管理整个Google Cloud 服务中的数据(包括元数据)。如需访问其他代码库,您必须使用
cloud-platform
范围。
如需查看镜像范围的完整列表,请参阅 gcloud container clusters create 或 gcloud container node-pools create 的文档。
如需详细了解创建新集群时可设置的范围,请参阅 gcloud container clusters create 命令的文档。
配置 imagePullSecret
如需配置 imagePullSecret
,请执行以下操作:
在包含 GKE 的项目中,找到 Compute Engine 默认服务账号。该账号电子邮件地址的后缀为 @developer.gserviceaccount.com。
为服务账号下载服务账号密钥。
在包含代码库的项目中,验证您是否已向代码库授予权限。
在包含集群的项目中,使用服务账号密钥创建名为
artifact-registry
的imagePullSecret
密文。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`。
打开默认服务账号:
kubectl edit serviceaccount default --namespace default
Kubernetes 集群中的每个命名空间都有一个名为
default
的默认服务账号。此默认服务账号用于拉取容器映像。将新创建的
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 服务账号
Artifact Registry Service Agent 是一个 Google 代管式服务账号,该账号在与 Google Cloud服务交互时会代表 Artifact Registry 执行操作。如需详细了解该账号及其权限,请参阅 Artifact Registry 服务账号。
后续步骤
设置权限后,详细了解如何使用工件。
您还可以使用下载规则限制工件下载。