カスタムの組織のポリシーを使用して GKE リソースに対するアクションを制限する


このページでは、Google Cloud 組織のポリシー サービスのカスタム制約を使用して、組織内の Google Kubernetes Engine(GKE)リソースに対する特定のオペレーションを制限する方法について説明します。組織のポリシーの詳細については、カスタムの組織のポリシーをご覧ください。

組織のポリシーと制約について

Google Cloud の組織のポリシーを使用すると、組織のリソースをプログラムで一元管理できます。組織ポリシー管理者は組織ポリシーを定義できます。組織ポリシーは、Google Cloud のリソース階層内の Google Cloud リソースやそれらのリソースの子孫に適用される、制約と呼ばれる一連の制限です。組織のポリシーは、組織レベル、フォルダレベル、またはプロジェクト レベルで適用できます。

組織のポリシーは、さまざまな Google Cloud サービスに事前に定義された制約を提供します。ただし、組織のポリシーで制限されている特定のフィールドをカスタマイズ可能な方法でよりきめ細かく制御する必要がある場合は、カスタム制約を作成して、カスタムの組織のポリシーでそれらのカスタム制約を使用することもできます。

GKE でサポートされているリソース

GKE の場合、出力専用フィールドと次のフィールドを除いて、Google Kubernetes Engine API v1 の Cluster または NodePool リソースの任意フィールドで、CREATE メソッドまたは UPDATE メソッドにカスタム制約を作成できます。

  • projects.locations.clusters.masterAuth.clientKey
  • projects.locations.clusters.masterAuth.password

ポリシーの継承

デフォルトでは、ポリシーは、そのポリシーを適用したリソースの子孫に継承されます。たとえば、フォルダにポリシーを適用した場合、Google Cloud によってそのフォルダ内のすべてのプロジェクトにそのポリシーが適用されます。この動作の詳細と変更方法については、階層評価ルールをご覧ください。

料金

組織のポリシーと制約に対して料金は発生しません。

始める前に

始める前に、次の作業が完了していることを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得する。

カスタム制約を作成する

新しいカスタム制約を作成するには、YAML ファイルで制約を定義し、Google Cloud CLI を使用して組織にカスタム制約を適用します。

  1. カスタム制約の YAML ファイルを作成します。

    name: organizations/ORGANIZATION_ID/customConstraints/custom.CONSTRAINT_NAME
    resourceTypes:
    - container.googleapis.com/RESOURCE_NAME
    methodTypes:
    - METHOD1
    - METHOD2
    condition: "resource.OBJECT_NAME.FIELD_NAME == VALUE"
    actionType: ACTION
    displayName: DISPLAY_NAME
    description: DESCRIPTION
    

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

    • ORGANIZATION_ID: 組織 ID(123456789 など)。
    • CONSTRAINT_NAME: 新しいカスタム制約に付ける名前。カスタム制約は custom. で始まる必要があり、大文字、小文字、数字のみを含めることができます(例: custom.enableGkeAutopilot)。このフィールドの最大長は 70 文字です。接頭辞はカウントされません(例: organizations/123456789/customConstraints/custom.)。
    • RESOURCE_NAME: 制限するオブジェクトとフィールドを含む GKE API REST リソースの名前(URI ではない)。たとえば、ClusterNodePool です。
    • METHOD1,METHOD2,...: 制約を適用する RESTful メソッドのリスト。CREATECREATEUPDATE のいずれかです。
    • condition: リクエストを検証する条件。Common Expression Language(CEL)で記述されます。このフィールドの最大長は 1,000 文字です。式には次のフィールドを配置する必要があります。また、&&|| などの論理演算子をサポートしています。

      • OBJECT_NAME: 制限する GKE API オブジェクトの名前(PascalCase の形式)。例: privateClusterConfig
      • FIELD_NAME: 制限する GKE API フィールドの名前(PascalCase の形式)。例: enablePrivateNodes
      • VALUE: フィールドの値。ブール値フィールドには true または false を使用します。文字列フィールドには "STRING" を使用します。
    • ACTION: condition が満たされている場合に実行するアクション。ALLOW または DENY になります。

    • DISPLAY_NAME: 制約の名前。わかりやすい名前を入力してください。このフィールドの最大長は 200 文字です。

    • DESCRIPTION: ポリシー違反時にエラー メッセージとして表示される制約の説明。わかりやすい説明を入力してください。このフィールドの最大長は 2,000 文字です。

  2. カスタム制約を適用します。

    gcloud org-policies set-custom-constraint PATH_TO_FILE
    

    PATH_TO_FILE は、カスタム制約定義のファイルパスに置き換えます。

  3. カスタム制約が存在することを確認します。

    gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
    

    出力は次のようになります。

    CONSTRAINT                     LIST_POLICY    BOOLEAN_POLICY    ETAG
    custom.enableGkeAutopilot      -              SET               COCsm5QGENiXi2E=
    ...
    

カスタム制約を適用する

新しいカスタム制約を適用するには、制約を参照する組織のポリシーを作成してから組織のポリシーを適用します。

  1. 組織のポリシーの YAML ファイルを作成します。

    name: RESOURCE_HIERARCHY/policies/POLICY_NAME
    spec:
      rules:
      - enforce: true
    

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

    • RESOURCE_HIERARCHY: 新しいポリシーのロケーション。これは適用範囲に影響します。Google Cloud のリソース階層をガイドとして使用してください。たとえば、特定のプロジェクトにポリシーを適用する場合は、projects/PROJECT_ID を使用します。特定の組織にポリシーを適用する場合は、organizations/ORGANIZATION_ID を使用します。
    • POLICY_NAME: 新しいポリシーの名前。
  2. ポリシーを適用します。

    gcloud org-policies set-policy PATH_TO_POLICY
    

    PATH_TO_POLICY は、ポリシー定義ファイルのパスに置き換えます。

  3. ポリシーが存在することを確認します。

    gcloud org-policies list \
        --RESOURCE_FLAG=RESOURCE_ID
    

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

    • RESOURCE_FLAG: ポリシーを適用した Google Cloud リソース。たとえば、projectfolder です。
    • RESOURCE_ID: ポリシーを適用したリソースの ID。たとえば、Google Cloud フォルダ ID です。

    引数のリストについては、gcloud org-policies list をご覧ください。

    出力は次のようになります。

    CONSTRAINT                                    LIST_POLICY    BOOLEAN_POLICY    ETAG
    iam.disableWorkloadIdentityClusterCreation    -              SET               CO3UkJAGEOj1qsQB
    custom.enableGkeAutopilot                     -              SET               COCsm5QGENiXi2E=
    custom.enableBinAuth                          -              SET               CJfKiZUGEJju7LUD
    

例: カスタム制約を作成してポリシーを適用する

次の例では、特定のプロジェクト内のすべての新しいクラスタが Autopilot クラスタであることを要求するカスタムの制約とポリシーを作成します。

始める前に、次のことを理解しておく必要があります。

  • 組織の ID
  • プロジェクト ID

制約を作成する

  1. 次のファイルに constraint-enable-autopilot.yaml という名前を付けて保存します。

    name: organizations/ORGANIZATION_ID/customConstraints/custom.enableGkeAutopilot
    resourceTypes:
    - container.googleapis.com/Cluster
    methodTypes:
    - CREATE
    condition: "resource.autopilot.enabled == false"
    actionType: DENY
    displayName: Enable GKE Autopilot
    description: All new clusters must be Autopilot clusters.
    

    これにより、新しいクラスタごとに、クラスタモードが Autopilot でない場合にオペレーションが拒否される制約が定義されます。

  2. 制約を適用します。

    gcloud org-policies set-custom-constraint ~/constraint-enable-autopilot.yaml
    
  3. 制約が存在することを確認します。

    gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
    

    出力は次のようになります。

    CUSTOM_CONSTRAINT                       ACTION_TYPE  METHOD_TYPES   RESOURCE_TYPES                     DISPLAY_NAME
    custom.enableGkeAutopilot               DENY         CREATE         container.googleapis.com/Cluster   Enable GKE Autopilot
    ...
    

ポリシーを作成する

  1. 次のファイルに policy-enable-autopilot.yaml という名前を付けて保存します。

    name: projects/PROJECT_ID/policies/custom.enableGkeAutopilot
    spec:
      rules:
      - enforce: true
    

    PROJECT_ID は、実際のプロジェクト ID に置き換えます。

  2. ポリシーを適用します。

    gcloud org-policies set-policy ~/policy-enable-autopilot.yaml
    
  3. ポリシーが存在することを確認します。

    gcloud org-policies list --project=PROJECT_ID
    

    出力は次のようになります。

    CONSTRAINT                  LIST_POLICY    BOOLEAN_POLICY    ETAG
    custom.enableGkeAutopilot   -              SET               COCsm5QGENiXi2E=
    

ポリシーを適用してから Google Cloud でポリシーの適用が開始されるまで 2 分ほど待ちます。

ポリシーのテスト

プロジェクトに GKE Standard クラスタを作成してみます。

gcloud container clusters create org-policy-test \
    --project=PROJECT_ID \
    --zone=COMPUTE_ZONE \
    --num-nodes=1

次のような出力が表示されます。

Operation denied by custom org policies: ["customConstraints/custom.enableGkeAutopilot": "All new clusters must be Autopilot clusters."]

一般的なユースケースのカスタム制約の例

以下の各セクションでは、役立つ可能性のあるカスタム制約の構文について説明します。

説明 制約の構文
Binary Authorization が有効な場合にのみクラスタの作成を許可する
    name: organizations/ORGANIZATION_ID/customConstraints/custom.gkeBinaryAuthorization
    resourceTypes:
    - container.googleapis.com/Cluster
    methodTypes:
    - CREATE
    condition: "condition:resource.binaryAuthorization.enabled == true || resource.binaryAuthorization.evaluationMode=='PROJECT_SINGLETON_POLICY_ENFORCE'"
    action: ALLOW
    displayName: Enable GKE Binary Authorization
    description: All new clusters must enable Binary Authorization.
新しいノードプールのノード自動アップグレードを無効にしない
    name: organizations/ORGANIZATION_ID/customConstraints/custom.enableAutoUpgrade
    resourceTypes:
    - container.googleapis.com/NodePool
    methodTypes:
    - CREATE
    condition: "resource.management.autoUpgrade == true"
    actionType: ALLOW
    displayName: Enable node auto-upgrade
    description: All node pools must have node auto-upgrade enabled.
新しいクラスタで GKE 用 Workload Identity 連携を有効にする
    name: organizations/ORGANIZATION_ID/customConstraints/custom.enableWorkloadIdentity
    resourceTypes:
    - container.googleapis.com/Cluster
    methodTypes:
    - CREATE
    condition: "has(resource.workloadIdentityConfig.workloadPool) || resource.workloadIdentityConfig.workloadPool.size() > 0"
    actionType: ALLOW
    displayName: Enable Workload Identity on new clusters
    description: All new clusters must use Workload Identity.
既存のクラスタで Cloud Logging を無効にしない
    name: organizations/ORGANIZATION_ID/customConstraints/custom.enableLogging
    resourceTypes:
    - container.googleapis.com/Cluster
    methodTypes:
    - UPDATE
    condition: "resource.loggingService == 'none'"
    actionType: DENY
    displayName: Do not disable Cloud Logging
    description: You cannot disable Cloud Logging on existing GKE cluster.
以前のメタデータ エンドポイントが無効になっている場合にのみ、Standard ノードプールの作成または更新を許可する
    name: organizations/ORGANIZATION_ID/customConstraints/custom.nodeConfigMetadata
    resourceTypes:
    - container.googleapis.com/NodePool
    methodTypes:
    - CREATE
    - UPDATE
    condition: "'disable-legacy-endpoints' in resource.config.metadata && resource.config.metadata['disable-legacy-endpoints'] == 'true'"
    actionType: ALLOW
    displayName: Disable legacy metadata endpoints
    description: You can only create or update node pools if you disable legacy
    metadata endpoints.

この制約のサンプルは、マップの値にカスタム制約を設定する方法を示しています。condition フィールドでは、マップキー disable-legacy-endpointsインデックス演算子を使用しています。上のサンプルのように、標準のフィールド選択構文を使用すると、INVALID_CUSTOM_CONSTRAINT_CONDITION エラーが表示されます。

次のステップ