使用自定义组织政策

Google Cloud 借助组织政策,您可以对组织的资源进行程序化集中控制。作为组织政策管理员,您可以定义组织政策,这是一组称为限制条件的限制,会应用于 Google Cloud 资源层次结构中的Google Cloud 资源及其后代。您可以在组织、文件夹或项目级强制执行组织政策。

组织政策为各种Google Cloud 服务提供预定义限制条件。但是,如果您想要更精细地控制和自定义组织政策中受限的特定字段,还可以创建自定义组织政策。

优势

  • 安全、合规性和治理:您可以使用自定义组织政策,具体如下所示:
    • 如需强制执行安全要求,您可以强制使用客户管理的加密密钥 (CMEK)。
    • 您可以限制在创建或更新代码库时传递的任何字段。

政策继承

如果您对资源强制执行政策,默认情况下,该资源的后代会继承组织政策。例如,如果您对某个文件夹强制执行一项政策, Google Cloud 会对该文件夹中的所有项目强制执行该政策。如需详细了解此行为及其更改方式,请参阅层次结构评估规则

价格

组织政策服务(包括预定义组织政策和自定义组织政策)可免费使用。

准备工作

  1. 启用 Artifact Registry 并安装 Google Cloud CLI。
  2. (可选)为 gcloud CLI 命令配置默认值
  3. 如果您需要使用客户管理的加密密钥 (CMEK) 加密代码库内容,请在 Cloud KMS 中为代码库创建并启用密钥。
  4. 请确保您知道您的组织 ID

所需的角色

如需获得管理组织政策所需的权限,请让您的管理员为您授予以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

这些预定义角色包含管理组织政策所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

管理组织政策需要以下权限:

  • orgpolicy.constraints.list
  • orgpolicy.policies.create
  • orgpolicy.policies.delete
  • orgpolicy.policies.list
  • orgpolicy.policies.update
  • orgpolicy.policy.get
  • orgpolicy.policy.set

您也可以使用自定义角色或其他预定义角色来获取这些权限。

创建自定义限制条件

自定义限制条件是在 YAML 文件中,由实施组织政策的服务所支持的资源、方法、条件和操作定义的。自定义限制条件的条件使用通用表达式语言 (CEL) 进行定义。如需详细了解如何使用 CEL 构建自定义限制条件中的条件,请参阅创建和管理自定义限制条件的 CEL 部分。

Artifact Registry 支持应用于 REPOSITORY 资源的 CREATEUPDATE 方法的自定义约束条件。

为自定义限制条件创建一个类似如下所示的 YAML 文件:

name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
resourceTypes:
- artifactregistry.googleapis.com/Repository
methodTypes:
- CREATE
- UPDATE
condition: "CONDITION"
actionType: ACTION
displayName: DISPLAY_NAME
description: DESCRIPTION

替换以下内容:

  • ORGANIZATION_ID:您的组织 ID,例如 123456789

  • CONSTRAINT_NAME:新的自定义限制条件的名称。 自定义限制条件必须以 custom. 开头,只能包含大写字母、小写字母或数字,例如 custom.enableDockerRemotes。该字段的长度上限为 70 个字符,不计算前缀,例如 organizations/123456789/customConstraints/custom.enableDockerRemotes

  • CONDITION:针对受支持的服务资源的表示法编写的 CEL 条件。此字段的长度上限为 1,000 个字符。 如需详细了解可用于针对其编写条件的资源(例如 (resource.mode == 'REMOTE' && resource.format == 'DOCKER') || (resource.mode != 'REMOTE')),请参阅支持的资源

  • ACTION:满足 condition 时要执行的操作。可以是 ALLOWDENY

  • DISPLAY_NAME:限制条件的直观易记名称。 此字段的最大长度为 200 个字符。

  • DESCRIPTION:直观易懂的限制条件说明,在违反政策时显示为错误消息。 此字段的长度上限为 2,000 个字符,例如 All remote repositories must be Docker format.

如需详细了解如何创建自定义限制条件,请参阅定义自定义限制条件

设置自定义限制条件

为新的自定义限制条件创建 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 资源。

控制台

  1. 在 Google Cloud 控制台中,转到组织政策页面。

    转到组织政策

  2. 在项目选择器中,选择要设置组织政策的项目。
  3. 组织政策页面上的列表中选择您的限制条件,以查看该限制条件的政策详情页面。
  4. 如需为该资源配置组织政策,请点击管理政策
  5. 修改政策页面,选择覆盖父级政策
  6. 点击添加规则
  7. 强制执行部分中,选择开启还是关闭此组织政策的强制执行。
  8. (可选)如需使组织政策成为基于某个标记的条件性政策,请点击添加条件。请注意,如果您向组织政策添加条件规则,则必须至少添加一个无条件规则,否则无法保存政策。如需了解详情,请参阅设置带有标记的组织政策
  9. 如果是自定义限制条件,您可以点击测试更改来模拟此组织政策的效果。如需了解详情,请参阅使用 Policy Simulator 测试组织政策更改
  10. 若要完成并应用组织政策,请点击设置政策。该政策最长需要 15 分钟才能生效。

gcloud

如需创建强制执行布尔值限制条件的组织政策,请创建引用该限制条件的 YAML 政策文件:

      name: projects/PROJECT_ID/policies/CONSTRAINT_NAME
      spec:
        rules:
        - enforce: true
    

请替换以下内容:

  • PROJECT_ID:要对其实施限制条件的项目。
  • CONSTRAINT_NAME:您为自定义限制条件定义的名称。例如,custom.enableDockerRemotes

如需强制执行包含限制条件的组织政策,请运行以下命令:

    gcloud org-policies set-policy POLICY_PATH
    

POLICY_PATH 替换为组织政策 YAML 文件的完整路径。该政策最长需要 15 分钟才能生效。

测试自定义组织政策

以下远程仓库创建示例假定已创建自定义组织政策并在创建仓库时强制执行该政策,以便仅允许创建 Docker 格式的远程仓库。

尝试在项目中创建 Python 远程代码库:

  gcloud artifacts repositories create REMOTE-REPOSITORY-NAME \
      --project=PROJECT_ID \
      --repository-format=python \
      --location=LOCATION \
      --description="DESCRIPTION" \
      --mode=remote-repository \
      --remote-repo-config-desc="REMOTE-REPOSITORY-DESCRIPTION" \
      --disable-vulnerability-scanning \
      --remote-python-repo=UPSTREAM

用于对上游代码库进行身份验证的可选标志:

  • --remote-username=USERNAME
  • --remote-password-secret-version=SECRET_VERSION

    替换以下内容:

  • REMOTE-REPOSITORY-NAME 替换为代码库的名称。对于项目中的每个代码库位置,代码库名称不得重复。

  • PROJECT_ID 替换为项目 ID。如果省略此标志,则系统会使用当前项目或默认项目。

  • LOCATION 为代码库的单区域或多区域位置。如果您设置默认值,则可以省略此标志。如需查看受支持位置的列表,请运行 gcloud artifacts locations list 命令。

  • DESCRIPTION,其中包含可选的代码库说明。请勿添加敏感数据,因为代码库说明不会加密。

  • REMOTE-REPOSITORY-DESCRIPTION,其中包含此远程代码库的外部代码库配置的说明。

  • USERNAME(可选):如果您使用身份验证,则为您的用户名,用于对上游代码库进行身份验证。

  • SECRET_VERSION(可选)如果您使用身份验证,则 Secret 版本应包含上游代码库密码。

  • UPSTREAM 使用预设的上游名称、Artifact Registry 制品库路径或上游制品库的用户定义网址。

    对于 Artifact Registry 上游仓库,请将仓库路径的格式设置为类似于以下内容:projects/UPSTREAM_PROJECT_ID/locations/REGION/repositories/UPSTREAM_REPOSITORY

    如需了解可用的预设上游和受支持的用户定义上游,请参阅支持的格式

  • --disable-vulnerability-scanning:是一个可选标志,用于配置代码库以停用自动漏洞扫描。

  • --allow-vulnerability-scanning:是一个可选标志,用于配置代码库以允许自动漏洞扫描。如需了解详情,请参阅启用或停用自动扫描

    例如,以下命令会在 Google Cloud project my-projectus-east1 区域中创建一个名为 my-repo 的远程代码库,并且可以使用用户名 my-username 和 Secret 版本 projects/my-project/secrets/my-secret/versions/1 对上游代码库进行身份验证。

    gcloud artifacts repositories create my-repo \
        --project=my-project \
        --repository-format=python \
        --location=us-east1 \
        --description="Remote Python repository" \
        --mode=remote-repository \
        --remote-repo-config-desc="PyPI" \
        --remote-username=my-username \
        --remote-password-secret-version=projects/my-project/secrets/my-secret/versions/1 \
        --remote-python-repo=PYPI
    

输出如下所示:

Operation denied by custom org policies: ["customConstraints/custom.enableDockerRemotes": "All remote repositories must be Docker format."]

Artifact Registry 支持的资源

Artifact Registry 支持对所有字段设置自定义约束条件,以便对代码库资源执行创建和更新操作。

常见用例的自定义组织政策示例

下表提供了一些可能对您有用的自定义组织政策的语法:

说明 限制条件语法
要求 env 标签为 PRODSTAGING 才能创建代码库
    name: organizations/ORGANIZATION_ID/customConstraints/custom.requireEnvProdStaging
    resourceTypes:
    - artifactregistry.googleapis.com/Repository
    methodTypes:
    - CREATE
    condition: "resource.labels.env in ['PROD', 'STAGING']"
    actionType: ALLOW
    displayName: PROD and STAGING environments
    description: All repositories must have env labels for either PROD or STAGING.
停用创建远程代码库
    name: organizations/ORGANIZATION_ID/customConstraints/custom.disableRemotes
    resourceTypes:
    - artifactregistry.googleapis.com/Repository
    methodTypes:
    - CREATE
    condition: "resource.mode in ['STANDARD', 'VIRTUAL']"
    actionType: ALLOW
    displayName: Disable remote repository creation
    description: All repositories must be standard or virtual mode.
强制为 Docker 格式代码库实现标记不可变性
    name: organizations/ORGANIZATION_ID/customConstraints/custom.enableAutoUpgrade
    resourceTypes:
    - artifactregistry.googleapis.com/Repository
    methodTypes:
    - CREATE
    condition: "resource.format == 'DOCKER' && !resource.dockerConfig.immutableTags"
    actionType: DENY
    displayName: Enforce tag immutability
    description: All new Docker repositories must have tag immutability enabled.
要求使用 CMEK 密钥
    name: organizations/ORGANIZATION_ID/customConstraints/custom.enableAutoUpgrade
    resourceTypes:
    - artifactregistry.googleapis.com/Repository
    methodTypes:
    - CREATE
    condition: "resource.kmsKeyName.contains('projects/my-project/')"
    actionType: ALLOW
    displayName: Enforce the use of a CMEK key from my-project
    description: All repositories must be created with a CMEK key from my-project.

后续步骤