カスタム制約を使用してリソースを管理する

このページでは、組織のポリシー サービスのカスタム制約を使用して、 次の Google Cloud リソースに対する特定のオペレーションを制限する方法について説明します。

  • cloudresourcemanager.googleapis.com/Project
  • cloudresourcemanager.googleapis.com/Folder

組織のポリシーの詳細については、カスタムの組織のポリシーをご覧ください。

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

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

組織のポリシーを利用することで、あらかじめ用意されたマネージド制約をさまざまな Google Cloud サービスに適用できます。ただし、組織のポリシーで制限されている特定の項目をより細かくカスタマイズして制御したい場合は、カスタム制約を作成して、それを組織のポリシーで使うこともできます。

ポリシーの継承

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

特典

セキュリティ、コンプライアンス、ガバナンスのために、カスタムの組織のポリシーを次の方法で使用できます。

  • プロジェクトの名前付けパターンを管理する: プロジェクト ID にカスタム制約を作成できます。たとえば、ステージング リソース フォルダで、プロジェクト ID が staging- で始まる場合にのみ、プロジェクトに対する作成オペレーションと更新オペレーションを許可します。
  • 安全なプロジェクトとフォルダの変更を制限する: 親が安全なフォルダまたは組織の場合に、プロジェクトとフォルダの更新を拒否するカスタム制約を作成できます。

制限事項

  • フォルダまたはプロジェクトにカスタム制約が設定されている場合、App Script、Firebase、Contact Center Solution リソースに対する作成オペレーションまたは更新オペレーションが失敗することがあります。このような場合は、失敗の原因となっているカスタム制約の条件を確認してください。これらの制限が更新されていることを確認してから、失敗したオペレーションを再試行してください。
  • 他のすべての組織ポリシーの制約と同様に、ポリシーの変更が既存のインスタンスに遡及的に適用されることはありません。
  • コンソールでのプロジェクトとフォルダの作成では、 エラー メッセージの具体的な理由が示されない場合があります。 Google Cloud PERMISSION_DENIED失敗の原因となっている特定の制約の詳細を確認するには、監査ログを確認します。

始める前に

  • 組織 ID を確実に把握します。
  • Google Cloud CLI をインストールして初期化します。
    1. Google Cloud CLI をインストールします。

    2. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

    3. gcloud CLI を初期化するには、次のコマンドを実行します:

      gcloud init
  • 必要なロール

    カスタムの組織のポリシーを管理するために必要な権限を取得するには、組織のリソースに対する組織のポリシー管理者roles/orgpolicy.policyAdmin)の IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

    必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

    カスタム制約を設定する

    カスタム制約は、組織のポリシーを適用しているサービスでサポートされるリソース、メソッド、条件、アクションを使用して YAML ファイルで定義されます。カスタム制約の条件は、Common Expression Language(CEL)を使用して定義されます。CEL を使用してカスタム制約で条件を作成する方法については、カスタム制約の作成と管理の CEL セクションをご覧ください。

    コンソール

    カスタム制約を作成する手順は次のとおりです。

    1. Google Cloud コンソールで [組織のポリシー] ページに移動します。

      [組織のポリシー] に移動

    2. プロジェクト選択ツールで、組織のポリシーを設定するプロジェクトを選択します。
    3. [ カスタム制約] をクリックします。
    4. [表示名] ボックスに、人が読める形式で制約の名前を入力します。この名前は エラー メッセージで使用されるほか、識別やデバッグにも使用できます。エラー メッセージで公開される可能性があるため、表示名に個人情報(PII)やセンシティブ データを使用しないでください。このフィールドには、最大 200 文字まで入力できます。
    5. [**制約 ID**] ボックスに、新しいカスタム 制約の ID を入力します。カスタム制約の名前に使用できるのは、英字(大文字と小文字)と 数字のみです(例: custom.allowProjectForXDepartmentNameOnly)。このフィールドには、接頭辞(custom.)を除き、最大 70 文字まで入力できます(例: organizations/123456789/customConstraints/custom)。エラー メッセージで公開される可能性があるため、制約 ID に個人情報(PII)や機密データを含めないでください。
    6. [説明] ボックスに、人が読める形式で制約の説明を入力します。この説明は、ポリシー違反の際にエラー メッセージとして使用されます。ポリシー違反が発生した理由と、ポリシー違反を解決する方法に関する詳細を含めてください。エラー メッセージで公開される可能性があるため、説明に個人情報(PII)や機密データを含めないでください。 このフィールドには、最大 2,000 文字まで入力できます。
    7. [リソースの種類] ボックスで、制限するオブジェクトとフィールドを含む Google Cloud REST リソースの名前を選択します(例: container.googleapis.com/NodePool)。ほとんどの種類のリソースは、最大 20 個のカスタム制約をサポートしています。これより多くのカスタム制約を作成しようとすると、オペレーションは失敗します。
    8. [適用方法] で、REST CREATE メソッドに制約を適用するか、CREATE メソッドと UPDATE メソッドの両方に制約を適用するかを選択します。制約に違反するリソースに対する UPDATE メソッドに制約を適用した場合、そのリソースへの変更は、違反を解決するものでない限り、 組織のポリシーによってブロックされます。
    9. 各サービスでサポートされているメソッドを確認するには、 カスタム制約をサポートするサービスをご覧ください。

    10. 条件を定義するには、 [Edit condition] をクリックします。
      1. [条件を追加] パネルで、サポートされているサービス リソースを参照する CEL 条件を作成します(例: resource.management.autoUpgrade == false)。このフィールドには、最大 1,000 文字まで入力できます。CEL の使用方法の詳細については、Common Expression Language をご覧ください。 カスタム制約で使用できるサービス リソースの詳細については、カスタム制約のサポート サービスをご覧ください。
      2. [保存] をクリックします。
    11. [アクション] で、条件が満たされた場合に評価対象のメソッドを許可するか拒否するかを選択します。
    12. 拒否アクションは、条件が true と評価された場合に、リソースを作成または更新するオペレーションがブロックされることを意味します。

      許可アクションは、条件が true と評価された場合にのみ、リソースを作成または更新するオペレーションが許可されることを意味します。条件に明記されているケース以外はすべてブロックされます。

    13. [制約を作成] をクリックします。
    14. 各フィールドに値を入力すると、このカスタム制約に対応する YAML 構成が右側に表示されます。

    gcloud

    1. カスタム制約を作成するには、次の形式で YAML ファイルを作成します。
    2. name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
      resourceTypes: RESOURCE_NAME
      methodTypes:
        - CREATE
      - UPDATE
      condition: "CONDITION" actionType: ACTION displayName: DISPLAY_NAME description: DESCRIPTION

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

      • ORGANIZATION_ID: 組織 ID(例: 123456789)。
      • CONSTRAINT_NAME: 新しいカスタム制約の名前。カスタム制約の名前に使用できるのは、英字(大文字と小文字) または数字のみです(例: custom.allowProjectForXDepartmentNameOnly)。このフィールドには、接頭辞(custom.)を除き、最大 70 文字まで入力できます(例: organizations/123456789/customConstraints/custom)。エラー メッセージで公開される可能性があるため、制約 ID に個人情報(PII)やセンシティブ データを含めないでください。
      • RESOURCE_NAME: 制限するオブジェクトとフィールドを含む Google Cloud リソースの完全修飾名。例: cloudresourcemanager.googleapis.com/Project。ほとんどの種類のリソースは、最大 20 個のカスタム 制約をサポートしています。これより多くのカスタム制約を作成しようとすると、オペレーションは失敗します。
      • methodTypes: 制約が適用される REST メソッド。 CREATE または CREATEUPDATE の両方にできます。制約に違反するリソースに対する UPDATE メソッドに制約を適用した場合、そのリソースへの変更は、違反を解決するものでない限り、組織のポリシーによってブロックされます。
      • 各サービスでサポートされているメソッドを確認するには、 カスタム制約をサポートするサービスをご覧ください。

      • CONDITION: サポート対象のサービス リソースの表現に対して記述する CEL 条件。このフィールドには、最大 1,000 文字まで入力できます。例: "resource.projectId.startsWith(\"XDepartment\")"
      • 条件を記述できるリソースの詳細については、サポートされているリソースをご覧ください。

      • ACTION: condition が満たされた場合に実行するアクション。 有効な値は ALLOWDENY です。
      • 許可アクションは、条件が true と評価された場合に、リソースを作成または更新するオペレーションが許可されることを意味します。つまり、条件に明記されているケース以外はすべてブロックされます。

        拒否アクションは、条件が true と評価された場合に、リソースを作成または 更新するオペレーションがブロックされることを意味します。

      • DISPLAY_NAME: 制約の名前。わかりやすい名前を入力してください。この名前 はエラー メッセージで使用されるほか、識別やデバッグにも使用できます。エラー メッセージで公開される可能性があるため、表示名に個人情報(PII)やセンシティブ データを使用しないでください。このフィールドには、最大 200 文字まで入力できます。
      • DESCRIPTION: ポリシー違反の際にエラー メッセージとして表示される制約の説明。わかりやすい説明を入力してください。このフィールドには、最大 2,000 文字まで入力できます。
    3. 新しいカスタム制約の YAML ファイルを作成したら、組織内で組織のポリシーとして使用できるように設定する必要があります。カスタム制約を設定するには、gcloud org-policies set-custom-constraint コマンドを使用します。
    4. gcloud org-policies set-custom-constraint CONSTRAINT_PATH

      CONSTRAINT_PATH は、カスタム制約ファイルのフルパスに置き換えます。例: /home/user/customconstraint.yaml

      この操作が完了すると、カスタム制約が Google Cloud の組織ポリシーのリストに表示され、組織のポリシーとして使用できるようになります。

    5. カスタム制約が存在することを確認するには、gcloud org-policies list-custom-constraints コマンドを使用します。
    6. gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID

      ORGANIZATION_ID は組織リソースの ID に置き換えます。

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

    カスタムの組織のポリシーを適用する

    制約を適用するには、それを参照する組織のポリシーを作成し、その組織のポリシーを Google Cloud リソースに適用します。

    コンソール

    1. Google Cloud コンソールで [組織のポリシー] ページに移動します。

      [組織のポリシー] に移動

    2. プロジェクト選択ツールで、組織のポリシーを設定するプロジェクトを選択します。
    3. [組織のポリシー] ページのリストで制約を選択して、その制約の [ポリシーの詳細] ページを表示します。
    4. このリソースの組織のポリシーを構成するには、[ポリシーを管理] をクリックします。
    5. [ポリシーの編集] ページで、[Override parent's policy] を選択します。
    6. [ルールを追加] をクリックします。
    7. [適用] セクションで、この組織のポリシーを適用するかどうかを選択します。
    8. 省略可: タグで組織のポリシーに条件を設定するには、[条件を追加] をクリックします。組織のポリシーに条件付きルールを追加する場合は、少なくとも 1 つは無条件のルールを追加する必要があります。そうしないとポリシーを保存できないのでご注意ください。詳細については、 タグを使用して組織のポリシーのスコープを設定するをご覧ください。
    9. [変更内容をテスト] をクリックして、組織のポリシーの効果をシミュレートします。詳細については、Policy Simulator で組織のポリシーの変更をテストするをご覧ください。
    10. ドライラン モードで組織のポリシーを適用するには、[ドライラン ポリシーを設定] をクリックします。詳細については、 組織のポリシーをテストするをご覧ください。
    11. ドライラン モードで組織のポリシーが想定どおりに動作することを確認したら、 有効なポリシーを設定するには、[ポリシーを設定] をクリックします。

    gcloud

    1. ブール値のルールを含む組織のポリシーを作成するには、制約を参照するポリシーの YAML ファイルを作成します。
    2. name: projects/PROJECT_ID/policies/CONSTRAINT_NAME
      spec:
        rules:
        - enforce: true
      
      dryRunSpec:
        rules:
        - enforce: true

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

      • PROJECT_ID: 制約を適用するプロジェクト。
      • CONSTRAINT_NAME: カスタム制約に定義した名前。例: custom.allowProjectForXDepartmentNameOnly
    3. ドライラン モードで組織のポリシーを適用するには、dryRunSpec フラグを指定して次のコマンドを実行します。
    4. gcloud org-policies set-policy POLICY_PATH --update-mask=dryRunSpec

      POLICY_PATH は、組織のポリシーの YAML ファイルのフルパスに置き換えます。ポリシーが有効になるまでに最大 15 分かかります。

    5. ドライラン モードで組織のポリシーが想定どおりに動作することを確認したら、org-policies set-policy コマンドと spec フラグを使用して有効なポリシーを設定します。
    6. gcloud org-policies set-policy POLICY_PATH --update-mask=spec

      POLICY_PATH は、組織のポリシーの YAML ファイルのフルパスに置き換えます。ポリシーが有効になるまでに最大 15 分かかります。

    カスタム組織のポリシーをテストする

    次の例では、組織内のすべてのプロジェクト ID が dev_ で始まるようにするカスタム制約とポリシーを作成します。

    始める前に、組織 ID を確認してください。

    制約を作成する

    1. プロジェクト ID が dev_ で始まらない場合にすべてのプロジェクトの作成と更新を拒否する制約を定義するには、次の内容で constraint-allow-dev-projects.yaml を作成します。

      name: organizations/ORGANIZATION_ID/customConstraints/custom.allowProjectForDevIdOnly
      resourceTypes:
      - cloudresourcemanager.googleapis.com/Project
      methodTypes:
      - CREATE
      - UPDATE
      condition: "resource.projectId.startsWith(\"dev_\")"
      actionType: ALLOW
      displayName: Allow dev_ projects
      description: All projects in the org should start with dev_.
      

      ORGANIZATION_ID は、実際の組織 ID に置き換えます。

    2. 制約を適用します。

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

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

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

      CUSTOM_CONSTRAINT                ACTION_TYPE  METHOD_TYPES   RESOURCE_TYPES                                      DISPLAY_NAME
      custom.allowProjectForDevIdOnly  ALLOW        CREATE,UPDATE  cloudresourcemanager.googleapis.com/Project   Allow dev_ projects
      ...
      

    ポリシーを作成する

    1. 次のポリシーを使用して policy-enable-dev-projects.yaml ファイルを作成します。

      Name: organizations/ORGANIZATION_ID/policies/custom.allowProjectForDevIdOnly
      spec:
        rules:
        - enforce: true
      

      ORGANIZATION_ID は、実際の組織 ID に置き換えます。

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

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

      gcloud org-policies list --organization=ORGANIZATION_ID
      

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

      CONSTRAINT                        LIST_POLICY    BOOLEAN_POLICY    ETAG
      custom.allowProjectForDevIdOnly   -              SET               COCsm5QGENiXi2E=
      

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

    ポリシーのテスト

    組織にプロジェクト ID sampleDemoProject のプロジェクトを作成します。

    gcloud projects create sampleDemoProject \
        --organization=ORGANIZATION_ID
    

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

    PERMISSION_DENIED: The caller does not have permission
    

    一般的なユースケースのカスタム組織ポリシーの例

    次の表では一般的なカスタム制約の構文例をまとめています。

    説明 制約の構文
    フォルダ 1234(secure_admin_folder)での新しいプロジェクトの作成を拒否します。
          name: organizations/ORGANIZATION_ID/customConstraints/custom.disableNewProjectInSecureAdminFolder
          resourceTypes:
          - cloudresourcemanager.googleapis.com/Project
          methodTypes:
          - CREATE
          condition: "resource.parent == "organizations/1234""
          actionType: DENY
          displayName: Disable new project creation in the secure admin folder
          description: Do not allow creation of new projects in the secure folders.
          
    リソース階層ツリーの深さを制御するために、別のフォルダ内にフォルダを作成できないようにします。
          name: organizations/ORGANIZATION_ID/customConstraints/custom.disableFolderCreation
          resourceTypes:
          - cloudresourcemanager.googleapis.com/Folder
          methodTypes:
          - CREATE
          condition: "resource.parent.startsWith("folders")"
          actionType: DENY
          displayName: Disable creation of a folder inside another folder
          description: Do not allow creation of a folder within another folder when
                       the resource hierarchy is set to a maximum value of 1.
          

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

    次の表は、カスタム制約で参照できる Resource Manager リソースを一覧にしたものです。

    リソース フィールド
    cloudresourcemanager.googleapis.com/Folder resource.displayName
    resource.parent
    cloudresourcemanager.googleapis.com/Project resource.parent
    resource.projectId

    次のステップ