組織のポリシーの構成

組織のポリシーを使用すると、組織のリソースをプログラマティックに一元管理できます。組織のポリシー管理者は、組織全体にポリシーを構成して、次のメリットを実現できます。

  • 組織のリソースの使用方法に関する制限を構成して集中管理できます。
  • 開発チームがコンプライアンスを遵守できるように違反防止策の定義と確立ができます。
  • プロジェクト オーナーとチームがコンプライアンスに違反することなく迅速に行動できるように支援する。

Google Distributed Cloud(GDC)エアギャップには、組織のポリシーを作成して管理するためのコンソール UI や専用の CLI はありません。Kubernetes API または kubectl CLI を使用する必要があります。

Identity and Access Management との相違点

Identity and Access Management(IAM)と組織のポリシーは、アクセスとガバナンスの機能を補完します。

  • IAM は権限の付与に重点を置いています。これは、誰(ユーザー、グループ、サービス アカウントなどのメンバー)が、どのリソース(リソース スコープ)に対してどのような操作(ロール)を実行できるかを定義します。IAM ロールを介して付与される権限は付加的なものであり、拒否ルールはありません。
  • 組織のポリシーは、ガードレールの確立に重点を置いています。管理者は、組織全体のリソースにプログラムによる制限を構成できます。たとえば、特定のサービスを無効にしたり、属性ベースのアクセス制御(ABAC)を使用してサブジェクト属性に基づいてリソースの変更を制限したりできます。組織のポリシーは、メンバーが IAM ロールを保持している場合でも、オペレーションをブロックするために優先されます。

始める前に

組織のポリシーを構成する前に、必要な権限をリクエストして環境を準備する必要があります。

IAM ロールをリクエストする

IAM 組織管理者に連絡して、実行する必要があるタスクに基づいて次の IAM ロールをリクエストします。

  • 制限付きサービス ポリシー管理者(gdchrestrictedservice-policy-admin): 制限付きサービス ポリシーを作成、更新、削除します。
  • 属性による制限ポリシー管理者(gdchrestrictbyattributes-policy-admin): 属性ベースのアクセス制御ポリシーを作成、更新、削除します。

環境を準備する

ポリシーを構成する

GDC では、次の 2 種類の組織のポリシーを構成できます。

  • 制限付きサービス ポリシー(GDCHRestrictedService): クラスタで使用または変更できるサービスを制限します。
  • 属性ベースのアクセス制御ポリシー(GDCHRestrictByAttributes): ID プロバイダからマッピングされたサブジェクト属性に基づいて、クラスタ内のリソースへのアクセスを条件付きで制限します。

制限付きサービス ポリシーを構成する

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 をリストします(すべての種類を指定します)。

    デフォルトでは、ポリシーはクラスタ内のすべての Namespace に適用されます。ポリシーのスコープを特定の Namespace またはプロジェクトに設定するには、クラスタ内の組織のポリシーのスコープを定義するをご覧ください。

    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

    サービスがテーブルに複数の種類(データベース サービスなど)を一覧表示している場合は、制限する個々の種類のみを指定できます。たとえば、DBCluster オペレーションを許可したまま、Restore オペレーションをブロックできます。

    次の例では、マーケットプレイス サービスの更新を制限しています。

    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 ポリシーを作成できます。たとえば、このポリシータイプを使用して、ストレージ バケットに対する書き込みオペレーションまたは変更オペレーションを制限し、特定の ID 属性(citizenship=USA や citizenship=UK など)を持つユーザーまたはサービス アカウントのみが実行できるようにします。

このポリシーは、リソースと同じクラスタに作成します。クラスタ内に、異なるリソースまたはプロジェクトに対して複数のポリシー インスタンスを作成できます。

属性ベースのアクセス制御ポリシーを構成します。

  1. IdentityProviderConfig リソースのカスタム ID 属性をマッピングするパッチ JSON ファイルを作成します。

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

    CUSTOM_ATTRIBUTE は、マッピングする ID 属性の名前(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: ID プロバイダが存在するクラスタの 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: ID プロバイダからマッピングされたカスタム サブジェクト属性(citizenship など)。

    • ALLOWED_ATTRIBUTE_VALUE: カスタム属性に許可される値(USA など)。属性が許可された値のいずれとも一致しないサブジェクトからのリクエストは拒否されます。

    デフォルトでは、ポリシーはクラスタ内のすべての Namespace に適用されます。ポリシーのスコープを特定の Namespace またはプロジェクトに設定するには、クラスタ内の組織のポリシーのスコープを定義するをご覧ください。

    次の例では、project-foo Namespace 内の 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: 組織のポリシー ファイルの名前

クラスタ内の組織のポリシーのスコープを定義する

組織のポリシーを定義するときは、すべての Namespace、特定の Namespace、または指定されたリストを除くすべての Namespace に影響するかどうかを決定します。これを行うには、ポリシー定義の .spec.match.excludedNamespaces、.spec.match.namespaceSelector、.spec.match.namespaces、.spec.match.scope パラメータを組み合わせて使用します。

これらのパラメータの詳細については、組織のポリシーの一致セクションのページをご覧ください。たとえば、ラベル owner: dba-team を持つ Namespace でのみデータベースの作成を許可するには、次のポリシーを作成します。

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 を使用してポリシーを削除します。ポリシーが定義されているクラスタへのアクセス権と、ポリシータイプに対応する IAM ロール(gdchrestrictedservice-policy-admin や gdchrestrictbyattributes-policy-admin など)を付与する kubeconfig ファイルを使用します。

組織ポリシーを削除する:

kubectl --kubeconfig CLUSTER_KUBECONFIG delete \
    POLICY_TYPE/POLICY_NAME

次のように置き換えます。

  • CLUSTER_KUBECONFIG: 組織のポリシーが存在するクラスタの kubeconfig ファイル

  • POLICY_TYPE: 削除する組織ポリシーのタイプ(GDCHRestrictedService、GDCHRestrictByAttributes など)

  • POLICY_NAME: 削除する組織のポリシーの名前

監査モードでポリシーをテストする

ポリシーを適用せずにテストできます。ポリシーをテストして、ポリシーが既存のシステムを破損しないことを確認してから、ポリシーをロールアウトします。または、動作の広がりを推定します。テストを追加するには、ポリシー定義に enforcementAction を追加します。このパラメータには次の 3 つの値を使用できます。

  • 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"]