配置组织政策

借助组织政策,您可以通过程序化方式对组织的资源进行集中控制。作为组织政策管理员,您可以在整个组织中配置政策,以实现以下优势:

  • 集中控制以配置关于如何使用组织资源的限制。
  • 为开发团队定义和制定安全措施,使其保持在合规性边界内。
  • 帮助 Project Owner 及其团队快速行动,同时不违反合规性。

Google Distributed Cloud (GDC) 网闸隔离配置不提供用于创建和管理组织政策的控制台界面或专用 CLI。您必须使用 Kubernetes API 或 kubectl CLI。

与身份和访问权限管理的区别

Identity and Access Management (IAM) 和组织政策具有互补的访问和治理功能:

  • IAM 侧重于授予权限。它定义了谁(成员,例如用户、群组或服务账号)可以对哪些资源(资源范围)执行哪些操作(角色)。通过 IAM 角色授予的权限是累加的,没有拒绝规则。
  • 组织政策侧重于建立安全防护机制。借助这些政策,管理员可以对整个组织中的资源配置程序化限制,例如停用特定服务,或使用基于属性的访问权限控制 (ABAC) 根据主体属性限制资源修改。组织政策优先于 IAM 角色,即使成员拥有 IAM 角色,组织政策也会阻止操作。

准备工作

在配置组织政策之前,您必须请求必要的权限并准备好环境。

申请 IAM 角色

请与您的 IAM 组织管理员联系,根据您需要执行的任务申请以下 IAM 角色:

  • Restricted Service Policy Admin (gdchrestrictedservice-policy-admin):创建、更新和删除受限服务政策。
  • Restrict By Attributes Policy Admin (gdchrestrictbyattributes-policy-admin):创建、更新和删除基于属性的访问权限控制政策。

准备环境

配置政策

您可以在 GDC 中配置两种类型的组织政策:

  • 受限服务政策 (GDCHRestrictedService):限制您可以在集群中使用或修改的服务。
  • 基于属性的访问权限控制政策 (GDCHRestrictByAttributes):根据从身份提供方映射的主体属性,有条件地限制对集群中资源的访问。

配置受限服务政策

借助 GDCHRestrictedService 政策类型,您可以通过屏蔽特定 API 来限制可在集群中使用或修改的服务,例如将服务限制为特定项目,或在测试新服务时屏蔽对该服务的访问。在服务资源所在的集群中创建此政策。您可以在集群中为不同的服务或项目创建多个政策实例。

GDCHRestrictedService 支持 CREATE、UPDATE 和 DELETE 操作。如需限制 GET 和 LIST 读取操作,请使用 IAM 角色绑定来授予和撤消访问权限。

配置受限服务政策:

  1. 定义政策清单:

    apiVersion: constraints.gatekeeper.sh/v1beta1
    kind: GDCHRestrictedService
    metadata:
      name: POLICY_NAME
    spec:
      match:
        kinds:
          - apiGroups:
              - "API_GROUP"
            kinds:
              - "KIND"
      parameters:
        disabledOperations:
          - DISABLED_OPERATION
    

    替换以下内容:

    • POLICY_NAME:组织政策的名称。

    • API_GROUP:要限制的服务的 API 组,如下面的受支持服务表中所列。

    • KIND:要限制的资源种类,如下面的受支持服务表中所列。

    • DISABLED_OPERATION:此政策屏蔽的操作组。允许的值包括 CREATE、UPDATE 和 DELETE。 disabledOperations 字段的默认值为 *。如需完全停用某项服务,请列出 CREATE、UPDATE 和 DELETE(并指定其所有类型)。

    默认情况下,该政策会应用于集群中的所有命名空间。如需将政策范围限定为特定命名空间或项目,请参阅在集群中定义组织政策的范围。

    GDCHRestrictedService 政策支持 GDC 上的以下部分服务:

    服务 API 组 种类
    Marketplace marketplace.gdc.goog MarketplaceService
    Vertex AI Workbench aiplatform.gdc.goog Notebook
    数据库服务 - Postgres postgresql.dbadmin.gdc.goog
    • DBCluster
    • BackupPlan
    • Import
    • Restore
    Transfer Appliance system.gpc.gke.io TransferApplianceRequest
    备份 backup.gdc.goog BackupRepositoryManager
    Dataproc Container for Spark(Marketplace 服务) sparkoperator.k8s.io SparkApplication

    如果某项服务在表中列出了多种类型(例如数据库服务),您只能指定要限制的个别类型。例如,您可以屏蔽 Restore 操作,同时继续允许 DBCluster 操作。

    以下示例限制了对 Marketplace 服务的更新:

    apiVersion: constraints.gatekeeper.sh/v1beta1
    kind: GDCHRestrictedService
    metadata:
      name: no-update-to-marketplace-service
    spec:
      match:
        kinds:
        - apiGroups:
          - "marketplace.gdc.goog"
          kinds:
          - MarketplaceService
      parameters:
        disabledOperations:
          - "UPDATE"
    
  2. 使用 kubectl CLI 应用政策:

    kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f POLICY_NAME.yaml
    

    替换以下内容:

    • CLUSTER_KUBECONFIG:要应用政策的集群的 kubeconfig 文件
    • POLICY_NAME:组织政策文件的名称

配置基于属性的访问权限控制政策

借助 GDCHRestrictByAttributes 政策类型,您可以创建 ABAC 政策,以根据主体属性有条件地限制对资源的访问。例如,您可以使用此政策类型限制对存储桶的写入或修改操作,以便只有具有特定身份属性(例如 citizenship=USA 或 citizenship=UK)的用户或服务账号才能执行这些操作。

在资源所在的集群中创建此政策。您可以在集群中为不同的资源或项目创建多个政策实例。

配置基于属性的访问权限控制政策:

  1. 创建一个补丁 JSON 文件,用于为 IdentityProviderConfig 资源映射自定义身份属性:

    cat <<EOF > attributeMapping-patch.json
    {
      "CUSTOM_ATTRIBUTE": "assertion[\"CUSTOM_ATTRIBUTE\"]"
    }
    EOF
    

    将 CUSTOM_ATTRIBUTE 替换为要映射的身份属性的名称,例如 citizenship。

  2. 在 platform 命名空间中修补 IdentityProviderConfig 资源:

    kubectl --kubeconfig CLUSTER_KUBECONFIG patch \
        IdentityProviderConfig IDENTITY_PROVIDER_CONFIG_NAME \
        -n platform --type=json \
        -p '[{"op":"add","path":"/spec/oidc/attributeMapping", "value": '"$(cat attributeMapping-patch.json)"'}]'
    

    替换以下内容:

    • CLUSTER_KUBECONFIG:身份提供方所在集群的 kubeconfig 文件
    • IDENTITY_PROVIDER_CONFIG_NAME:IdentityProviderConfig 资源的名称
  3. 定义政策清单:

    apiVersion: constraints.global.gatekeeper.sh/v1beta1
    kind: GDCHRestrictByAttributes
    metadata:
      name: POLICY_NAME
    spec:
      match:
        kinds:
          - apiGroups:
              - "API_GROUP"
            kinds:
              - "KIND"
      parameters:
        attributes:
          - CUSTOM_ATTRIBUTE
        attributeValues:
          - ALLOWED_ATTRIBUTE_VALUE
    

    替换以下内容:

    • POLICY_NAME:组织政策的名称。

    • API_GROUP:要限制的资源的 API 组,例如 object.gdc.goog。

    • KIND:要限制的资源种类,例如 Bucket。

    • CUSTOM_ATTRIBUTE:从身份提供方映射的自定义主体属性,例如 citizenship。

    • ALLOWED_ATTRIBUTE_VALUE:自定义属性的允许值,例如 USA。如果主体的属性与任何允许的值都不匹配,则其请求会被拒绝。

    默认情况下,该政策会应用于集群中的所有命名空间。如需将政策范围限定为特定命名空间或项目,请参阅在集群中定义组织政策的范围。

    以下示例将 project-foo 命名空间中 Bucket 资源的修改限制为具有 citizenship=USA 或 citizenship=UK 属性的主体:

    apiVersion: constraints.global.gatekeeper.sh/v1beta1
    kind: GDCHRestrictByAttributes
    metadata:
      name: restrict-by-citizenship
    spec:
      match:
        scope: Namespaced
        kinds:
          - apiGroups:
              - "object.gdc.goog"
            kinds:
              - Bucket
        namespaces:
          - project-foo
      parameters:
        attributes:
          - "citizenship"
        attributeValues:
          - "USA"
          - "UK"
    
  4. 使用 kubectl CLI 应用政策:

    kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f POLICY_NAME.yaml
    

    替换以下内容:

    • CLUSTER_KUBECONFIG:要应用政策的集群的 kubeconfig 文件
    • POLICY_NAME:组织政策文件的名称

定义集群内组织政策的应用范围

在定义组织政策时,请确定该政策是应影响所有命名空间、仅影响特定命名空间,还是影响除给定列表之外的所有命名空间。为此,请结合使用政策定义的 .spec.match.excludedNamespaces、.spec.match.namespaceSelector、.spec.match.namespaces 和 .spec.match.scope 参数。

如需详细了解这些参数,请参阅组织政策匹配部分页面。例如,如需仅允许在具有标签 owner: dba-team 的命名空间中创建数据库,请创建以下政策:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: GDCHRestrictedService
metadata:
  name: db-restricted-to-dbas
spec:
  match:
    scope: Namespaced
    namespaceSelector:
      matchExpressions:
      # We are restricting the use of the service in namespaces that
      # don't have the owner: dba-team label
      - key: owner
        operator: NotIn
        values:
        - dba-team
    kinds:
    - apiGroups:
      - "postgresql.dbadmin.gdc.goog"
      kinds:
      - DBCluster
      - BackupPlan
      - Import
      - Restore
  parameters:
    disabledOperations:
      - "UPDATE"
      - "CREATE"
      - "DELETE"

回滚现有政策

如需停止强制执行现有政策,请使用 kubectl CLI 将其删除。使用 kubeconfig 文件,该文件可让您访问定义了政策的集群以及与政策类型(例如 gdchrestrictedservice-policy-admin 或 gdchrestrictbyattributes-policy-admin)对应的 IAM 角色。

删除组织政策:

kubectl --kubeconfig CLUSTER_KUBECONFIG delete \
    POLICY_TYPE/POLICY_NAME

替换以下内容:

  • CLUSTER_KUBECONFIG:组织政策所在的集群的 kubeconfig 文件

  • POLICY_TYPE:要删除的组织政策的类型,例如 GDCHRestrictedService 或 GDCHRestrictByAttributes

  • POLICY_NAME:要删除的组织政策的名称

在审核模式下测试政策

您可以测试政策,而无需强制执行。在发布政策之前,请先测试政策,以确保政策不会破坏现有系统,或估算行为的广泛程度。如需添加测试,请在政策定义中添加 enforcementAction。此参数有三个可能的值:

  • deny:强制执行政策。这是默认设置。
  • dryrun:允许执行该操作,但您可以在审核日志和政策状态中看到存在违规行为。使用 kubectl --kubeconfig CLUSTER_KUBECONFIG get POLICY_TYPE/POLICY_NAME 检查违规行为。
  • warn:等同于 dryrun,但测试还会针对触发违规行为的请求显示警告。

例如,如需测试停用 Marketplace 的政策,请创建以下政策:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: GDCHRestrictedService
metadata:
  name: disable-marketplace-service-project-alice
spec:
  enforcementAction: warn
  match:
    kinds:
      - apiGroups: ["marketplace.gdc.goog"]
        kinds: ["MarketplaceService"]