このページでは、組織のポリシー サービスのカスタム制約を使用して、次の Google Cloud リソースに対する特定のオペレーションを制限する方法について説明します。
secretmanager.googleapis.com/Secret
組織のポリシーの詳細については、カスタムの組織のポリシーをご覧ください。
組織のポリシーと制約について
Google Cloud の組織のポリシー サービスを使用すると、組織のリソースをプログラムで一元管理できます。組織のポリシー管理者は組織のポリシーを定義できます。組織のポリシーは、Google Cloud のリソース階層内の Google Cloud リソースやそれらのリソースの子孫に適用される、制約と呼ばれる一連の制限です。組織のポリシーは、組織レベル、フォルダレベル、またはプロジェクト レベルで適用できます。
組織のポリシーは、さまざまな Google Cloud サービスに事前に定義された制約を提供します。ただし、組織のポリシーで制限されている特定のフィールドをきめ細かくカスタマイズ可能な方法で制御する必要がある場合は、カスタム制約を作成して、組織のポリシーでそれらのカスタム制約を使用することもできます。
ポリシーの継承
デフォルトでは、組織のポリシーは、そのポリシーを適用したリソースの子孫に継承されます。たとえば、フォルダにポリシーを適用した場合、Google Cloud はそのフォルダ内のすべてのプロジェクトにそのポリシーを適用します。この動作の詳細と変更方法については、階層評価ルールをご覧ください。
利点
カスタム組織ポリシーを使用すると、次のことができます。
- ユーザーがシークレットにアノテーションを追加すること、シークレットに有効期限を設定すること、シークレット バージョンの破棄を遅らせることを義務付けることで、厳格なセキュリティ要件を適用します。
- 特定のプロジェクトまたはフォルダ内のすべてのシークレットにローテーション スケジュールを設定することを要求することで、特定のローテーション要件をサポートします。
- アノテーションとバージョン エイリアスが、自動化されたスクリプトで選択した式と一致していることを確認します。
- 組織内で許可されるシークレットのタイプを制限して、クラウド費用を管理します。
制限事項
- シークレットの有効期限は、
expire_time
(特定の時点)またはttl
(期間)を使用して定義できます。組織のカスタム ポリシーでは、expire_time
を使用してシークレットの有効期限を判断できます。Secret にttl
を設定すると、Secret Manager はそれをexpire_time
値に変換してポリシーを処理および評価します。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- 組織 ID を確実に把握します。
必要なロール
組織のポリシーを管理するために必要な権限を取得するには、次の IAM ロールを付与するように管理者に依頼してください。
-
組織リソースに対する組織のポリシー管理者 (
roles/orgpolicy.policyAdmin
) -
シークレットを作成または更新するには: プロジェクトに対する Secret Manager 管理者(
roles/secretmanager.admin
)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
これらの事前定義ロールには、組織のポリシーの管理に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。
必要な権限
組織のポリシーを管理するには、次の権限が必要です。
-
組織リソースに対する
orgpolicy.*
-
Secret Manager シークレットを作成または更新するには:
-
プロジェクト リソースに対する
secretmanager.secrets.create
-
プロジェクト リソースに対する
secretmanager.secrets.get
-
プロジェクト リソースに対する
secretmanager.secrets.list
-
プロジェクト リソースに対する
secretmanager.secrets.update
-
プロジェクト リソースに対する
カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。
カスタム制約を作成する
カスタム制約は、組織のポリシーを適用しているサービスでサポートされるリソース、メソッド、条件、アクションを使用して 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.ensureVersionDestroyTTL
)。この項目の最大長は 70 文字です。RESOURCE_NAME
: 制限するオブジェクトとフィールドを含む Google Cloud リソースの完全修飾名。例:secretmanager.googleapis.com/Secret
CONDITION
: サポート対象のサービス リソースの表現に対して書き込まれる CEL 条件。このフィールドの最大長は 1000 文字です。条件の書き込み先として使用できるリソースの詳細については、サポート対象のリソースをご覧ください。 例:"resource.versionDestroyTtl < duration('30h')"
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
- Google Cloud コンソールで、[組織のポリシー] ページに移動します。
- プロジェクト選択ツールから、組織のポリシーを設定するプロジェクトを選択します。
- [組織のポリシー] ページのリストで制約を選択して、その制約の [ポリシーの詳細] ページを表示します。
- このリソースの組織のポリシーを構成するには、[ポリシーを管理] をクリックします。
- [ポリシーの編集] ページで、[親のポリシーをオーバーライドする] を選択します。
- [ルールの追加] をクリックします。
- [適用] セクションで、この組織のポリシーの適用を有効にするかどうかを選択します。
- 省略可: タグで組織のポリシーに条件を設定するには、[条件を追加] をクリックします。組織のポリシーに条件付きルールを追加する場合は、少なくとも 1 つは無条件のルールを追加する必要があります。そうしないとポリシーを保存できないのでご注意ください。詳細については、タグ付きの組織のポリシーの設定をご覧ください。
- カスタム制約の場合は、[変更内容をテスト] をクリックして、組織のポリシーの効果をシミュレートできます。詳細については、Policy Simulator で組織のポリシーの変更をテストするをご覧ください。
- 組織のポリシーを完成させて適用するには、[ポリシーを設定] をクリックします。ポリシーが有効になるまでに最大 15 分かかります。
gcloud
ブール型制約を適用する組織のポリシーを作成するには、制約を参照するポリシー YAML ファイルを作成します。
name: projects/PROJECT_ID/policies/CONSTRAINT_NAME spec: rules: - enforce: true
次のように置き換えます。
-
PROJECT_ID
: 制約を適用するプロジェクト。 -
CONSTRAINT_NAME
: カスタム制約に定義した名前。例:custom.ensureVersionDestroyTTL
。
制約を含む組織のポリシーを適用するには、次のコマンドを実行します。
gcloud org-policies set-policy POLICY_PATH
POLICY_PATH
は、組織のポリシーの YAML ファイルのパスに置き換えます。ポリシーが有効になるまでに最大 15 分かかります。
カスタム組織のポリシーをテストする
次の例は、特定のプロジェクト内で作成されるすべての新しいシークレットの破棄遅延時間(version_destroy_ttl
)が 30 時間以上になるように、カスタム制約とポリシーを構成する方法を示しています。
始める前に、以下を確認してください。
- プロジェクトごとに 1 回、Secret Manager API を有効にします。
- 組織 ID を確認します。
- プロジェクト ID を確認します。
制約を作成する
次のファイルに
constraint.yaml
という名前を付けて保存します。name: organizations/ORGANIZATION_ID/customConstraints/custom.ensureVersionDestroyTTLAtLeast30hours resourceTypes: - secretmanager.googleapis.com/Secret methodTypes: - CREATE condition: "resource.versionDestroyTtl < duration('30h')" actionType: DENY displayName: Enable Secret Version Destroy TTL with at least 30 hours description: All new secrets must have Version Destroy TTL values of at least 30 hours
これにより、新しい Secret ごとに、Secret バージョン
version_destroy_ttl
が適用されていない場合、またはversion_destroy_ttl
が 30 時間未満の場合、オペレーションが拒否される制約が定義されます。制約を適用します。
gcloud org-policies set-custom-constraint ~/constraint.yaml
制約が存在することを確認します。
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
出力は次のようになります。
CUSTOM_CONSTRAINT ACTION_TYPE METHOD_TYPES RESOURCE_TYPES DISPLAY_NAME custom.ensureVersionDestroyTTLAtLeast30hours DENY CREATE secretmanager.googleapis.com/Secret Enable Secret Version Destroy TTL with at least 30 hours ...
ポリシーを作成するには:
次のファイルに
policy.yaml
という名前を付けて保存します。name: projects/PROJECT_ID/policies/custom.ensureVersionDestroyTTLAtLeast30hours spec: rules: - enforce: true
PROJECT_ID
は、実際のプロジェクト ID に置き換えます。ポリシーを適用します。
gcloud org-policies set-policy ~/policy.yaml
ポリシーが存在することを確認します。
gcloud org-policies list --project=PROJECT_ID
出力は次のようになります。
CONSTRAINT LIST_POLICY BOOLEAN_POLICY ETAG custom.ensureVersionDestroyTTLAtLeast30hours - SET COCsm5QGENiXi2E=
ポリシーを適用してから Google Cloud でポリシーの適用が開始されるまで 2 分ほど待ちます。
ポリシーのテスト
gcloud secrets create org-policy-test-secret \
--project=PROJECT_ID \
--version-destroy-ttl=100000s
次のような出力が表示されます。
Operation denied by custom org policies: ["customConstraints/custom.ensureVersionDestroyTTL": "All new secrets must have version destroy TTL values with at least 30 hours"]
一般的なユースケースのカスタム組織ポリシーの例
次の表に、一般的なユースケースのカスタム制約の構文を示します。
説明 | 制約の構文 |
---|---|
バージョンの破棄 TTL を 2 日より長く設定する必要があります |
name: organizations/ORGANIZATION_ID/customConstraints/custom.secretManagerEnableTTL resourceTypes: - secretmanager.googleapis.com/Secret methodTypes: - CREATE condition: "has(resource.versionDestroyTtl) && resource.versionDestroyTtl.getSeconds() > 172800" actionType: ALLOW displayName: Must set version destroy TTL more than one hour description: All new secrets must set version destroy TTL and version destroy TTL seconds should be more than two days |
Pub/Sub トピックを設定する |
name: organizations/ORGANIZATION_ID/customConstraints/custom.secretsWithPubSubTopic resourceTypes: - secretmanager.googleapis.com/Secret methodTypes: - CREATE - UPDATE condition: "has(resource.topics) && size(resource.topics) > 0 && resource.topics[0].name.matches('projects/a_test_project/topics/a_topic_name')" actionType: ALLOW displayName: Set secret first topic as a_topic_name description: All secret must use a_topic_name Pub/Sub topic as the first topic for notifications. |
接頭辞付きのアノテーションを拒否する |
name: organizations/ORGANIZATION_ID/customConstraints/custom.secretManagerAnnotationPrefixes resourceTypes: - secretmanager.googleapis.com/Secret methodTypes: - CREATE condition: "has(resource.annotations) && resource.annotations['key1'].startsWith('some-prefix-')" actionType: DENY displayName: Deny annotation of 'key1' with prefix 'some-prefix-' description: All new secrets should not have 'key1' annotations set with prefix 'some-prefix-'. |
Secret Manager でサポートされているリソース
このセクションの表に、カスタム制約で参照できる Secret Manager リソースを示します。
リソース ロケーションの制約を設定するには、リソース ロケーションの組織のポリシーを使用します。同様に、CMEK の使用に関する制約を設定するには、CMEK の組織のポリシーを使用することをおすすめします。
リソース | フィールド |
---|---|
secretmanager.googleapis.com/Secret |
resource.annotations
|
resource.expireTime
| |
resource.rotation.nextRotationTime
| |
resource.rotation.rotationPeriod
| |
resource.topics.name
| |
resource.versionAliases
| |
resource.versionDestroyTtl
|
次のステップ
- 組織のポリシー サービスについて詳細を学習する。
- 組織のポリシーの作成と管理の方法について学習する。
- 事前定義された組織のポリシーの制約の完全なリストを確認する。