組織のポリシーを使用すると、事前に定義された制約を Cloud Storage に適用できます。ただし、組織のポリシーで制限されている特定のフィールドをカスタマイズ可能な方法できめ細かく制御する必要がある場合は、カスタム制約を作成して、組織のポリシーで使用することもできます。
このページでは、カスタム制約を設定して、ポリシーを Cloud Storage リソースに適用する方法について説明します。
本番環境に適用する前に新しい制約をテストするには、Policy Simulator を使用します。
ポリシーの継承
デフォルトでは、組織のポリシーは、そのポリシーを適用したリソースの子孫に継承されます。たとえば、組織にポリシーを適用すると、その組織内のすべてのプロジェクトにそのポリシーが適用されます。この動作の詳細と変更方法については、階層評価ルールをご覧ください。
料金
事前定義された制約やカスタム制約を含む組織のポリシー サービスは無料です。
制限事項
Cloud Storage リソースのカスタム制約は、Google Cloud コンソールまたは Google Cloud CLI でのみ設定できます。
カスタム制約は、Cloud Storage リソースの
CREATE
メソッドまたはUPDATE
メソッドにのみ適用できます。新しく適用されたカスタム制約は、既存のリソースに自動的に適用されません。制約を適用するには、既存のリソースを更新する必要があります。
更新が必要な既存のリソースを確認するには、組織のポリシーのドライランを実行します。
カスタム制約を使用して、オブジェクトまたはバケットの ACL や IAM ポリシーを制限することはできません。
Cloud Storage でサポートされているリソース
Cloud Storage では、次のリソースにカスタム制約を設定できます。
- バケット:
storage.googleapis.com/Bucket
必要なロール
カスタム制約を使用して組織のポリシーを管理するために必要なロールについては、必要なロールをご覧ください。
組織のポリシーの管理に加えて、作成したカスタム制約をテストすることもできます。カスタム制約をテストするには、特定の制約をテストするために必要な権限を含む、最も制限の厳しい事前定義ロールまたはカスタムロールを使用することをおすすめします。必要な権限とロールについては、Cloud Storage のロールと権限をご覧ください。
カスタム制約を設定する
コンソール
Google Cloud コンソールで、[組織のポリシー] ページに移動します。
ページの上部にあるプロジェクト選択ツールを選択します。
プロジェクト選択ツールから、組織のポリシーを設定するリソースを選択します。
[
カスタム制約] をクリックします。[表示名] フィールドに制約の名前を入力します。わかりやすい名前を入力してください。このフィールドの最大長は 200 文字です。エラー メッセージで漏えいする可能性があるため、制約名には PII や機密データを使用しないでください。
[制約 ID] ボックスに、新しいカスタム制約の名前を入力します。カスタム制約は
custom.
で始める必要があります。また、使用できるのは、大文字、小文字、数字のみです(例:custom.enforceBucketVersioning
)。このフィールドの最大長は 70 文字です。接頭辞はカウントされません(例:organizations/123456789/customConstraints/custom.
)。[説明] フィールドに、ポリシー違反が発生したときにエラー メッセージとして表示される制約の説明を入力します。わかりやすい説明を入力してください。このフィールドの最大長は 2,000 文字です。
[リソースの種類] フィールドで、制限するオブジェクトとフィールドを含む Google Cloud REST リソースの名前を選択します。例:
storage.googleapis.com/Bucket
[適用方法] で、REST
CREATE
またはUPDATE
メソッドに制約を適用するかどうかを選択します。条件を定義するには、[
条件を編集] をクリックします。[条件を追加] パネルで、サポートされているサービス リソースを参照する CEL 条件を作成します(例:
resource.versioning.enabled == true
)。このフィールドの最大長は 1,000 文字です。[保存] をクリックします。
[アクション] で、条件を満たしている場合に、評価された方法を許可するかどうかを選択します。
[制約を作成] をクリックします。
各フィールドに値を入力すると、このカスタム制約の YAML 構成が右側に表示されます。
gcloud
Google Cloud CLI を使用してカスタム制約を作成するには、カスタム制約の YAML ファイルを作成します。
name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
resourceTypes:
- RESOURCE_NAME
methodTypes:
- METHOD1
- METHOD2
condition: "CONDITION"
actionType: ACTION
displayName: DISPLAY_NAME
description: DESCRIPTION
以下を置き換えます。
ORGANIZATION_ID
: 組織 ID(123456789
など)。CONSTRAINT_NAME
: 新しいカスタム制約に付ける名前。カスタム制約はcustom.
で始める必要があります。また、使用できるのは、大文字、小文字、数字のみです(例:custom.enforceBucketVersioning
)。このフィールドの最大長は 70 文字です。接頭辞はカウントされません(例:organizations/123456789/customConstraints/custom.
)。RESOURCE_NAME
: 制限するオブジェクトとフィールドを含む Google Cloud REST リソースの完全修飾名。例:storage.googleapis.com/Bucket
。METHOD1,METHOD2
: 制約を適用する RESTful メソッドのリスト。CREATE
、CREATE
、UPDATE
のいずれかです。CONDITION
: サポートされているサービス リソースを参照する CEL 条件(例:"resource.versioning.enabled == true"
)。このフィールドの最大長は 1000 文字です。CEL の使用方法の詳細については、Common Expression Language をご覧ください。ACTION
:condition
が満たされている場合に実行するアクション。ALLOW
またはDENY
になります。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 に置き換えます。
詳細については、組織のポリシーの表示をご覧ください。
リクエストが成功した場合の出力は次のようになります。
CUSTOM_CONSTRAINT ACTION_TYPE METHOD_TYPES RESOURCE_TYPES DISPLAY_NAME
custom.uniformBucketLevelAccess
DENY CREATE,UPDATE storage.googleapis.com/Bucket Enable object versioning
カスタム制約の設定と管理の詳細については、カスタム制約の作成と管理をご覧ください。
制約を適用する
ブール型制約を適用するには、それを参照する組織のポリシーを作成し、それを 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.uniformBucketLevelAccess
制約を含む組織のポリシーを適用するには、次のコマンドを実行します。
gcloud org-policies set-policy POLICY_PATH
POLICY_PATH
は、組織のポリシーの YAML ファイルのパスに置き換えます。ポリシーが有効になるまでに最大 15 分かかります。
カスタム制約に違反して拒否されたリクエストは、412
エラー CUSTOM_ORGPOLICY_CONSTRAINT_FAILED
で失敗します。
例: バケットに顧客管理の暗号鍵を適用する制約を作成する
gcloud
次の情報を含む
enforceCMEK.yaml
制約ファイルを作成します。name: organizations/ORGANIZATION_ID/customConstraints/custom.customerManagedEncryptionKeys resource_types: storage.googleapis.com/Bucket method_types: – CREATE – UPDATE condition: "has(resource.encryption.defaultKmsKeyName)" action_type: ALLOW display_name: Enforce Cloud KMS key description: When this constraint is enforced, newly created buckets and newly updated buckets must be encrypted with a Cloud KMS key. The Cloud KMS key on existing buckets can be updated but not deleted.
カスタム制約を設定します。
gcloud org-policies set-custom-constraint enforceCMEK.yaml
次の情報を含む
enforceCMEK-policy.yaml
ポリシー ファイルを作成します。name: projects/PROJECT_ID/policies/custom.customerManagedEncryptionKeys spec: rules: – enforce: true
PROJECT_ID
は、実際のプロジェクト ID に置き換えます。この例では、この制約をプロジェクト レベルで適用しますが、組織レベルまたはフォルダレベルで設定することもできます。
ポリシーを適用します。
gcloud org-policies set-policy enforceCMEK-policy.yaml
一般的なユースケースのカスタム制約の例
以下の各セクションでは、役立つ可能性のあるカスタム制約の構文について説明します。
ユースケース | 構文 |
---|---|
バケットの保持ポリシーの期間は、指定された期間内に収まる必要があります。 | name: organizations/ORGANIZATION_ID/customConstraints/custom.retentionPolicy method_types: – CREATE – UPDATE resource_types: storage.googleapis.com/Bucket condition: "resource.retentionPolicy.retentionPeriod not in [3600, 2678400]" action_type: DENY display_name: Bucket retention policy is either 3,600 seconds or 2,678,400 seconds description: Newly created buckets and newly updated buckets must have a retention policy that's either 3,600 seconds or 2,678,400 seconds. |
バケットでオブジェクトのバージョニングが有効になっている必要があります | name: organizations/ORGANIZATION_ID/customConstraints/custom.enforceBucketVersioning method_types: – CREATE – UPDATE resource_types: storage.googleapis.com/Bucket condition: "resource.versioning.enabled == true" action_type: ALLOW display_name: Buckets must have Object Versioning enabled description: Newly created buckets and newly updated buckets must have Object Versioning enabled. |
バケットの名前は、特定の正規表現で指定する必要があります | name: organizations/ORGANIZATION_ID/customConstraints/custom.bucketName method_types: – CREATE resource_types: storage.googleapis.com/Bucket condition: "resource.name.matches('^[a-zA-Z]+$')" action_type: ALLOW display_name: Bucket names must match the specified regular expression description: Newly created buckets must have a name that matches the specified regular expression. Only letters are allowed in the bucket name. |
バケットでバケットロックを有効にできません | name: organizations/ORGANIZATION_ID/customConstraints/custom.prohibitBucketLock method_types: – CREATE – UPDATE resource_types: storage.googleapis.com/Bucket condition: "resource.retentionPolicy.isLocked == true" action_type: DENY display_name: Prohibit the use of Bucket Lock description: Newly created buckets and newly updated buckets cannot have Bucket Lock enabled. |
バケットでオブジェクト保持ロックを有効にできません | name: organizations/ORGANIZATION_ID/customConstraints/custom.prohibitObjectRetentionLock method_types: – CREATE – UPDATE resource_types: storage.googleapis.com/Bucket condition: "resource.objectRetention.mode == 'Enabled'" action_type: DENY display_name: Objects cannot have retention configurations description: Newly created buckets and newly updated buckets cannot have Object Retention Lock enabled. |
US または EU マルチリージョンにあるバケットの保持期間は 86,400 秒にする必要があります。 |
name: organizations/ORGANIZATION_ID/customConstraints/custom.locationRetentionPolicy method_types: – CREATE – UPDATE resource_types: storage.googleapis.com/Bucket condition: "(resource.location.startsWith('US') || resource.location.startsWith('EU')) && resource.retentionPolicy.retentionPeriod != 86400" action_type: DENY display_name: All buckets in US and EU must have a retention policy of 86,400 seconds description: Newly created buckets and newly updated buckets located in US and EU regions must have a retention policy of 86,400 seconds. |
バケットにはラベルが必要です1 | name: organizations/ORGANIZATION_ID/customConstraints/custom.labels method_types: – CREATE – UPDATE resource_types: storage.googleapis.com/Bucket condition: "'my_annotations.data.source' in resource.labels && resource.labels['my_annotations.data.source'] in ['SOURCE_IMAGES','SOURCE_TEXT','SOURCE_VIDEOS']" action_type: ALLOW display_name: Buckets must have a label classifying the contents of the bucket description: Newly created buckets and newly updated buckets must have the label my_annotations.data.source with the SOURCE_IMAGES, SOURCE_TEXT, or SOURCE_VIDEOS key. |
バケットはデュアルリージョンに配置する必要があります | name: organizations/ORGANIZATION_ID/customConstraints/custom.dualRegionUS method_types: – CREATE – UPDATE resource_types: storage.googleapis.com/Bucket condition: "'US-EAST1' in resource.customPlacementConfig.dataLocations && 'US-EAST4' in resource.customPlacementConfig.dataLocations" action_type: ALLOW display_name: Buckets must be located in a dual-region description: Newly created buckets and newly updated buckets must be located in a dual-region composed of the us-east1 and us-east4 regions. |
バケットで従来のストレージ クラスを使用できません | name: organizations/ORGANIZATION_ID/customConstraints/custom.disableLegacyStorageClass method_types: – CREATE – UPDATE resource_types: storage.googleapis.com/Bucket condition: "resource.storageClass in ['STANDARD', 'NEARLINE', 'COLDLINE', 'ARCHIVE']" action_type: ALLOW display_name: Buckets cannot use legacy storage classes description: Newly created buckets and newly updated buckets must use Standard storage, Nearline storage, Coldline storage, or Archive storage. |
1 存在しないバケット ラベル キーを指定すると、 |
条件の式フィールド
次の表に、条件の作成に使用できる式フィールドを示します。条件は Common Expression Language(CEL)で記述します。これらの式フィールドの値では、大文字と小文字が区別されます。
次の式フィールドの説明と指定できる値については、JSON API の Buckets リソース表現をご覧ください。
式フィールド | 値の型 |
---|---|
billing.requesterPays |
bool |
cors |
list |
cors.maxAgeSeconds |
int |
cors.method |
list |
cors.origin |
list |
cors.responseHeader |
list |
customPlacementConfig.dataLocations 1 |
list |
defaultEventBasedHold |
bool |
encryption.defaultKmsKeyName |
string |
iamConfiguration.publicAccessPrevention |
string |
iamConfiguration.uniformBucketLevelAccess.enabled |
bool |
labels |
map |
lifecycle.rule |
list |
lifecycle.rule.action.storageClass 1 |
string |
lifecycle.rule.action.type |
string |
lifecycle.rule.condition.age |
int |
lifecycle.rule.condition.createdBefore |
string |
lifecycle.rule.condition.customTimeBefore |
string |
lifecycle.rule.condition.daysSinceCustomTime |
int |
lifecycle.rule.condition.daysSinceNoncurrentTime |
int |
lifecycle.rule.condition.isLive |
bool |
lifecycle.rule.condition.matchesPrefix |
list |
lifecycle.rule.condition.matchesStorageClass |
list |
lifecycle.rule.condition.matchesSuffix |
list |
lifecycle.rule.condition.noncurrentTimeBefore |
string |
lifecycle.rule.condition.numNewerVersions |
int |
location 1 |
string |
locationType |
string |
logging.logBucket |
string |
logging.logObjectPrefix |
string |
objectRetention.mode |
string |
name |
string |
projectNumber 2 |
string |
retentionPolicy.isLocked |
bool |
retentionPolicy.retentionPeriod |
int |
rpo |
string |
softDeletePolicy.retentionDurationSeconds |
int |
storageClass 1 |
string |
versioning.enabled |
bool |
website.mainPageSuffix |
string |
website.notFoundPage |
string |
1 このフィールドの値は、大文字で記述する必要があります。
2 このフィールドは非推奨になりました。
考慮事項
カスタム制約条件では、バケットラベルの使用はおすすめしません。代わりに、タグを使用します。タグは、必要な IAM ロールを持つユーザーによって設定されます。これは、ラベルよりも厳密に管理されます。