借助组织政策服务,您可以对组织的资源进行程序化集中控制。作为组织政策管理员,您可以定义组织政策,这是一组称为限制条件的限制,会应用于 Google Cloud 资源层次结构中的 Cloud Build 资源及其后代。您可以在组织、文件夹或项目级强制执行组织政策。
组织政策服务为各种 Cloud Build 服务提供预定义限制条件。但是,如果您想要更精细地控制和自定义组织政策中受限的特定字段,还可以创建自定义组织政策。
优势
您可以使用自定义组织政策来允许或拒绝特定 Cloud Build 资源。例如,如果创建或更新 build 触发器的请求未能满足组织政策设置的自定义限制条件验证,则请求会失败,并且系统会向调用方返回错误。
政策继承
如果您对资源强制执行政策,默认情况下,该资源的后代会继承组织政策。例如,如果您对某个文件夹强制执行一项政策,Cloud Build 会对该文件夹中的所有项目强制执行该政策。如需详细了解此行为及其更改方式,请参阅层次结构评估规则。
价格
组织政策服务(包括预定义组织政策和自定义组织政策)可免费使用。
准备工作
- 设置项目
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
 - 
    
    
      
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
 - 
      Create a project: To create a project, you need the Project Creator
      (
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles. 
 - 
  
    
Verify that billing is enabled for your Google Cloud project.
 - 
  
  
    
      
Enable the Cloud Build API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. - 
      
Install the Google Cloud CLI.
 - 
          
如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。
 - 
        
如需初始化 gcloud CLI,请运行以下命令:
gcloud init - 
    
    
      
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
 - 
      Create a project: To create a project, you need the Project Creator
      (
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles. 
 - 
  
    
Verify that billing is enabled for your Google Cloud project.
 - 
  
  
    
      
Enable the Cloud Build API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. - 
      
Install the Google Cloud CLI.
 - 
          
如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。
 - 
        
如需初始化 gcloud CLI,请运行以下命令:
gcloud init - 请确保您知道您的组织 ID。
 ORGANIZATION_ID:您的组织 ID,例如123456789。CONSTRAINT_NAME:新的自定义限制条件的名称。 自定义限制条件必须以custom.开头,只能包含大写字母、小写字母或数字,例如custom.enableBuildTrigger。该字段的长度上限为 70 个字符,不计算前缀(例如organizations/123456789/customConstraints/custom.allowConstraint)。RESOURCE_NAME:包含要限制的对象和字段的 Cloud Build 资源的名称(而非 URI)。例如BuildTrigger。CONDITION:针对受支持的服务资源的表示法编写的 CEL 条件。此字段的长度上限为 1,000 个字符。 如需详细了解可用于针对其编写条件的资源,请参阅支持的资源。 例如"resource.github.name.contains('cloudbuild')"。ACTION:满足condition时要执行的操作。可以是ALLOW或DENY。DISPLAY_NAME:限制条件的直观易记名称。 此字段的最大长度为 200 个字符。DESCRIPTION:直观易懂的限制条件说明,在违反政策时显示为错误消息。 此字段的最大长度为 2,000 个字符。- 在 Google Cloud 控制台中,前往组织政策页面。
 - 在项目选择器中,选择要设置组织政策的项目。
 - 从组织政策页面上的列表中选择您的限制条件,以查看该限制条件的政策详情页面。
 - 如需为该资源配置组织政策,请点击管理政策。
 - 在修改政策页面,选择覆盖父级政策。
 - 点击添加规则。
 - 在强制执行部分中,选择开启还是关闭此组织政策的强制执行。
 - (可选)如需使组织政策成为基于某个标记的条件性政策,请点击添加条件。请注意,如果您向组织政策添加条件规则,则必须至少添加一个无条件规则,否则无法保存政策。如需了解详情,请参阅设置带有标记的组织政策。
 - 点击测试更改以模拟组织政策的效果。政策模拟不适用于旧版托管式限制。如需了解详情,请参阅使用 Policy Simulator 测试组织政策更改。
 - 若要完成并应用组织政策,请点击设置政策。该政策最长需要 15 分钟才能生效。
 - 
        
PROJECT_ID:要对其实施限制条件的项目。 - 
        
CONSTRAINT_NAME:您为自定义限制条件定义的名称。例如,custom.enableBuildTrigger。 - Cloud Build build 配置
resource.source.storageSource.bucketresource.source.storageSource.objectresource.source.storageSource.generationresource.source.storageSource.sourceFetcherresource.source.repoSource.projectIdresource.source.repoSource.repoNameresource.source.repoSource.branchNameresource.source.repoSource.tagNameresource.source.repoSource.commitSharesource.source.repoSource.dirresource.source.repoSource.invertRegexresource.source.repoSource.substitutionsresource.source.gitSource.urlresource.source.gitSource.dirresource.source.gitSource.revisionresource.source.storageSourceManifest.bucketresource.source.storageSourceManifest.objectresource.source.storageSourceManifest.generationresource.source.connectedRepository.repositoryresource.source.connectedRepository.dirresource.source.connectedRepository.revisionresource.source.developerConnectConfig.gitRepositoryLinkresource.source.developerConnectConfig.dirresource.source.developerConnectConfig.revisionresource.steps.nameresource.steps.envresource.steps.argsresource.steps.dirresource.steps.idresource.steps.waitForresource.steps.entryPointsresource.steps.secretEnvresource.steps.volumes.nameresource.steps.volumes.pathresource.steps.timeoutresource.steps.allowFailureresource.steps.allowExitCodesresource.steps.scriptresource.steps.automapSubstitutionsresource.timeoutresource.imagesresource.queueTtlresource.artifacts.imagesresource.artifacts.objects.locationresource.artifacts.objects.pathsresource.logsBucketresource.options.sourceProvenanceHashresource.options.requestedVerifyOptionresource.options.machineTyperesource.options.diskSizeGbresource.options.substitutionOptionresource.options.dynamicSubstitutionsresource.options.autoMapSubstitutionsresource.options.logStreamingOptionresource.options.pool.nameresource.options.loggingresource.options.envresource.options.secretEnvresource.options.volumes.nameresource.options.volumes.pathresource.options.defaultLogsBucketBehaviorresource.substitutionsresource.tagsresource.secrets.kmsKeyNameresource.secrets.secretEnvresource.serviceAccountresource.availableSecrets.secretManager.versionNameresource.availableSecrets.secretManager.envresource.availableSecrets.inline.kmsKeyNameresource.availableSecrets.inline.envMapresource.gitConfig.proxySecretVersionNameresource.gitConfig.proxySslCaInforesource.gitConfig.http
 - Cloud Build BitbucketServerConfig
resource.nameresource.hostUrlresource.secrets.adminAccessTokenVersionNameresource.secrets.readAccessTokenVersionNameresource.secrets.webhookSecretVersionNameresource.usernameresource.apiKeyresource.peeredNetworkresource.sslCaresource.peeredNetworkIpRange
 - Cloud Build WorkerPool 配置
resource.displayNameresource.annotationsresource.privatePoolV1Config.workerConfig.machineTyperesource.privatePoolV1Config.workerConfig.diskSizeGbresource.privatePoolV1Config.networkConfig.peeredNetworkresource.privatePoolV1Config.networkConfig.egressOptionresource.privatePoolV1Config.networkConfig.peeredNetworkIpRange
 - Cloud Build BuildTrigger 配置
resource.tagsresource.resourceNameresource.descriptionresource.nameresource.tagsresource.triggerTemplate.projectIdresource.triggerTemplate.repoNameresource.triggerTemplate.branchNameresource.triggerTemplate.tagNameresource.triggerTemplate.commitSharesource.triggerTemplate.dirresource.triggerTemplate.invertRegexresource.triggerTemplate.substitutionsresource.github.ownerresource.github.nameresource.github.enterpriseConfigResourceNameresource.pubsubConfig.topicresource.pubsubConfig.serviceAccountEmailresource.webhookConfig.secretresource.bitbucketServerTriggerConfig.repoSlugresource.bitbucketServerTriggerConfig.projectKeyresource.bitbucketServerTriggerConfig.pullRequest.branchresource.bitbucketServerTriggerConfig.pullRequest.commentControlresource.bitbucketServerTriggerConfig.pullRequest.invertRegexresource.bitbucketServerTriggerConfig.push.branchresource.bitbucketServerTriggerConfig.push.tagresource.bitbucketServerTriggerConfig.push.invertRegexresource.gitlabEnterpriseEventsConfig.projectNamespaceresource.gitlabEnterpriseEventsConfig.pullRequest.branchresource.gitlabEnterpriseEventsConfig.pullRequest.commentControlresource.gitlabEnterpriseEventsConfig.pullRequest.invertRegexresource.gitlabEnterpriseEventsConfig.push.branchresource.gitlabEnterpriseEventsConfig.push.tagresource.gitlabEnterpriseEventsConfig.push.invertRegexresource.gitlabEnterpriseEventsConfig.gitlabConfigResourceresource.disabledresource.substitutionsresource.ignoredFilesresource.includedFilesresource.sourceToBuild.uriresource.sourceToBuild.repositoryresource.sourceToBuild.refresource.sourceToBuild.repoTyperesource.sourceToBuild.githubEnterpriseConfigresource.approvalConfig.approvalRequiredresource.filterresource.serviceAccountresource.eventTyperesource.includeBuildLogsresource.repositoryEventConfig.repositoryresource.repositoryEventConfig.pullRequest.branchresource.repositoryEventConfig.pullRequest.commentControlresource.repositoryEventConfig.pullRequest.invertRegexresource.repositoryEventConfig.push.branchresource.repositoryEventConfig.push.tagresource.repositoryEventConfig.push.invertRegex
 - Cloud Build GitHubEnterpriseConfig 配置
resource.nameresource.hostUrlresource.appIdresource.nameresource.webhookKeyresource.peeredNetworkresource.secrets.privateKeyVersionNameresource.secrets.webhookSecretVersionNameresource.secrets.oauthSecretVersionNameresource.secrets.oauthClientIdVersionNameresource.displayNameresource.sslCa
 - Cloud Build 连接配置
resource.nameresource.githubConfig.authorizerCredential.oauthTokenSecretVersionNameresource.githubConfig.appInstallationIdresource.githubEnterpriseConfig.hostUriresource.githubEnterpriseConfig.apiKeyresource.githubEnterpriseConfig.appIdresource.githubEnterpriseConfig.appSlugresource.githubEnterpriseConfig.privateKeySecretVersionresource.githubEnterpriseConfig.webhookSecretSecretVersionresource.githubEnterpriseConfig.oauthSecretSecretVersionresource.githubEnterpriseConfig.oauthClientIdSecretVersionresource.githubEnterpriseConfig.authorizerCredential.oauthTokenSecretVersionNameresource.githubEnterpriseConfig.appInstallationIdresource.githubEnterpriseConfig.serviceDirectoryConfig.serviceresource.githubEnterpriseConfig.sslCaresource.gitlabConfig.hostUriresource.gitlabConfig.webhookSecretSecretVersionresource.gitlabConfig.readAuthorizerCredential.oauthTokenSecretVersionNameresource.gitlabConfig.authorizerCredential.oauthTokenSecretVersionNameresource.gitlabConfig.serviceDirectoryConfig.serviceresource.gitlabConfig.sslCaresource.gitlabConfig.serviceDirectoryConfig.serviceresource.bitbucketDataCenterConfig.hostUriresource.bitbucketDataCenterConfig.webhookSecretSecretVersionresource.bitbucketDataCenterConfig.readAuthorizerCredential.oauthTokenSecretVersionNameresource.bitbucketDataCenterConfig.authorizerCredential.oauthTokenSecretVersionNameresource.bitbucketDataCenterConfig.sslCaresource.bitbucketDataCenterConfig.serviceDirectoryConfig.serviceresource.bitbucketCloudConfig.workspaceresource.bitbucketCloudConfig.webhookSecretSecretVersionresource.bitbucketCloudConfig.readAuthorizerCredential.oauthTokenSecretVersionNameresource.bitbucketCloudConfig.authorizerCredential.oauthTokenSecretVersionName
 - Cloud Build 代码库配置
resource.nameresource.remoteUriresource.annotations
 ORGANIZATION_ID:您的组织 ID,例如123456789。
所需的角色
如需获得管理组织政策所需的权限,请让您的管理员为您授予组织资源的 Organization Policy Administrator (
roles/orgpolicy.policyAdmin) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。您还需要向自己的用户账号添加创建 Cloud Build 所需的角色。请参阅配置对 Cloud Build 资源的访问权限。如需详细了解与 Cloud Build 关联的 IAM 角色,请参阅 IAM 角色和权限。
创建自定义限制条件
您可以使用 YAML 文件来定义受限制条件约束的资源、方法、条件和操作,从而创建自定义限制条件。这些限制条件专门针对您要强制执行组织政策的服务。自定义限制条件的条件必须使用通用表达式语言进行定义。请参阅有关通用表达式语言 (CEL) 的 GitHub 页面。如需详细了解如何使用 CEL 构建自定义限制条件中的条件,请参阅创建和管理自定义限制条件的 CEL 部分。
使用以下模板为自定义限制条件创建 YAML 文件:
name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME resourceTypes: - cloudbuild.googleapis.com/RESOURCE_NAME methodTypes: - CREATE - UPDATE condition: "CONDITION" actionType: ACTION displayName: DISPLAY_NAME description: DESCRIPTION替换以下内容:
如需详细了解如何创建自定义限制条件,请参阅创建和管理自定义组织政策。
设置自定义限制条件
为新的自定义限制条件创建 YAML 文件后,您必须对其进行设置,以使其可用于组织中的组织政策。如需设置自定义限制条件,请使用gcloud org-policies set-custom-constraint命令: 将gcloud org-policies set-custom-constraint CONSTRAINT_PATH
CONSTRAINT_PATH替换为自定义限制条件文件的完整路径。例如/home/user/customconstraint.yaml。完成后,您的自定义限制条件会成为 Google Cloud 组织政策列表中的组织政策。如需验证自定义限制条件是否存在,请使用gcloud org-policies list-custom-constraints命令: 将gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
ORGANIZATION_ID替换为您的组织资源的 ID。 如需了解详情,请参阅查看组织政策。强制执行自定义组织政策
如需强制执行限制条件,您可以创建引用该限制条件的组织政策,并将该组织政策应用于 Google Cloud 资源。控制台
gcloud
如需创建包含布尔值规则的组织政策,请创建引用该限制条件的 YAML 政策文件:
name: projects/PROJECT_ID/policies/CONSTRAINT_NAME spec: rules: - enforce: true
请替换以下内容:
如需强制执行包含限制条件的组织政策,请运行以下命令:
gcloud org-policies set-policy POLICY_PATH
将
POLICY_PATH替换为组织政策 YAML 文件的完整路径。该政策最长需要 15 分钟才能生效。测试自定义限制条件
如需测试自定义限制条件,请运行尝试完成被限制条件阻止的任务的 gcloud 命令。
例如,假设某项限制要求 GitHub 触发器名称包含“cloudbuild”。您可以运行
gcloud builds triggers create github命令并使用其他触发器名称来测试此限制,如以下代码段所示:gcloud builds triggers create github --name=github-trigger \ --repo-owner=some-owner \ --repo-name=some-repo \ --branch-pattern=main \ --build-config=cloudbuild.yaml \ --project=my-project \输出类似于以下内容:
Operation denied by custom org policies: ["customConstraints/custom.enableBuildTrigger": "GitHub trigger name must include "cloudbuild"."]Cloud Build 支持的资源和操作
在创建或更新 Cloud Build 资源时,您可以使用以下 Cloud Build 自定义限制条件字段。
请注意,由触发器触发的 build 不会强制执行对 build 的限制。
常见用例的自定义组织政策示例
下表列出了一些可能有用的自定义组织政策的语法:
说明 限制条件语法 仅允许创建监听包含“cloud-builds”的主题的 Pub/Sub 触发器 name: organizations/ORGANIZATION_ID/customConstraints/custom.enableCloudBuildPubsubTrigger resourceTypes: - cloudbuild.googleapis.com/BuildTrigger methodTypes: - CREATE condition: "resource.pubsubConfig != null && resource.pubsubConfig.topic.contains('cloud-builds')" actionType: ALLOW displayName: Enable creating Pub/Sub trigger that listens on topics that contain "cloud-builds". description: Only allow creating Pub/Sub trigger that listens on topics that contain "cloud-builds".
后续步骤