サービス アカウントとサービス アカウント キーにカスタム組織のポリシーを使用する

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

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

利点

カスタムの組織のポリシーを使用して、サービス アカウントとサービス アカウント キーに対する特定のオペレーションを許可または拒否できます。たとえば、特定のオリジンの鍵の作成を拒否するようにポリシーを設定すると、そのオリジンの鍵を作成するためのリクエストが失敗し、ユーザーにエラーが返されます。

ポリシーの継承

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

始める前に

  • 組織 ID を把握していることを確認します。
  • IAM リソースを参照するカスタム組織のポリシーをテストする場合は、新しいプロジェクトを作成します。これらの組織のポリシーを既存のプロジェクトでテストすると、セキュリティ ワークフローが中断される可能性があります。

    1. In the Google Cloud console, go to the project selector page.

      Go to project selector

    2. Select or create a Google Cloud project.

必要なロール

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

この事前定義ロールには、組織のポリシーを管理するために必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

組織のポリシーを管理するには、次の権限が必要です。

  • orgpolicy.constraints.list
  • orgpolicy.policies.create
  • orgpolicy.policies.delete
  • orgpolicy.policies.list
  • orgpolicy.policies.update
  • orgpolicy.policy.get
  • orgpolicy.policy.set

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

カスタム制約を作成する

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

カスタム制約の YAML ファイルを作成するには:

name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
resourceTypes:
- iam.googleapis.com/RESOURCE_TYPE
methodTypes:
- CREATE
- UPDATE
condition: "CONDITION"
actionType: ACTION
displayName: DISPLAY_NAME
description: DESCRIPTION

以下を置き換えます。

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

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

  • RESOURCE_TYPE: 制限するオブジェクトとフィールドを含む Identity and Access Management API REST リソースの名前(URI ではない)。たとえば、ServiceAccount です。

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

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

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

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

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

カスタム制約を設定する

新しいカスタム制約の 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. [ポリシーの編集] ページで、[親のポリシーをオーバーライドする] を選択します。
  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.denyServiceAccountCreation

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

    gcloud org-policies set-policy POLICY_PATH
    

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

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

必要に応じて、ポリシーを設定し、ポリシーで禁止されているアクションを試行して、組織のポリシーをテストできます。

このセクションでは、次の組織のポリシーの制約をテストする方法について説明します。

name: organizations/ORG_ID/customConstraints/custom.denyServiceAccountCreation
resourceTypes: iam.googleapis.com/ServiceAccount
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.description.contains('INVALID_DESCRIPTION')"
actionType: DENY
displayName: Do not allow service account with INVALID_DESCRIPTION to be created.

このカスタム制約をテストするには、次の操作を行います。

  1. 制約を YAML ファイルにコピーし、次の値を置き換えます。

    • ORG_ID: Google Cloud 組織の数値 ID。
    • INVALID_DESCRIPTION: カスタム制約のテストに使用する説明。制約が有効な間、この文字列を含む説明を持つサービス アカウントは、制約を適用するプロジェクトに作成されません。
  2. カスタム制約を設定し、カスタム組織のポリシー制約をテストするために作成したプロジェクトに適用します。

  3. サービス アカウントの作成ロール(roles/iam.serviceAccountCreatorがあることを確認します。

  4. カスタム制約に含めた説明を使用して、サービス アカウントを作成してみてください。コマンドを実行する前に、次の値を置き換えます。

    • SERVICE_ACCOUNT_NAME: サービス アカウントの名前
    • INVALID_DESCRIPTION: サービス アカウントの説明でチェックされる無効な文字列
    • DISPLAY_NAME: Google Cloud コンソールに表示するサービス アカウント名
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
    --description="INVALID_DESCRIPTION" --display-name="DISPLAY_NAME"

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

Operation denied by custom org policy: ["customConstraints/custom.denyServiceAccountCreation": "Do not allow service account with INVALID_DESCRIPTION to be created."]

Identity and Access Management でサポートされているリソースとオペレーション

アカウントまたはキーの作成または更新時に、次のサービス アカウントとサービス アカウント キーのカスタム制約フィールドを使用できます。

  • サービス アカウント
    • resource.description
    • resource.displayName
    • resource.name
      • 形式: projects/PROJECT_ID/serviceAccounts/UNIQUE_ID
  • サービス アカウント キー
    • resource.keyOrigin
    • resource.keyType
    • resource.name
      • 形式: projects/PROJECT_ID/serviceAccounts/UNIQUE_ID/keys/KEY_ID

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

次の表に、一般的なユースケースのカスタム制約の構文を示します。

カスタム制約の条件で使用できる CEL マクロの詳細については、Common Expression Language をご覧ください。

説明 制約の構文
サービス アカウントの作成を無効にします。
    name: organizations/ORGANIZATION_ID/customConstraints/custom.disableServiceAccountCreation
    resourceTypes:
    - iam.googleapis.com/ServiceAccount
    methodTypes:
    - CREATE
    condition: "True"
    actionType: DENY
    displayName: Deny all service account creation.
サービス アカウント キーの作成を無効にします。
    name: organizations/ORGANIZATION_ID/customConstraints/custom.disableServiceAccountKeyCreation
    resourceTypes:
    - iam.googleapis.com/ServiceAccountKey
    methodTypes:
    - CREATE
    condition: "resource.keyType == USER_MANAGED && resource.keyOrigin == GOOGLE_PROVIDED"
    actionType: DENY
    displayName: Deny all service account key creation.
サービス アカウント キーのアップロードを無効にします。
    name: organizations/ORGANIZATION_ID/customConstraints/custom.disableServiceAccountKeyUpload
    resourceTypes:
    - iam.googleapis.com/ServiceAccountKey
    methodTypes:
    - CREATE
    condition: "resource.keyType == USER_MANAGED && resource.keyOrigin == USER_PROVIDED"
    actionType: DENY
    displayName: Deny all service account key uploads.

次のステップ