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

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

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

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

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

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

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

ポリシーの継承

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

利点

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

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

制限事項

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

始める前に

  • 組織 ID を確実に把握します。
  • Google Cloud CLI をインストールして初期化します。
    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
  • 必要なロール

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

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

    カスタム制約を作成する

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

    カスタム制約を作成するには、次の形式で YAML ファイルを作成します。

    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. で始まる必要があり、大文字、小文字、数字のみを含めることができます。例: custom.allowProjectForXDepartmentNameOnly。このフィールドの最大長は 70 文字です。

    • RESOURCE_NAME: 制限するオブジェクトとフィールドを含むGoogle Cloud リソースの完全修飾名。例: cloudresourcemanager.googleapis.com/Project

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

    • ACTION: condition が満たされている場合に実行するアクション。有効な値は ALLOWDENY です。

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

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

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

    カスタム制約を設定する

    新しいカスタム制約の YAML ファイルを作成したら、組織内の組織のポリシーで使用できるように設定する必要があります。カスタム制約を設定するには、gcloud org-policies set-custom-constraint コマンドを使用します。
    gcloud org-policies set-custom-constraint CONSTRAINT_PATH
    CONSTRAINT_PATH は、カスタム制約ファイルのフルパスに置き換えます。たとえば、/home/user/customconstraint.yaml です。完了すると、カスタム制約が組織のポリシーとして Google Cloud 組織のポリシーのリストに表示されます。カスタム制約が存在することを確認するには、gcloud org-policies list-custom-constraints コマンドを使用します。
    gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
    ORGANIZATION_ID は、組織リソースの ID に置き換えます。詳細については、組織のポリシーの表示をご覧ください。

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

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

    Console

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

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

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

    gcloud

    ブール型制約を適用する組織のポリシーを作成するには、制約を参照するポリシー YAML ファイルを作成します。

          name: projects/PROJECT_ID/policies/CONSTRAINT_NAME
          spec:
            rules:
            - enforce: true
        

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

    • PROJECT_ID: 制約を適用するプロジェクト。
    • CONSTRAINT_NAME: カスタム制約に定義した名前。たとえば、custom.allowProjectForXDepartmentNameOnly のようにします。

    制約を含む組織のポリシーを適用するには、次のコマンドを実行します。

        gcloud org-policies set-policy POLICY_PATH
        

    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

    次のステップ