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

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

概要

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

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

始める前に

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

ポリシーの継承

デフォルトでは、組織のポリシーを適用したリソースの子孫にそのポリシーが継承されます。たとえば、組織にポリシーを適用すると、 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