根据贵组织的设置,Cloud Build 可能会使用 Compute Engine 默认服务账号或旧版 Cloud Build 服务账号代表您执行构建。
默认服务账号的权限可能对于您的用例来说过于宽泛。您可以遵循最小权限原则来改善安全状况。根据这一原则,我们建议您创建您自己的服务账号,以便代表您执行 build。这可以降低配置错误或恶意用户的潜在影响。
如需了解如何向 Cloud Build 默认服务账号授予或撤消权限,请参阅配置 Cloud Build 默认服务账号的访问权限。
Compute Engine 默认服务账号简介
贵组织的政策可能会将默认的 Cloud Build 服务账号定义为 Compute Engine 默认服务账号。此服务账号的电子邮件地址为
[PROJECT_NUMBER]-compute@developer.gserviceaccount.com
。
如需了解 Compute Engine 默认服务账号,请参阅 Compute Engine 默认服务账号。
旧版 Cloud Build 服务账号简介
贵组织的政策可能会将默认的 Cloud Build 服务账号定义为旧版服务账号。旧版 Cloud Build 服务账号的电子邮件地址为
[PROJECT_NUMBER]@cloudbuild.gserviceaccount.com
本部分介绍了旧版 Cloud Build 服务账号默认拥有的所有权限。
旧版 Cloud Build 服务账号的默认权限
如果您的项目设置允许使用旧版 Cloud Build 服务账号,系统会为旧版服务账号授予项目中资源的 Cloud Build 服务账号角色 (roles/cloudbuild.builds.builder
)。此角色包含多种权限,比如更新 build 或写入日志的能力。该服务账号仅在执行构建时需要执行操作才会使用这些权限。例如,如果您的 build 配置为从 Artifact Registry 获取 Docker 映像,则服务账号会使用 artifactregistry.dockerimages.get
权限执行此操作。
如果您不打算在构建过程中执行某项操作,我们建议您从服务账号撤消相应的权限,以遵守 [最小权限安全原则][最小权限]。
下表列出了 Cloud Build 服务账号角色 (roles/cloudbuild.builds.builder
) 包含的权限以及旧版 Cloud Build 服务账号使用这些权限的用途。
权限 | 说明 | 权限的用途 |
---|---|---|
cloudbuild.builds.create |
可以创建构建和触发器 | 需要这些权限才能执行以下操作:
|
cloudbuild.builds.update |
可以更新构建和触发器 | |
cloudbuild.builds.list |
可以列出构建和触发器 | |
cloudbuild.builds.get |
可以获取构建和触发器 | |
cloudbuild.workerpools.use |
可以使用专用池 | 必须在专用池中运行 build。 |
logging.logEntries.create |
可以写入日志 | 在 Cloud Logging 中创建和列出构建日志时需要这些权限。 |
logging.logEntries.list |
可以列出日志 | |
logging.views.access |
可以查看日志 | |
pubsub.topics.create |
可以创建 Pub/Sub 主题 | 将构建更新推送到 Pub/Sub 时需要这些权限。 |
pubsub.topics.publish |
可以发布到 Pub/Sub | |
remotebuildexecution.blobs.get |
可以获得批准或拒绝 build 的权限。 | 必须批准或拒绝待处理的 build |
resourcemanager.projects.get |
可以获取项目信息 | |
resourcemanager.projects.list |
可以列出项目 | |
source.repos.get |
可以从 Cloud Source Repositories 中的代码库读取源代码 | 需要这些权限才能执行以下操作:
|
source.repos.list |
可以列出 Cloud Source Repositories 中的代码库 | |
storage.buckets.create |
可以创建 Cloud Storage 存储分区 | 需要这些权限才能执行以下操作:
|
storage.buckets.get |
可以获取 Cloud Storage 存储分区 | |
storage.buckets.list |
可以列出 Cloud Storage 存储分区 | |
storage.objects.list |
可以列出 Cloud Storage 对象 | |
storage.objects.update |
可以更新 Cloud Storage 对象 | |
storage.objects.create |
可以写入 Cloud Storage 对象 | |
storage.objects.delete |
可以删除 Cloud Storage 对象 | |
storage.objects.get |
可以读取 Cloud Storage 对象 | |
artifactregistry.repositories.uploadArtifacts |
可以将工件上传到 Artifact Registry 中的代码库 | 在 Artifact Registry 中管理工件时需要这些权限。 |
artifactregistry.repositories.downloadArtifacts |
可以从 Artifact Registry 中的代码库下载工件 | |
artifactregistry.aptartifacts.create |
可以将 Apt 工件上传到 Artifact Registry | |
artifactregistry.dockerimages.get |
可以从 Artifact Registry 获取 Docker 映像 | |
artifactregistry.dockerimages.list |
可以列出存储在 Artifact Registry 中的 Docker 映像 | |
artifactregistry.kfpartifacts.create |
可以将 KFP 工件上传到 Artifact Registry | |
artifactregistry.locations.get |
可以获取 Artifact Registry 中资源的位置信息 | |
artifactregistry.locations.list |
可以列出 Artifact Registry 支持的位置 | |
artifactregistry.mavenartifacts.get |
可以从 Artifact Registry 获取 Maven 软件包 | |
artifactregistry.mavenartifacts.list |
可以从 Artifact Registry 列出 Maven 软件包 | |
artifactregistry.npmpackages.get |
可以从 Artifact Registry 获取 npm 软件包 | |
artifactregistry.npmpackages.list |
可以列出 Artifact Registry 中的 npm 软件包 | |
artifactregistry.projectsettings.get |
可以从 Artifact Registry 获取项目设置 | |
artifactregistry.pythonpackages.get |
可以从 Artifact Registry 获取 Python 软件包 | |
artifactregistry.pythonpackages.list |
可以列出 Artifact Registry 中的 Python 软件包 | |
artifactregistry.yumartifacts.create |
可以将 Yum 工件上传到 Artifact Registry | |
artifactregistry.repositories.createOnPush |
首次将映像推送到项目中的 gcr.io 主机名时,可以在 Artifact Registry 中创建 gcr.io 存储库。 | |
artifactregistry.repositories.get |
可以从 Artifact Registry 获取代码库 | |
artifactregistry.repositories.list |
可以列出 Artifact Registry 中的代码库 | |
artifactregistry.repositories.listEffectiveTags |
可以列出 Artifact Registry 中工件的标记 | 在 Artifact Registry 中管理工件的标记时需要这些权限。 |
artifactregistry.repositories.listTagBindings |
可以列出 Artifact Registry 中工件的标记绑定信息 | |
artifactregistry.tags.create |
可以在 Artifact Registry 中创建标记 | |
artifactregistry.tags.get |
可以从 Artifact Registry 获取标记 | |
artifactregistry.tags.list |
可以列出 Artifact Registry 中的标记 | |
artifactregistry.tags.update |
可以更新 Artifact Registry 中的标记 | |
artifactregistry.versions.list |
可以列出 Artifact Registry 中的版本 | |
artifactregistry.versions.get |
可以获取 Artifact Registry 中的版本 | |
containeranalysis.occurrences.create |
可以创建 Artifact Analysis 事件 | Cloud Build 服务账号不使用这些权限,但它们是为了向后兼容性而添加的。 |
containeranalysis.occurrences.delete |
可以删除 Artifact Analysis 事件 | |
containeranalysis.occurrences.get |
可以获取 Artifact Analysis 事件 | |
containeranalysis.occurrences.list |
可以列出工件分析事件 | |
containeranalysis.occurrences.update |
可以更新工件分析事件 |
构建触发器
创建构建触发器时,您必须选择用于执行构建的服务账号。您可以使用不同的服务账号配置每个触发器。唯一的例外情况是,如果您的项目启用了旧版 Cloud Build 服务账号,那么在未选择其他账号的情况下,构建触发器会默认使用旧版服务账号。
用户对触发器的访问权限
用户对触发器的访问权限取决于为触发器配置的服务账号类型:
旧版 Cloud Build 服务账号(如果已启用):具有 Cloud Build Editor 角色的任何用户都可以创建并直接运行触发器。例如,用户可以手动运行触发器。只要触发器使用的是 Cloud Build 旧版服务账号,具有 Cloud Build Editor 角色的任何用户都可以更新触发器。
用户指定的服务账号或 Compute Engine 默认服务账号:具有 Cloud Build Editor 角色且具有
iam.serviceAccounts.actAs
权限的任何用户都可以创建和直接运行触发器。例如,用户可以手动运行触发器。任何具有 Cloud Build Editor 角色的用户都可以更新触发器,只要他们对先前配置的服务账号和触发器上指定的新服务账号具有iam.serviceAccounts.actAs
权限即可。如需向用户授予此权限,您可以向用户授予包含此权限的预定义角色,例如 Service Account User 角色 (roles/iam.serviceAccountUser
)。或者,您也可以创建具有iam.serviceAccounts.actAs
权限的自定义 IAM 角色,然后将该角色授予用户。如需详细了解服务账号权限,请参阅服务账号身份验证角色。
触发器的构建时权限
为构建触发器配置的服务账号可以为使用触发器调用构建的用户提供提升的构建时间权限。这适用于旧版服务账号和用户指定的服务账号。使用构建触发器时,请注意以下安全隐患:
无权访问您的 Google Cloud 项目但有权写入与该项目中构建触发器关联的代码库的用户将有权更改正在构建的代码。例如,用户可以在将新源代码推送到关联的代码库时间接调用触发器。
如果您使用的是 GitHub 拉取请求触发器,则有权读取代码库的任何用户都可以提交拉取请求,这可能会触发其中包含拉取请求中的代码更改的构建。要停用此行为,您可以在创建 GitHub 拉取请求触发器时选择评论控制选项。选择此选项可确保仅在代码库所有者或协作者评论
/gcbrun
时才启动构建。如需了解如何将评论控制与 GitHub 触发器配合使用,请参阅创建 GitHub 触发器。
旧版 Cloud Build 服务账号的限制
如果您需要使用 ID 令牌在服务之间进行身份验证,则必须使用用户指定的服务账号运行 build。您无法使用旧版 Cloud Build 服务账号生成 ID 令牌。
例如,如果您使用 Cloud Run functions、Cloud Run 或 App Engine 等无服务器平台应用,并且想要从 Cloud Build 调用您的应用,则需要为用户指定的服务账号配置服务到服务身份验证所需的权限。
如需查看相关说明,请参阅授权服务间访问。
您无法在旧版服务账号上添加 IAM 政策绑定。例如,您无法创建 IAM 政策绑定,以向另一个服务账号授予旧版服务账号的
roles/iam.serviceAccountTokenCreator
角色。
后续步骤
- 了解用户指定的服务账号。
- 了解如何配置 Cloud Build 默认服务账号的访问权限。
- 了解如何配置对 Cloud Build 资源的访问权限。
- 了解查看构建日志所需的权限。