組織のポリシーの構成

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

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

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 グループ kinds
    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

    サービスがテーブルに複数の種類をリストしている場合(Database Service など)、制限する個々の種類のみを指定できます。たとえば、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 Namespace の 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"]