为了遵循 Cloud Build 中的最小权限原则,您可以配置 Cloud Build 以使用具有执行构建所需的最低权限的服务 账号。本页面介绍了如何设置服务帐号。
如果您未指定服务帐号,Cloud Build 可能会自动选择一个服务帐号来代表您执行构建。此服务帐号可能具有对您的使用场景而言不必要的广泛权限,例如访问您的 Cloud Source Repositories 和项目中的任何 Cloud Storage 存储桶。
为了提高项目的安全性并降低错误配置或恶意用户可能造成的影响,我们建议您遵循最小权限原则。采用此原则后,您可以为每个服务帐号分配其执行的任务范围内的权限和角色。例如,您可以使用一个服务帐号来构建映像并将其推送到 Artifact Registry,如 博客Google Cloud 中所述。
准备工作
-
启用 Cloud Build 和 IAM API。
启用 API 所需的角色
如需启用 API,您需要拥有
serviceusage.services.enable权限。如果您 创建了项目,则可能已通过 所有者角色 (roles/owner) 拥有此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获得此权限。 了解如何授予角色。 如果您计划使用此账号创建和管理凭据(例如创建短期有效凭据),请启用 IAM Service Account Credentials API。
启用 API 所需的角色
如需启用 API,您需要拥有
serviceusage.services.enable权限。如果您 创建了项目,则可能已通过 所有者角色 (roles/owner) 拥有此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获得此权限。 了解如何授予角色。如果您尚未创建服务账号,请创建一个。
授予 IAM 权限
如需允许构建访问其需要连接的服务,您必须授予一些角色和权限:
-
在 Google Cloud 控制台中,前往 settings Cloud Build 权限 页面:
前往服务账号 菜单,然后选择您的服务帐号。
将要添加的角色或角色的状态设置为启用 。
如果此处未列出构建流水线所需的角色,您可以 在 IAM 配置页面中授予其他角色。
如需详细了解构建通常需要的角色,请参阅配置对 Cloud Build 资源的访问权限以及Cloud Build IAM 角色和权限的完整列表。
设置构建日志
如果您为构建指定自己的服务帐号,则必须将构建日志存储在以下任一类型的存储桶中:
用户项目中的 Cloud Storage 存储分区。这些存储分区可以是 用户创建的存储分区,也可以是 Google Cloud创建并归用户所有的存储分区。
如果您创建了日志存储桶,请确保该存储桶没有保留政策,因为该政策可能会阻止 Cloud Build 将构建日志写入存储桶。
您无法 将日志存储在 Google Google Cloud拥有的日志存储桶中。
如需详细了解存储构建日志的位置,请参阅 构建日志存储选项。
使用配置文件执行构建
如需使用配置文件手动运行构建,请执行以下操作:
在项目根目录中,创建一个名为
cloudbuild.yaml或cloudbuild.json的 Cloud Build 构建配置文件。添加
serviceAccount字段和首选日志记录设置。如果要将构建日志存储在 Cloud Logging 中,请添加
logging字段并将字段的值设置为CLOUD_LOGGING_ONLY。如果要将构建日志存储在用户创建的 Cloud Storage 存储桶中,请执行以下操作:
- 添加
logging字段,并将其值设置为GCS_ONLY。 - 添加
logsBucket字段,并将其值设置为您的 Cloud Storage 存储桶位置。
- 添加
以下示例将 Cloud Build 配置为使用用户指定的服务帐号执行构建,并将构建日志配置为存储在用户创建的 Cloud Storage 存储桶中:
YAML
steps: - name: 'bash' args: ['echo', 'Hello world!'] logsBucket: 'LOGS_BUCKET_LOCATION' serviceAccount: 'projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT' options: logging: GCS_ONLYJSON
{ "steps": [ { "name": "bash", "args": [ "echo", "Hello world!" ] } ], "logsBucket": "LOGS_BUCKET_LOCATION", "serviceAccount": "projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT", "options": { "logging": "GCS_ONLY" } }将构建配置文件中的占位值替换为以下内容:
LOGS_BUCKET_LOCATION:用于存储构建日志的 Cloud Storage 存储桶。例如,gs://mylogsbucket。PROJECT_ID:您在其中运行构建的 Google Cloud 项目 的 ID。SERVICE_ACCOUNT:您要为构建指定的服务帐号的电子邮件地址或唯一 ID。例如,服务账号电子邮件地址如下所示:service-account-name@project-id.。
使用构建配置文件启动构建:
gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORY将上述命令中的占位值替换为以下内容:
CONFIG_FILE_PATH是构建配置文件的路径。SOURCE_DIRECTORY是源代码的路径或网址。
如果您未在
gcloud builds submit命令中指定 CONFIG_FILE_PATH 和 SOURCE_DIRECTORY,Cloud Build 会假定构建配置文件和源代码位于当前工作目录中。
使用触发器执行构建
如需使用您自己的服务帐号通过 Cloud Build 触发器执行构建,请在创建触发器时设置首选日志记录选项并选择您的 首选服务帐号。
在构建配置文件中:
如果要将构建日志存储在 Cloud Logging 中,请添加
logging字段并将字段的值设置为CLOUD_LOGGING_ONLY。如果要将构建日志存储在用户创建的 Cloud Storage 存储桶中,请执行以下操作:
- 添加
logging字段,并将其值设置为GCS_ONLY。 - 添加
logsBucket字段,并将其值设置为您的 Cloud Storage 存储桶位置。
- 添加
以下示例将构建日志配置为存储在用户创建的 Cloud Storage 存储桶中:
YAML
steps: - name: 'bash' args: ['echo', 'Hello world!'] logsBucket: 'LOGS_BUCKET_LOCATION' options: logging: GCS_ONLYJSON
{ "steps": [ { "name": "bash", "args": [ "echo", "Hello world!" ] } ], "logsBucket": "LOGS_BUCKET_LOCATION", "options": { "logging": "GCS_ONLY" } }将
LOGS_BUCKET_LOCATION替换为用于存储构建日志的 Cloud Storage 存储桶。例如,gs://mylogsbucket。指定要用于构建触发器的服务帐号:
控制台
如需使用 Google Cloud 控制台中的 “触发器”页面运行构建,用户指定的服务帐号必须与构建 触发器位于同一项目中。如需将触发器与跨项目服务账号搭配使用,请使用
gcloud工具创建构建触发器。在服务账号 字段中,指定您的服务帐号。如果您未指定服务帐号,Cloud Build 会使用 默认服务账号。
点击创建 以保存您的构建触发器。
gcloud
创建构建触发器时,请使用
--service-account标志指定服务帐号。在以下示例中,gcloud命令会创建一个从 Git 代码库拉取代码的构建触发器:gcloud builds triggers create github \ --name=TRIGGER_NAME \ --repo-name=REPO_NAME \ --repo-owner=REPO_OWNER \ --branch-pattern=BRANCH_PATTERN --build-config=BUILD_CONFIG_FILE --service-account=SERVICE_ACCOUNT --project=BUILD_PROJECT将构建配置文件中的占位值替换为以下内容:
TRIGGER_NAME是构建触发器的名称。REPO_NAME是代码库的名称。REPO_OWNER是代码库所有者的用户名。BRANCH_PATTERN是代码库中要在其上调用构建的分支名称。TAG_PATTERN是代码库中要在其上调用构建的标记名称。BUILD_CONFIG_FILE:是构建配置文件的路径。SERVICE_ACCOUNT:是您的服务帐号,格式为/projects/PROJECT_ID/serviceAccounts/ACCOUNT_ID_OR_EMAIL。BUILD_PROJECT:是您在其中启动构建的项目。
跨项目设置
只有在未强制执行 iam.disableCrossProjectServiceAccountUsage 组织政策限制条件的情况下,您才能使用用户指定的服务帐号在与创建服务帐号的项目不同的项目中运行构建。默认情况下,此限制条件处于强制执行状态。
了解详情。
以下命令会停用该限制条件的强制执行,并授予必要的访问权限。在组织政策中设置限制条件之前,您的组织需要了解所涉及的安全权衡:
gcloud resource-manager org-policies disable-enforce \ iam.disableCrossProjectServiceAccountUsage \ --project=SERVICE_ACCOUNT_PROJECT_ID在此命令中,SERVICE_ACCOUNT_PROJECT_ID 是包含用户指定的服务帐号的 项目
在包含用户指定的服务帐号的项目中,为运行构建的项目中的 Cloud Build 服务代理授予
roles/iam.serviceAccountTokenCreator角色:gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \ --member="serviceAccount:BUILD_SERVICE_AGENT" \ --role="roles/iam.serviceAccountTokenCreator"将命令中的占位值替换为以下内容:
SERVICE_ACCOUNT_PROJECT_ID:包含用户指定的服务帐号的项目的项目 ID。BUILD_SERVICE_AGENT:服务代理的电子邮件 ID ,格式为service-BUILD_PROJECT_NUMBER@gcp-sa-cloudbuild., 其中BUILD_PROJECT_NUMBER是运行构建的 项目的项目编号。您可以从 项目设置页面获取项目编号。
限制 :
您的 Google Cloud 项目必须位于 Google Cloud 组织内。
您必须使用
gcloud builds submit或gcloud builds triggers create在命令行中启动构建。如需使用 Google Cloud 控制台中的“触发器”页面, 用户指定的服务帐号和构建触发器必须位于同一 项目中。
后续步骤
- 详细了解 Cloud Build IAM 角色和权限。
- 了解服务账号更改对运行构建的方式有何影响。