カスタム制約の作成と管理

このページでは、GKE 接続クラスタ環境内でカスタム制約を有効にして使用する方法について説明します。 Google Cloudの組織のポリシー サービスは、リソース構成の管理とクラウド環境でのガードレールの作成に役立ちます。

概要

カスタム組織のポリシーを使用すると、GKE Multi-Cloud 環境全体で詳細なリソース ポリシーを作成して、組織の特定のセキュリティとコンプライアンスの要件を満たすことができます。ドライラン モードで組織のポリシーを作成して、本番環境のワークロードに影響を与えることなく新しいポリシーをテストすることもできます。

組織のポリシーの詳細については、組織ポリシー サービスの概要をご覧ください。

始める前に

始める前に、次のトピックについて理解しておきましょう。

ポリシーの継承

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

制限事項

カスタム制約を作成する前に、次の制限事項に注意してください。

  • カスタム制約は、GKE 接続クラスタ リソースの CREATE メソッドまたは UPDATE メソッドにのみ適用できます。
  • 新しく適用されたカスタム制約は、既存のリソースに自動的に適用されません。制約を適用するには、既存のリソースを更新する必要があります。更新が必要な既存のリソースを確認するには、組織のポリシーのドライランを実行します。
  • 制約を作成して組織のポリシーを適用するには、 Google Cloud 組織の組織ポリシー管理者roles/orgpolicy.policyAdmin)の IAM ロールが必要です。カスタム制約を使用して組織のポリシーを管理するために必要な権限の詳細については、必要なロールをご覧ください。

料金

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

カスタム制約を作成する

カスタム制約は、AttachedCluster API リソース仕様のフィールドを使用して指定する必要があります(「出力専用」と説明されているフィールドを除く)。

カスタム制約を作成する

新しいカスタム制約を作成するには、YAML ファイルで制約を定義し、Google Cloud CLI を使用して組織にカスタム制約を適用します。この制約は、GKE 接続クラスタ リソース全体に適用する特定のポリシーをカプセル化する必要があります。

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

    name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
    resourceTypes:
    - gkemulticloud.googleapis.com/AttachedCluster
    methodTypes: 
    - CREATE
    condition: \"CONDITION\"
    actionType: ACTION
    displayName: DISPLAY_NAME
    description: DESCRIPTION
    

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

    • ORGANIZATION_ID : 組織 ID(123456789 など)。

    • CONSTRAINT_NAME : 新しいカスタム制約の名前。カスタム制約は custom. で始まる必要があり、大文字、小文字、数字のみを含めることができます。例: custom.allowClusterCreateIfAnnotationPresent。このフィールドの最大長は 70 文字です。接頭辞はカウントされません(例: organizations/123456789/customConstraints/custom)。

    • CONDITION : アタッチされたクラスタ リソースの表現に対して書き込まれる条件。条件は Common Expression Language(CEL)で記述します。このフィールドの最大長は 1,000 文字です。たとえば、条件は "key" in resource.annotations && resource.annotations.key == "created-by" です。

    • ACTION : 条件が満たされている場合に実行するアクション。ALLOW または DENY になります。

    • DISPLAY_NAME : 制約の表示名。このフィールドの最大長は 200 文字です。

    • DESCRIPTION : ポリシー違反時にエラー メッセージとして表示される制約の説明。たとえば、「"Allow new clusters only when certain annotations are set."」のようにわかりやすい説明を入力してください。このフィールドの最大長は 2,000 文字です。

    カスタム制約の作成方法については、カスタム制約の定義をご覧ください。

制約をリソースに関連付ける

新しいカスタム制約の YAML ファイルを作成したら、制約を組織のポリシーで使用できるように設定する必要があります。

  1. カスタム制約を設定するには、gcloud org-policies set-custom-constraint コマンドを使用します。

    gcloud org-policies set-custom-constraint PATH_TO_FILE
    

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

  2. カスタム制約が作成されたことを確認するには、gcloud org-policies list-custom-constraints コマンドを使用します。

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

    出力には、作成されたポリシーが一覧表示されます。

    CUSTOM_CONSTRAINT: custom.allowClusterCreateIfAnnotationPresent
    ACTION_TYPE: ALLOW
    METHOD_TYPES: CREATE
    RESOURCE_TYPES: gkemulticloud.googleapis.com/AttachedCluster
    DISPLAY_NAME: Allow new clusters only when certain annotations are set.
    

カスタム制約を適用する

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

  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 リソース。たとえば、プロジェクトや組織などです。

    • RESOURCE_ID: ポリシーを適用したリソースの ID。たとえば、プロジェクト ID や組織 ID などです。

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

    CONSTRAINT: custom.allowClusterCreateIfAnnotationPresent
    LIST_POLICY: -
    BOOLEAN_POLICY: SET
    ETAG: CPjb27wGEOijhL4B-
    

ポリシーのテスト

制限付きプロジェクトに EKS クラスタを登録して、組織のポリシーをテストします。

  1. 制限付きプロジェクトに EKS クラスタを登録します。

    gcloud container attached clusters register CLUSTER_NAME \
      --location=GOOGLE_CLOUD_REGION \
      --fleet-project=PROJECT_NUMBER \
      --platform-version=PLATFORM_VERSION \
      --distribution=eks \
      --issuer-url=ISSUER_URL \
      --context=KUBECONFIG_CONTEXT \
      --kubeconfig=KUBECONFIG_PATH
    
    
  2. 出力は次のようになります。

    ERROR: (gcloud.container.attached.clusters.register) FAILED_PRECONDITION: Operation denied by org policy on resource 'projects/PROJECT_NUMBER/locations/GOOGLE_CLOUD_REGION': ["customConstraints/custom.allowClusterCreateIfAnnotationPresent": "Allow new clusters only when certain annotations are set."]
    
    '@type': type.googleapis.com/google.rpc.ErrorInfo
    domain: googleapis.com
    metadata:
      customConstraints: customConstraints/custom.allowClusterCreateIfAnnotationPresent
    service: gkemulticloud.googleapis.com
    reason: CUSTOM_ORG_POLICY_VIOLATION