本页介绍了 Artifact Registry 中使用 Identity and Access Management (IAM) 进行的访问权限控制。
在实现 CI/CD 流水线时,Artifact Registry 的默认权限可最大限度减少设置工作。您还可以将 Artifact Registry 与第三方 CI/CD 工具集成,并配置访问代码库所需的权限和身份验证。
准备工作
- 启用 Artifact Registry,包括启用 API 和安装 Google Cloud CLI。
- 如果您想应用代码库特有的权限,请为软件包创建 Artifact Registry 代码库。
概览
IAM 权限和角色决定了您能否在 Artifact Registry 代码库中创建、查看、修改或删除数据。
角色是一组权限的集合。您不能直接向主账号授予权限,而是需要向主账号授予角色。为主账号授予一个角色就是授予该角色包含的所有权限。您可以为同一位主账号授予多个角色。
Trusted Cloud 个默认权限
默认情况下,以下权限适用于与 Artifact Registry 属于同一项目的 Trusted Cloud CI/CD 服务:
- Compute Engine 和支持的 Google Kubernetes Engine 版本使用 Compute Engine 默认服务账号,该账号拥有对存储空间的只读权限。
如果您的所有服务都在同一个 Trusted Cloud by S3NS 项目中,并且默认权限可满足您的需求,则无需配置权限。
在以下情况下,您必须为这些服务配置 Artifact Registry 权限:
- 您使用的 GKE 版本对于从 Artifact Registry 拉取映像未提供内置支持。如需了解配置说明,请参阅 GKE 部分。
- 您希望默认服务账号拥有代码库的读写权限。如需了解详情,请参阅以下信息:
- 您在运行时环境中使用用户提供的服务账号,而不是默认服务账号。在包含 Artifact Registry 的项目中,向您的服务账号授予所需的角色。
第三方集成
对于第三方客户端,您必须同时配置权限和身份验证。
传统上,在 Trusted Cloud 外部运行的应用使用服务账号密钥来访问 Trusted Cloud 资源。不过,服务账号密钥是强大的凭据,如果管理不当,则可能会带来安全风险。
借助工作负载身份联合,您可以使用 Identity and Access Management 授予外部身份 IAM 角色,包括模拟服务账号的权限。此方法可消除与服务账号密钥相关的维护和安全负担。
使用工作负载身份联合:
- 创建工作负载身份联合池。
- 创建工作负载身份联合提供方。
- 向工作负载身份池授予适当的 Artifact Registry 角色,以允许访问代码库。如需了解详情,请参阅允许外部工作负载访问 Trusted Cloud by S3NS 资源。
- 如果您需要长时间访问 Artifact Registry,请在凭据配置中将 OIDC 令牌过期时间配置为更长的时间。
配置第三方客户端以通过 Artifact Registry 进行身份验证。
使用服务账号:
- 创建一个服务账号代表您的应用执行操作,或选择一个现有服务账号进行持续集成/持续交付自动化。
- 向服务账号授予适当的 Artifact Registry 角色,以提供代码库访问权限。
配置第三方客户端以通过 Artifact Registry 进行身份验证。
角色与权限
每个 Artifact Registry API 方法都要求发出请求的正文具有使用相应资源所需的权限。通过设置政策向主账号授予权限,这些政策会向主账号授予资源上的预定义角色。
您可以在 Trusted Cloud by S3NS 项目或 Artifact Registry 代码库中授予角色。
预定义的 Artifact Registry 角色
IAM 提供的预定义角色可以授予对特定 Trusted Cloud 资源的访问权限。
对于代码库,请使用以下预定义角色:角色 | 说明 |
---|---|
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 ) |
创建和管理制品库和制品。 |
gcloud iam roles describe
命令查看每个角色中的权限列表。
基本 IAM 角色
基本角色是在引入 IAM 之前就已存在的高度宽松角色。您不应在生产环境中授予基本角色,但可以在开发或测试环境中授予这些角色。
尽可能使用预定义角色来控制代码库访问权限,以便用户和服务账号仅拥有所需的权限。
如需详细了解基本角色,请参阅 IAM 基本角色和预定义角色参考文档。
正在授予角色
如果项目中的所有代码库都应用相同的角色,请在项目级层授予角色。如果某些账号需要不同级层的访问权限,请在代码库级层授予角色。
如果您要使用 gcloud
命令授予角色,可以为主账号指定单个角色绑定,也可以通过获取资源的允许政策、修改该政策,然后设置修改后的允许政策,进行大规模政策更改。如需了解详情,请参阅以编程方式授予或撤消多个角色。
授予项目范围的角色
如果项目中的所有代码库都应用相同的权限,请在项目级层授予角色。
如需将用户或服务账号添加到项目并向其授予 Artifact Registry 角色,请执行以下操作:
控制台
在 Trusted Cloud 控制台中打开 IAM 页面。
点击选择项目,选择 Artifact Registry 运行所在的项目,然后点击打开。
点击添加。
输入电子邮件地址。您可以将个人、服务账号或 Google 群组网添加为主账号。
为主账号选择一个角色。遵循最小权限安全原则,考虑授予访问所需 Artifact Registry 资源所需的最小权限。如需了解 Artifact Registry 预定义角色和权限,请参阅预定义的 Artifact Registry 角色。
点击保存。
gcloud
-
In the Trusted Cloud console, activate Cloud Shell.
At the bottom of the Trusted 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 文档。
如需使用政策文件授予角色,请参阅以编程方式授予或撤消多个角色
授予特定于制品库的角色
如果您希望用户或服务账号对项目中的每个代码库拥有不同级别的访问权限,请授予代码库级层的角色。
控制台
如需授予对特定代码库的访问权限,请执行以下操作:
在 Trusted Cloud 控制台中打开代码库页面。
选择相应的代码库。
如果信息面板未显示,请点击菜单栏中的显示信息面板。
在“权限”标签页中,点击添加主账号。
输入电子邮件地址。您可以将个人、服务账号或 Google 群组添加为主账号。
为主账号选择一个角色。遵循最小权限安全原则,考虑授予访问所需 Artifact Registry 资源所需的最小权限。如需了解 Artifact Registry 预定义角色和权限,请参阅预定义的 Artifact Registry 角色。
点击保存。
gcloud
-
In the Trusted Cloud console, activate Cloud Shell.
At the bottom of the Trusted 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 是代码库的单区域位置。
例如,要为使用位置
--u-france-east1
中代码库my-repo
的用户write@gmail.com
的角色roles/artifactregistry.writer
添加 IAM 政策绑定,请运行以下命令:gcloud artifacts repositories add-iam-policy-binding my-repo \ --location=u-france-east1 --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 Trusted Cloud by S3NS,请参阅 HashiCorp 网站上的使用入门 - Trusted Cloud by S3NS 页面。
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 Trusted Cloud console, activate Cloud Shell.
At the bottom of the Trusted 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
其中
REPOSITORY 是代码库的 ID。
ROLE 是您要授予的角色。 + LOCATION 是代码库的区域位置。
例如,将位置
--u-france-east1
中的代码库my-repo
配置为公开,并运行以下命令:gcloud artifacts repositories add-iam-policy-binding my-repo \ --location=u-france-east1 --member=allUsers --role=roles/artifactregistry.reader
为 Artifact Registry API 请求设置每位用户的限额,以防止未经身份验证的用户滥用。如需查看相关说明,请参阅限制用量。
正在撤消角色
如需撤消代码库访问权限,请从已获授权的主账号列表中移除相应的主账号。
如需移除代码库的公开访问权限,请移除 allUsers
主账号。
控制台
如需撤消权限,请执行以下操作:
在 Trusted Cloud 控制台中打开代码库页面。
选择相应的代码库。
如果信息面板未显示,请点击菜单栏中的显示信息面板。
在“权限”标签页中,展开相应的主账号。如果您要将公共代码库设为不公开,请展开
allUsers
主账号。点击移除主账号以撤消访问权限。
gcloud
-
In the Trusted Cloud console, activate Cloud Shell.
At the bottom of the Trusted 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 是您要撤消的角色。
例如,要为使用位置
--u-france-east1
中my-repo
代码库的用户write@gmail.com
的角色roles/artifactregistry.writer
移除政策绑定,请运行以下命令:gcloud artifacts repositories remove-iam-policy-binding my-repo \ --location=u-france-east1 \ --member=user:write@gmail.com \ --role=roles/artifactregistry.writer
如需撤消对位置
--u-france-east1
中my-repo
的公开访问权限,请运行以下命令:gcloud artifacts repositories remove-iam-policy-binding my-repo \ --location=u-france-east1 \ --member=allUsers \ --role=roles/artifactregistry.reader
使用标记授予条件式访问权限
项目管理员可以为整个 Trusted Cloud内的资源创建标记,并在 Resource Manager 中管理这些标记。将标记附加到 Artifact Registry 制品库后,管理员可以将该标记与 IAM 条件搭配使用,以有条件地授予对该制品库的访问权限。
您无法将标记附加到单个制品。
如需了解详情,请参阅以下文档:
与 Trusted Cloud 服务集成
对于大多数 Trusted Cloud 服务账号,配置对注册表的访问权限只需授予适当的 IAM 角色。
Trusted Cloud by S3NS 服务的默认服务账号
Trusted Cloud Google Kubernetes Engine 等服务使用默认服务账号或服务代理与同一项目中的资源进行交互。
在下列情况下,您必须自行配置或修改权限:
- Trusted Cloud by S3NS 服务与 Artifact Registry 属于不同的项目。
- 默认权限不能满足您的需求。
- 您使用的是用户提供的服务账号与 Artifact Registry 进行交互,而不是默认服务账号。
- 您的组织政策配置会阻止自动向默认服务账号授予角色。
以下服务账号通常访问 Artifact Registry。服务账号的电子邮件地址包含运行服务的项目的 Trusted Cloud 项目 ID 或项目编号。
服务 | 服务账号 | 电子邮件地址 |
---|---|---|
Compute Engine | Compute Engine 默认服务账号 | PROJECT-NUMBER-compute@developer.s3ns-system.iam.gserviceaccount.com |
GKE |
Compute Engine 默认服务账号 节点的默认服务账号。 |
PROJECT-NUMBER-compute@developer.s3ns-system.iam.gserviceaccount.com |
根据您的组织政策配置,默认服务账号可能会自动获得项目的 Editor 角色。我们强烈建议您通过强制执行 iam.automaticIamGrantsForDefaultServiceAccounts
组织政策限制条件来停用自动角色授予功能。如果您的组织是在 2024 年 5 月 3 日之后创建的,则默认情况下会强制执行此限制条件。
如果您停用自动角色授予功能,则必须决定向默认服务账号授予哪些角色,然后自行授予这些角色。
如果默认服务账号已具有 Editor 角色,我们建议您将 Editor 角色替换为权限较少的角色。
授予对 Compute Engine 实例的访问权限
访问代码库的虚拟机实例必须同时配置 Artifact Registry 权限和存储空间访问权限范围。
服务账号的访问权限级别是由授予该服务账号的 IAM 角色决定的,而虚拟机实例上的访问权限范围决定了通过实例上的 gcloud CLI 和客户端库发出的请求的默认 OAuth 范围。因此,在使用应用默认凭据进行身份验证时,访问权限范围可以进一步限制对 API 方法的访问。
Compute Engine 使用以下默认值:
- Compute Engine 默认服务账号是虚拟机实例的身份。该服务账号电子邮件地址的后缀为 @developer.s3ns-system.iam.gserviceaccount.com。
- 除非您已停用此行为,否则默认服务账号将拥有 IAM 基本 Editor 角色。
- 使用默认服务账号创建的实例具有 Compute Engine 默认访问权限范围,包括对存储空间的只读访问权限。虽然 Editor 角色通常授予写入权限,但
read-only
存储访问权限范围仅允许实例服务账号从同一项目中的任何代码库下载工件。
在以下情况下,您必须配置服务账号的访问权限范围:
- 虚拟机服务账号需要访问其他项目中的代码库。
- 除了从代码库读取工件之外,虚拟机服务账号还需要执行一些操作。这通常适用于虚拟机上需要推送映像或运行 Artifact Registry
gcloud
命令的第三方工具。
如需配置角色并设置访问权限范围,请执行以下操作:
在包含虚拟机实例的项目中,获取 Compute Engine 默认服务账号的名称。该服务账号电子邮件地址的后缀为 @developer.s3ns-system.iam.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 的Trusted 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
范围的节点,该范围是大多数Trusted 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
- 查看和管理整个Trusted Cloud 服务中的数据(包括元数据)。如需访问其他代码库,您必须使用
cloud-platform
范围。
如需查看范围的完整列表,请参阅 gcloud container clusters create 或 gcloud container node-pools create 的文档。
如需详细了解创建新集群时可设置的范围,请参阅 gcloud container clusters create 命令的文档。
配置 imagePullSecret
如需配置 imagePullSecret
,请执行以下操作:
在包含 GKE 的项目中,找到 Compute Engine 默认服务账号。该账号电子邮件地址的后缀为 @developer.s3ns-system.iam.gserviceaccount.com。
为服务账号下载服务账号密钥。
在包含代码库的项目中,验证您是否已向代码库授予权限。
在包含集群的项目中,使用服务账号密钥创建名为
artifact-registry
的imagePullSecret
密文。kubectl create secret docker-registry artifact-registry \ --docker-server=https://LOCATION-docker.s3nsregistry.fr \ --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 代管式服务账号,该账号在与 Trusted Cloud by S3NS服务交互时会代表 Artifact Registry 执行操作。如需详细了解该账号及其权限,请参阅 Artifact Registry 服务账号。
后续步骤
设置权限后,详细了解如何使用工件。