本頁說明如何使用 Organization Policy Service 自訂限制,限制下列 Google Cloud 資源的特定作業:
- storage.googleapis.com/Bucket
如要進一步瞭解機構政策,請參閱「自訂機構政策」。
關於機構政策和限制
Google Cloud 機構政策服務可讓您透過程式以集中方式控管機構的資源。身為機構政策管理員,您可以定義機構政策,也就是一組稱為「限制」的限制,適用於Google Cloud 資源和Google Cloud 資源階層中這些資源的子系。您可以在機構、資料夾或專案層級強制執行機構政策。
機構政策提供各種 Google Cloud 服務的內建代管限制。不過,如要更精細地自訂機構政策中受限的特定欄位,也可以建立自訂限制,並在機構政策中使用這些自訂限制。
政策繼承
根據預設,機構政策會由您強制執行政策的資源子系繼承。舉例來說,如果您對資料夾強制執行政策, Google Cloud 系統會對該資料夾中的所有專案強制執行政策。如要進一步瞭解這項行為及如何變更,請參閱階層評估規則。
限制
- 建議不要在自訂限制條件中使用區隔標籤。請改用標記,只有具備必要身分與存取權管理 (IAM) 角色的使用者才能設定標記,且標記的控管比標籤更嚴格。 
- 新實施的自訂限制不會套用至現有資源。您必須更新現有資源,才能套用限制。 - 如要找出需要更新的現有資源,可以強制執行模擬測試組織政策。 
- 自訂限制無法用於限制物件或值區的 ACL 或 IAM 政策。 
事前準備
- 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. Roles required to select or create a project - Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
- 
      Create a project: To create a project, you need the Project Creator
      (roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
 
- 
  
    Verify that billing is enabled for your Google Cloud project. 
- 
      Install the Google Cloud CLI. 
- 
          如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。 
- 
        如要初始化 gcloud CLI,請執行下列指令: gcloud init
- 
    
    
      In the Google Cloud console, on the project selector page, select or create a Google Cloud project. Roles required to select or create a project - Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
- 
      Create a project: To create a project, you need the Project Creator
      (roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
 
- 
  
    Verify that billing is enabled for your Google Cloud project. 
- 
      Install the Google Cloud CLI. 
- 
          如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。 
- 
        如要初始化 gcloud CLI,請執行下列指令: gcloud init
- 請確認您知道機構 ID。
- 
                  orgpolicy.*機構
- 
                如要測試本頁面的機構政策範例,請建立 bucket:
                  storage.buckets.create在專案中
- ORGANIZATION_ID:您的機構 ID,例如- 123456789。
- CONSTRAINT_NAME:新自訂限制的名稱。自訂限制條件必須以- custom.開頭,且只能包含大寫英文字母、小寫英文字母或數字。例如,- custom.bucketNamingRequirement。這個欄位的長度上限為 70 個字元。
- RESOURCE_NAME:包含要限制物件和欄位的Google Cloud 資源完整名稱。例如:- storage.googleapis.com/Bucket。
- CONDITION:針對支援服務資源的代表項目編寫的 CEL 條件。這個欄位的長度上限為 1000 個字元。如要進一步瞭解可編寫條件的資源,請參閱「支援的資源」。例如:- "resource.name.matches('^[a-zA-Z]+$')"。
- ACTION:如果符合- condition,應採取的動作。可能的值為- ALLOW和- DENY。
- DISPLAY_NAME:限制條件的易記名稱。這個欄位的長度上限為 200 個字元。
- DESCRIPTION:違反政策時,要以錯誤訊息形式顯示的限制說明。這個欄位的長度上限為 2000 個字元。
- 前往 Google Cloud 控制台的「Organization policies」(機構政策) 頁面。
- 在專案選擇工具中,選取要設定機構政策的專案。
- 在「Organization policies」(機構政策) 頁面上的清單中選取限制條件,即可查看該限制條件的「Policy details」(政策詳情) 頁面。
- 如要設定資源的機構政策,請按一下「管理政策」。
- 在「編輯政策」頁面中,選取「覆寫上層政策」。
- 按一下「新增規則」。
- 在「Enforcement」(強制執行) 區段中,選取是否要強制執行這項機構政策。
- 選用:如要根據標記設定機構政策條件,請按一下「新增條件」。請注意,如果為組織政策新增條件式規則,您必須至少新增一項無條件規則,否則無法儲存政策。詳情請參閱「使用標記設定組織政策」。
- 按一下「測試變更」,模擬機構政策的影響。舊版受管理限制條件不支援政策模擬。詳情請參閱「 使用 Policy Simulator 測試組織政策變更」。
- 如要完成並套用機構政策,請按一下「設定政策」。這項政策最多需要 15 分鐘才會生效。
- 
        PROJECT_ID:您要強制執行限制的專案。
- 
        CONSTRAINT_NAME:您為自訂限制定義的名稱。例如:custom.bucketNamingRequirement。
- 將下列檔案儲存為 - constraint-bucket-names.yaml:- name: organizations/ORGANIZATION_ID/customConstraints/custom.bucketNamingRequirement resource_types: storage.googleapis.com/Bucket method_types: - CREATE 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.- 將 - ORGANIZATION_ID替換為機構 ID。
- 套用限制: - gcloud org-policies set-custom-constraint ~/constraint-bucket-names.yaml
- 確認限制條件是否存在: - gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID- 輸出結果會與下列內容相似: - CUSTOM_CONSTRAINT ACTION_TYPE METHOD_TYPES RESOURCE_TYPES DISPLAY_NAME custom.bucketNamingRequirement ALLOW CREATE storage.googleapis.com/Bucket Bucket names must match the specified regular expression ...
- 將下列檔案儲存為 - policy-bucket-names.yaml:- name: projects/PROJECT_ID/policies/custom.bucketNamingRequirement spec: rules: - enforce: true- 將 - PROJECT_ID替換為您的專案 ID。- 在本範例中,您是在專案層級強制執行這項限制,但您也可以在機構或資料夾層級設定這項限制。 
- 套用政策: - gcloud org-policies set-policy ~/policy-bucket-names.yaml
- 確認政策是否存在: - gcloud org-policies list --project=PROJECT_ID- 輸出結果會與下列內容相似: - CONSTRAINT LIST_POLICY BOOLEAN_POLICY ETAG custom.bucketNamingRequirement - SET CIqktscGELiZn6cC-
- 嘗試建立名稱含有非字母字元的值區: - gcloud storage buckets create gs://example-bucket --location=BUCKET_LOCATION- 請將 - BUCKET_LOCATION替換為 bucket 的位置。例如:- US。- 要求失敗,並顯示類似下列內容的錯誤: - ERROR: (gcloud.storage.buckets.create) HTTPError 412: orgpolicy:projects/_/buckets/example-bucket violates customConstraints/custom.bucketNamingRequirement. Details: Newly created buckets must have a name that matches the specified regular expression. Only letters are allowed in the bucket name.
- 您必須使用大寫字母,為下列欄位指定值:
- resource.customPlacementConfig.dataLocations
- resource.lifecycle.rule.action.storageClass
- resource.location
- resource.storageClass
 
- resource.retentionPolicy.isLocked欄位只能用於禁止使用 Bucket Lock,無法強制執行 Bucket Lock。
必要的角色
如要取得管理機構政策所需的權限,請要求管理員授予下列 IAM 角色:
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
這些預先定義角色具備管理組織政策所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:
所需權限
如要管理組織政策,您必須具備下列權限:
建立自訂限制
自訂限制是在 YAML 檔案中定義,其中包含您要強制執行機構政策的服務所支援的資源、方法、條件和動作。自訂限制的條件是使用一般運算語言 (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
更改下列內容:
如要進一步瞭解如何建立自訂限制,請參閱「定義自訂限制」。
設定自訂限制
為新的自訂限制建立 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 資源。控制台
gcloud
如要建立含有布林值規則的機構政策,請建立參照限制的政策 YAML 檔案:
name: projects/PROJECT_ID/policies/CONSTRAINT_NAME spec: rules: - enforce: true
取代下列項目:
如要強制執行包含限制的機構政策,請執行下列指令:
gcloud org-policies set-policy POLICY_PATH
      將 POLICY_PATH 替換為機構政策 YAML 檔案的完整路徑。這項政策最多需要 15 分鐘才會生效。
    
測試自訂機構政策
以下範例會建立自訂限制和政策,要求所有新建立的值區名稱只能包含英文字母。您可以嘗試執行政策應禁止的動作,測試政策是否有效。
建立限制
建立政策
套用政策後,請等待約兩分鐘, Google Cloud就會開始強制執行政策。
測試政策
常見用途的自訂機構政策範例
下表提供一些常見自訂限制的語法範例。如需可搭配 Cloud Storage 使用的預先定義限制清單,請參閱「Cloud Storage 的機構政策限制」。
| 說明 | 限制語法 | 
|---|---|
| 值區必須啟用物件版本管理功能 | 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. | 
| bucket 名稱必須使用特定規則運算式 | name: organizations/ORGANIZATION_ID/customConstraints/custom.bucketNamingRequirement 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. | 
| 值區無法啟用 Bucket Lock | 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. | 
| 值區無法啟用 Object Retention Lock | 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. | 
| Bucket 必須有標籤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. | 
| Bucket 無法使用舊版儲存空間類別 | 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. | 
| Bucket IP 過濾功能必須限制來自所有公開網際網路的要求 | name: organizations/ORGANIZATION_ID/customConstraints/custom.IpFilter method_types: - CREATE resource_types: storage.googleapis.com/Bucket condition: "!has(resource.ipFilter) || (resource.ipFilter.mode == 'Disabled' || resource.ipFilter.publicNetworkSource.allowedIpCidrRanges.size() > 0)" action_type: DENY display_name: Bucket IP filter rules must restrict all the public network description: Newly created buckets must have IP filtering and IP filtering rules must restrict all public network resources. | 
| 1 指定不存在的 bucket 標籤鍵會傳回  | |
有條件的機構政策
您可以使用標記,有條件地套用自訂機構政策。詳情請參閱「使用標記設定機構政策」。
Cloud Storage 支援的資源
下表列出可在自訂限制中參照的 Cloud Storage 資源。
| 資源 | 欄位 | 
|---|---|
| storage.googleapis.com/Bucket | resource.billing.requesterPays | 
| resource.cors.maxAgeSeconds | |
| resource.cors.method | |
| resource.cors.origin | |
| resource.cors.responseHeader | |
| resource.customPlacementConfig.dataLocations | |
| resource.defaultEventBasedHold | |
| resource.encryption.defaultKmsKeyName | |
| resource.iamConfiguration.publicAccessPrevention | |
| resource.iamConfiguration.uniformBucketLevelAccess.enabled | |
| resource.ipFilter.mode | |
| resource.ipFilter.publicNetworkSource.allowedIpCidrRanges | |
| resource.ipFilter.vpcNetworkSources.allowedIpCidrRanges | |
| resource.ipFilter.vpcNetworkSources.network | |
| resource.labels | |
| resource.lifecycle.rule.action.storageClass | |
| resource.lifecycle.rule.action.type | |
| resource.lifecycle.rule.condition.age | |
| resource.lifecycle.rule.condition.createdBefore | |
| resource.lifecycle.rule.condition.customTimeBefore | |
| resource.lifecycle.rule.condition.daysSinceCustomTime | |
| resource.lifecycle.rule.condition.daysSinceNoncurrentTime | |
| resource.lifecycle.rule.condition.isLive | |
| resource.lifecycle.rule.condition.matchesPrefix | |
| resource.lifecycle.rule.condition.matchesStorageClass | |
| resource.lifecycle.rule.condition.matchesSuffix | |
| resource.lifecycle.rule.condition.noncurrentTimeBefore | |
| resource.lifecycle.rule.condition.numNewerVersions | |
| resource.location | |
| resource.locationType | |
| resource.logging.logBucket | |
| resource.logging.logObjectPrefix | |
| resource.name | |
| resource.objectRetention.mode | |
| resource.retentionPolicy.isLocked | |
| resource.retentionPolicy.retentionPeriod | |
| resource.rpo | |
| resource.softDeletePolicy.retentionDurationSeconds | |
| resource.storageClass | |
| resource.versioning.enabled | |
| resource.website.mainPageSuffix | |
| resource.website.notFoundPage | 
注意事項: