カスタムの組織のポリシー制約

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

  • firebasestorage.googleapis.com/DefaultBucket

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

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

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

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

ポリシーの継承

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

また、Cloud Storage for Firebase は基盤となる Cloud Storage バケットにファイルを保存するため、Cloud Storage リソースに適用される組織のポリシーやカスタム制約は、Cloud Storage for Firebase バケットにも適用されます。

利点

  • セキュリティとガバナンス: Cloud Storage バケットのプロビジョニングに対して一元化された組織管理を適用し、データ所在地と費用管理のガードレールを遵守します。
  • きめ細かい属性制御: storageClass や location などの特定のリソース属性に基づいて、デフォルトのバケット作成を制限します。

制限事項

Cloud Storage for Firebase でカスタム組織のポリシーを使用する場合は、次の制限が適用されます。

  • 遡及的な適用なし: 新しく適用されたカスタム制約は、既存のリソースに適用されません。既存のデフォルト バケットは、更新されない限り評価されません。制約に違反する可能性のある既存のリソースを特定するには、ドライラン モードを使用してポリシーをテストします。
  • アクセス制御の制限: カスタム制約では、バケットのアクセス制御リスト(ACL)や IAM ポリシーを制限できません。

始める前に

  1. Firebase コンソールで、Firebase プロジェクトを選択または作成します。

    プロジェクトが組織の一部であり、組織 ID を把握していることを確認します。

  2. コマンドラインを使用してカスタム制約を設定して適用するには、Google Cloud CLI(gcloud)をインストールします。カスタム組織のポリシーは、Firebase CLI を使用して管理することはできません。

必要なロール

カスタムの組織のポリシーを管理するために必要な権限を取得するには、組織に対する組織ポリシー管理者(roles/orgpolicy.policyAdmin)の IAM ロールを付与するよう管理者に依頼してください。

Cloud Storage for Firebase でサポートされているリソース

次の表に、カスタム制約で参照できる Cloud Storage for Firebase リソースを示します。これらのリソースのカスタム制約は Cloud Storage for Firebase バケットにも適用されるため、Cloud Storage でサポートされているリソースも参照できます。

リソース サポートされるフィールド
firebasestorage.googleapis.com/DefaultBucket
  • resource.location
  • resource.storageClass

カスタム制約を設定する

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

Console

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

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

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

  2. プロジェクト選択ツールで、組織のポリシーを設定するプロジェクトを選択します。
  3. [ カスタム制約] をクリックします。
  4. [表示名] ボックスに、人が読める形式で制約の名前を入力します。この名前はエラー メッセージで使用されるほか、識別やデバッグにも使用できます。エラー メッセージで公開される可能性があるため、表示名に個人情報(PII)や機密データを使用しないでください。このフィールドには、最大 200 文字まで入力できます。
  5. [制約 ID] ボックスに、新しいカスタム制約の ID を入力します。カスタム制約の名前に使用できるのは、英字(大文字と小文字)と数字のみです(例: custom.restrictStorageClass)。このフィールドには、接頭辞(custom.)を除き、最大 70 文字まで入力できます(例: organizations/123456789/customConstraints/custom.restrictStorageClass)。エラー メッセージで漏えいする可能性があるため、制約 ID には PII や機密データを含めないでください。
  6. [説明] ボックスに、人が読める形式で制約の説明を入力します。この説明は、ポリシー違反の際にエラー メッセージとして使用されます。ポリシー違反が発生した理由と、ポリシー違反を解決する方法に関する詳細を含めてください。エラー メッセージで公開される可能性があるため、説明に個人情報(PII)や機密データを含めないでください。このフィールドには、最大 2,000 文字まで入力できます。
  7. [リソースの種類] ボックスで、制限するオブジェクトとフィールドを含む REST リソースの名前を選択します(例: firebasestorage.googleapis.com/DefaultBucket)。ほとんどの種類のリソースは、最大 20 個のカスタム制約をサポートしています。これより多くのカスタム制約を作成しようとすると、オペレーションは失敗します。
  8. [適用方法] で、REST CREATE メソッドに制約を適用するのか、または CREATE メソッドと UPDATE メソッドの両方に制約を適用するのかを選択します。(注: DefaultBucket は CREATE のみをサポートしています)。
  9. 条件を定義するには、[ 条件を編集] をクリックします。
    1. [条件を追加] パネルで、サポートされているサービス リソースを参照する CEL 条件を作成します(例: resource.storageClass == 'STANDARD')。このフィールドには、最大 1,000 文字まで入力できます。CEL の使用方法の詳細については、Common Expression Language をご覧ください。
    2. [保存] をクリックします。
  10. [アクション] で、条件が満たされた場合に評価対象のメソッドを許可するか拒否するかを選択します。

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

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

  11. [制約を作成] をクリックします。

gcloud

  1. カスタム制約を作成するには、次の形式で YAML ファイルを作成します。
    name: organizations/ORGANIZATION_ID/customConstraints/custom.restrictStorageClass
    resourceTypes: firebasestorage.googleapis.com/DefaultBucket
    methodTypes:
      -   CREATE
    condition: "resource.storageClass == 'STANDARD'"
    actionType: DENY
    displayName: Restrict Standard Storage Class
    description: Deny creating buckets with STANDARD storage class.
  2. 新しいカスタム制約の YAML ファイルを作成したら、組織内で組織のポリシーとして使用できるように設定する必要があります。カスタム制約を設定するには、gcloud org-policies set-custom-constraint コマンドを使用します。
    gcloud org-policies set-custom-constraint CONSTRAINT_PATH

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

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

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

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

Console

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

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

  2. プロジェクト選択ツールで、組織のポリシーを設定するプロジェクトを選択します。
  3. [組織のポリシー] ページのリストで制約を選択して、その制約の [ポリシーの詳細] ページを表示します。
  4. このリソースの組織のポリシーを構成するには、[ポリシーを管理] をクリックします。
  5. [ポリシーの編集] ページで、[親のポリシーをオーバーライドする] を選択します。
  6. [ルールの追加] をクリックします。
  7. [適用] セクションで、この組織のポリシーを適用するかどうかを選択します。
  8. ドライラン モードで組織のポリシーを適用するには、[ドライラン ポリシーを設定] をクリックします。詳細については、組織のポリシーをテストするをご覧ください。
  9. ドライラン モードで組織のポリシーが想定どおりに動作することを確認したら、[ポリシーを設定] をクリックして有効なポリシーを設定します。

gcloud

  1. ブール値のルールを含む組織のポリシーを作成するには、制約を参照するポリシーの YAML ファイルを作成します。
    name: projects/PROJECT_ID/policies/custom.restrictStorageClass
    spec:
      rules:
      -   enforce: true
    dryRunSpec:
      rules:
      -   enforce: true
  2. ドライラン モードで組織のポリシーを適用するには、dryRunSpec フラグを指定して次のコマンドを実行します。
    gcloud org-policies set-policy POLICY_PATH --update-mask=dryRunSpec
  3. ドライラン モードで組織のポリシーが想定どおりに動作することを確認したら、org-policies set-policy コマンドと spec フラグを使用して有効なポリシーを設定します。
    gcloud org-policies set-policy POLICY_PATH --update-mask=spec

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

次の例では、新しく作成されるすべてのデフォルト バケットで STANDARD ストレージ クラスを使用しないことを必須にするカスタムの制約とポリシーを作成します。ポリシーで禁止されているアクションを試行して、ポリシーをテストできます。

制約を作成する

  1. 次のファイルに constraint-restrict-storage-class.yaml という名前を付けて保存します。

    name: organizations/ORGANIZATION_ID/customConstraints/custom.restrictStorageClass
    resourceTypes:
    -   firebasestorage.googleapis.com/DefaultBucket
    methodTypes:
    -   CREATE
    condition: "resource.storageClass == 'STANDARD'"
    actionType: DENY
    displayName: Restrict Standard Storage Class
    description: Deny creating buckets with STANDARD storage class.
    

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

  2. 制約を適用します。

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

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

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

    CUSTOM_CONSTRAINT            ACTION_TYPE   METHOD_TYPES   RESOURCE_TYPES                                 DISPLAY_NAME
    custom.restrictStorageClass  DENY          CREATE         firebasestorage.googleapis.com/DefaultBucket   Restrict Standard Storage Class
    ...
    

ポリシーを作成する

  1. 次のファイルに policy-restrict-storage-class.yaml という名前を付けて保存します。

    name: projects/PROJECT_ID/policies/custom.restrictStorageClass
    spec:
      rules:
      -   enforce: true
    

    PROJECT_ID は、実際のプロジェクト ID に置き換えます。

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

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

    gcloud org-policies list --project=PROJECT_ID
    

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

    CONSTRAINT                   LIST_POLICY    BOOLEAN_POLICY    ETAG
    custom.restrictStorageClass  -              SET               CIqktscGELiZn6cC-
    

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

ポリシーのテスト

ストレージ クラス(デフォルトは STANDARD)を指定せずに、Cloud Storage for Firebase REST API を使用してデフォルトのバケットを作成してみます。

PROJECT_ID="PROJECT_ID"
TOKEN=$(gcloud auth print-access-token)

curl -X POST "https://firebasestorage.googleapis.com/v1beta/projects/${PROJECT_ID}/defaultBucket" \
  -H "Authorization: Bearer ${TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{"location": "US-EAST1"}'

リクエストは失敗し、次のようなエラーが返されます。

FAILED_PRECONDITION: Operation denied by org policy: ["customConstraints/custom.restrictStorageClass": "Deny creating buckets with STANDARD storage class."].
-   '@type': type.googleapis.com/google.rpc.ErrorInfo
  domain: iam.googleapis.com
  metadata:
    customConstraints: customConstraints/custom.restrictStorageClass
  reason: CUSTOM_ORG_POLICY_VIOLATION

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

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

説明 制約の構文
STANDARD Storage クラスを使用したデフォルト バケットの作成を制限する
name: organizations/ORGANIZATION_ID/customConstraints/custom.restrictStorageClass
resourceTypes:
-   firebasestorage.googleapis.com/DefaultBucket
methodTypes:
-   CREATE
condition: "resource.storageClass == 'STANDARD'"
actionType: DENY
displayName: Restrict Standard Storage Class
description: Deny creating buckets with STANDARD storage class.
デフォルトのバケットを特定のロケーションに作成することを必須にする
name: organizations/ORGANIZATION_ID/customConstraints/custom.requireDefaultBucketLocation
resourceTypes:
-   firebasestorage.googleapis.com/DefaultBucket
methodTypes:
-   CREATE
condition: "resource.location != 'US-EAST1'"
actionType: DENY
displayName: Require US-EAST1 Location
description: Deny creating default buckets outside the US-EAST1 location.

次のステップ