本文說明管理員如何查看、建立及管理自訂機構政策。透過自訂組織政策,您可以自訂組織政策中受限的特定欄位。
事前準備
- 如要進一步瞭解組織政策和限制條件的定義和運作方式,請參閱「機構政策服務簡介」。
必要的角色
如要取得管理組織政策所需的權限,請要求管理員授予您組織的下列 IAM 角色:
- 機構政策管理員 (
roles/orgpolicy.policyAdmin) -
如要啟用 Google Cloud API,請按照下列步驟操作:
服務使用情形用戶 (
roles/serviceusage.serviceUsageConsumer)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
您可以將身分與存取權管理條件新增至機構政策管理員角色繫結,藉此委派組織政策的管理權。如要控管主體可管理組織政策的資源,您可以根據特定標記設定角色繫結條件。詳情請參閱「建立組織政策」。
自訂限制
自訂限制是在 YAML 檔案中定義,其中指定受限的資源、方法、條件和動作。自訂限制行為和支援的參數會因服務而異。自訂限制的條件是使用一般運算語言 (CEL) 來定義。
設定自訂限制
您可以使用 Google Cloud 控制台或 Google Cloud CLI 建立自訂限制,並設定在機構政策中使用。
控制台
如要建立自訂限制,請按照下列步驟操作:
- 前往 Google Cloud 控制台的「Organization policies」(組織政策) 頁面。
- 在專案挑選器中,選取要設定組織政策的專案。
- 按一下「自訂限制」。
- 在「顯示名稱」方塊中,輸入容易理解的限制名稱。這個名稱會顯示在錯誤訊息中,可用於識別和偵錯。請勿在顯示名稱中使用個人識別資訊 (PII) 或私密資料,因為錯誤訊息可能會顯示這類名稱。這個欄位最多可包含 200 個字元。
-
在「Constraint ID」(限制 ID) 方塊中,輸入新自訂限制的 ID。自訂限制只能包含字母 (包括大寫和小寫) 或數字,例如
custom.disableGkeAutoUpgrade。這個欄位最多可包含 70 個字元,不含前置字元 (custom.),例如organizations/123456789/customConstraints/custom。請勿在限制 ID 中輸入 PII 或私密資料,因為錯誤訊息可能會顯示上述資訊。 - 在「Description」(說明) 方塊中,輸入使用者可理解的限制說明。違反政策時,系統會顯示這項說明做為錯誤訊息。請提供違反政策的詳細原因,以及如何解決問題。請勿在說明中輸入 PII 或機密資料,因為錯誤訊息可能會顯示上述資訊。這個欄位最多可輸入 2000 個字元。
-
在「Resource type」方塊中,選取包含要限制物件和欄位的 Google Cloud REST 資源名稱,例如
container.googleapis.com/NodePool。大多數資源類型最多支援 20 項自訂限制。如果您嘗試建立更多自訂限制,作業會失敗。 -
這項限制只能在 REST
CREATE方法上強制執行。 - 如要定義條件,請按一下「編輯條件」。
-
在「Add condition」(新增條件) 面板中,建立參照支援服務資源的 CEL 條件,例如
resource.management.autoUpgrade == false。這個欄位最多可輸入 1000 個字元。如要進一步瞭解如何使用 CEL,請參閱 一般運算語言。如要進一步瞭解自訂限制中可使用的服務資源,請參閱「 自訂限制支援的服務」。 - 按一下 [儲存]。
- 在「動作」下方,選取符合條件時要允許或拒絕評估的方法。
- 按一下「建立限制」。
如要查看各項服務支援的方法,請在「 支援自訂限制的服務」中找出該服務。
如果條件評估結果為 true,系統會禁止建立或更新資源。
允許動作是指只有在條件評估為 true 時,才允許建立或更新資源的作業。除了條件中明確列出的情況外,其他所有情況都會遭到封鎖。
在每個欄位中輸入值後,右側會顯示這個自訂限制的對等 YAML 設定。
gcloud
- 如要建立自訂限制,請使用下列格式建立 YAML 檔案:
-
ORGANIZATION_ID:您的機構 ID,例如123456789。 -
CONSTRAINT_NAME:新自訂限制的名稱。自訂限制只能包含字母 (包括大寫和小寫) 或數字,例如custom.disableGkeAutoUpgrade。這個欄位最多可包含 70 個字元,不含前置字元 (custom.),例如organizations/123456789/customConstraints/custom。請勿在限制 ID 中輸入 PII 或機密資料,因為錯誤訊息可能會顯示上述資訊。 -
RESOURCE_NAME:內含要限制的物件和欄位的 Google Cloud 資源完整名稱,例如:container.googleapis.com/NodePool。大多數資源類型最多支援 20 項自訂限制。如果您嘗試建立更多自訂限制,作業會失敗。 -
methodTypes:強制執行限制的 REST 方法。只能是CREATE。 -
CONDITION:針對支援服務資源表示法所撰寫的 CEL 條件。這個欄位最多可輸入 1000 個半形字元。例如:"resource.management.autoUpgrade == false"。 -
ACTION:符合condition時採取的動作。可能的值為ALLOW和DENY。 -
DISPLAY_NAME:人類可讀的限制條件名稱。這個名稱會顯示在錯誤訊息中,可用於識別和偵錯。請勿在顯示名稱中使用 PII 或機密資料,因為錯誤訊息可能會顯示這類名稱。這個欄位最多可輸入 200 個半形字元。 -
DESCRIPTION:違反政策時,會以錯誤訊息形式顯示且易於理解的限制說明。這個欄位最多可輸入 2000 個字元。 -
為新的自訂限制建立 YAML 檔案後,您必須加以設定,才能用於組織的組織政策。如要設定自訂限制條件,請使用
gcloud org-policies set-custom-constraint指令: -
如要驗證是否存在自訂限制條件,請使用
gcloud org-policies list-custom-constraints指令:
name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME resourceTypes: RESOURCE_NAME methodTypes: - CREATE condition: "CONDITION" actionType: ACTION displayName: DISPLAY_NAME description: DESCRIPTION
請替換下列項目:
如要查看各項服務支援的方法,請在「 支援自訂限制的服務」中找出該服務。
允許動作是指如果條件評估結果為 true,系統就會允許建立或更新資源的作業。這也表示系統會封鎖條件中明確列出的案例以外的所有其他案例。
拒絕動作表示如果條件評估結果為 true,系統會封鎖建立或更新資源的作業。
gcloud org-policies set-custom-constraint CONSTRAINT_PATH
請將 CONSTRAINT_PATH 替換為自訂限制檔案的完整路徑,例如:/home/user/customconstraint.yaml。
這項作業完成後,自訂限制會顯示在 Google Cloud 組織政策清單中,供組織政策使用。
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
請將 ORGANIZATION_ID 替換成組織資源的 ID。
詳情請參閱「 查看組織政策」。
更新自訂限制
如要更新自訂限制,請在Google Cloud 控制台中編輯限制,或建立新的 YAML 檔案,然後再次使用 set-custom-constraint gcloud CLI 指令。自訂限制沒有版本控管功能,因此會覆寫現有的自訂限制。如果自訂限制已強制執行,更新後的自訂限制會立即生效。
控制台
前往 Google Cloud 控制台的「Organization policies」(組織政策) 頁面。
選取頁面頂端的專案挑選器。
在專案挑選器中,選取要更新組織政策的資源。
在「Organization policies」(機構政策) 頁面的清單中,選取要編輯的限制,開啟該限制的「Policy details」(政策詳細資料) 頁面。
按一下「編輯限制」。
變更顯示名稱、說明、強制執行方法、條件和動作。限制條件建立後,您就無法再變更限制條件 ID 或資源類型。
按一下 [儲存變更]。
gcloud
使用
gcloud org-policies describe-custom-constraint指令取得目前的自訂限制。gcloud org-policies describe-custom-constraint CONSTRAINT_NAME \ --organization=ORGANIZATION_ID \ --format=FORMAT > PATH更改下列內容:
ORGANIZATION_ID:組織 ID,例如123456789。CONSTRAINT_NAME:自訂限制的名稱,例如custom.disableGkeAutoUpgrade。FORMAT:允許政策的格式。使用json或yaml。PATH:自訂限制的新輸出檔案路徑。
修改自訂限制的本機副本,以反映您要對顯示名稱、說明、執行方法、條件和動作進行的變更。限制條件建立後,就無法變更限制條件 ID 或資源類型。
更新自訂限制的 YAML 檔案後,請設定該檔案,以便用於貴機構的組織政策。如要設定自訂限制,請使用
gcloud org-policies set-custom-constraint指令:gcloud org-policies set-custom-constraint CONSTRAINT_PATH將
CONSTRAINT_PATH替換成自訂限制檔案的完整路徑。
更新完成後,您就可以在組織政策中使用更新後的自訂限制。如果原始限制已強制執行,更新後的限制會立即生效。
刪除自訂限制條件
您可以使用 Google Cloud 控制台或 Google Cloud CLI 刪除自訂限制。
控制台
前往 Google Cloud 控制台的「Organization policies」(組織政策) 頁面。
選取頁面頂端的專案挑選器。
在專案挑選器中,選取要刪除組織政策的資源。
在「Organization policies」(機構政策) 頁面的清單中選取要刪除的限制,開啟該限制的「Policy details」(政策詳細資料) 頁面。
按一下「刪除」圖示 。
按一下 刪除,確認要刪除限制條件。
gcloud
如要刪除自訂限制條件,請使用 org-policies delete-custom-constraint gcloud CLI 指令:
gcloud org-policies delete-custom-constraint custom.CONSTRAINT_NAME \
--organization=ORGANIZATION_ID
更改下列內容:
ORGANIZATION_ID:組織 ID,例如123456789。CONSTRAINT_NAME:自訂限制的名稱。例如:custom.disableGkeAutoUpgrade。
輸出結果會與下列內容相似:
Deleted custom constraint [organizations/123456789/customConstraints/custom.disableGkeAutoUpgrade]
刪除自訂限制後,系統會一併刪除使用該限制建立的所有政策。刪除自訂限制後,名稱會在幾分鐘內可供使用。
測試及分析機構政策變更
建議您測試並模擬執行所有組織政策變更,瞭解變更對環境的影響。
機構政策模擬器可協助您瞭解限制和機構政策對目前環境的影響。使用這項工具,您可以在政策於正式環境中強制執行前,檢查所有資源設定,找出違規之處。如需詳細操作說明,請參閱「使用 Policy Simulator 測試組織政策變更」。
瞭解目前的效果後,您可以在模擬執行模式下建立機構政策,瞭解政策在未來 30 天內的影響和潛在違規情形。模擬測試模式下的機構政策是一種機構政策,違反政策的行為會記錄在稽核記錄中,但不會遭到拒絕。您可以使用 Google Cloud 控制台或 Google Cloud CLI,從自訂限制條件以模擬執行模式建立機構政策。如需詳細操作說明,請參閱「測試機構政策」。
強制執行自訂組織政策
設定自訂限制條件後,其運作方式與預先定義的布林值限制條件完全相同。 Google Cloud 在評估是否允許使用者要求時,系統會先檢查自訂限制條件。如果任何自訂機構政策拒絕要求,系統就會拒絕要求。然後, Google Cloud 檢查該資源是否強制執行預先定義的組織政策。
如要強制執行限制,請建立參照該限制的組織政策,然後將該政策套用至 Google Cloud 資源。控制台
- 前往 Google Cloud 控制台的「Organization policies」(組織政策) 頁面。
- 在專案挑選器中,選取要設定組織政策的專案。
- 在「Organization policies」(組織政策) 頁面的清單中選取限制,即可查看該限制的「Policy details」(政策詳細資料) 頁面。
- 如要為這項資源設定組織政策,請按一下「Manage policy」(管理政策)。
- 在「Edit policy」(編輯政策) 頁面,選取「Override parent's policy」(覆寫上層政策)。
- 按一下「Add a rule」(新增規則)。
- 在「Enforcement」(強制執行) 部分,選取是否要強制執行這項機構政策。
- 選用:如要根據標記設定組織政策的條件,請按一下「Add condition」(新增條件)。請注意,如果為組織政策新增條件式規則,您必須至少新增一項無條件規則,否則無法儲存政策。詳情請參閱「 使用標記設定組織政策範圍」。
- 按一下「Test changes」(測試變更),模擬組織政策的影響。詳情請參閱「 使用 Policy Simulator 測試組織政策變更」。
- 如要在模擬測試模式下強制執行組織政策,請按一下「設定模擬測試政策」。詳情請參閱「 測試組織政策」。
- 確認機構政策在試營運模式中運作正常後,請按一下「設定政策」,設定正式政策。
gcloud
- 如要建立含有布林值規則的組織政策,請建立參照限制的政策 YAML 檔案:
-
PROJECT_ID:要強制執行限制的專案。 -
CONSTRAINT_NAME:要為自訂限制定義的名稱,例如:custom.disableGkeAutoUpgrade。 -
如要以模擬測試模式強制執行組織政策,請執行下列指令並加上
dryRunSpec旗標: -
確認模擬測試模式中的機構政策能發揮預期效果後,請使用
org-policies set-policy指令和spec旗標設定正式政策:
name: projects/PROJECT_ID/policies/CONSTRAINT_NAME spec: rules: - enforce: true dryRunSpec: rules: - enforce: true
請替換下列項目:
gcloud org-policies set-policy POLICY_PATH --update-mask=dryRunSpec
請將 POLICY_PATH 替換為組織政策 YAML 檔案的完整路徑。政策最多需要 15 分鐘才會生效。
gcloud org-policies set-policy POLICY_PATH --update-mask=spec
請將 POLICY_PATH 替換為組織政策 YAML 檔案的完整路徑。政策最多需要 15 分鐘才會生效。
限制條件範例
您可以定義自訂限制,類似於 Google 提供的預先定義限制。典型的自訂限制條件 YAML 檔案如下所示:
name: organizations/1234567890123/customConstraints/custom.disableGkeAutoUpgrade
resourceTypes: container.googleapis.com/NodePool
methodTypes:
- CREATE
- UPDATE
condition: "resource.management.autoUpgrade == false"
actionType: ALLOW
displayName: Disable GKE auto upgrade
description: Only allow GKE NodePool resource to be created or updated if
AutoUpgrade is not enabled where this custom constraint is enforced.
一般運算語言
機構政策服務會使用一般運算語言 (CEL) 評估自訂限制的條件。CEL 是一種開放原始碼的非圖靈完備語言,可實作運算式評估的常見語意。
支援自訂限制的每項服務,都會提供特定資源組合和這些資源的欄位。可用欄位是強型別,可由自訂限制直接參照。
您可以根據欄位類型,建構參照服務資源欄位的 CEL 條件。機構政策服務支援部分 CEL 資料類型、運算式和巨集。以下各節列出可用的資料型別,以及適用於這些型別的常見運算式和巨集。
如要瞭解各項服務可用的運算式和巨集,請參閱「自訂限制支援的服務」。
下列 JSON 範例顯示您可使用自訂限制參照的每個潛在欄位類型:
{
"integerValue": 1,
"stringValue": "A text string",
"booleanValue": true,
"nestedValue": {
"nestedStringValue": "Another text string"
},
"listValue": ["foo", "bar"],
"mapValue": {
"costCenter": "123"
}
}
對於每個 CEL 運算式,當條件評估結果為 true 時,系統會強制執行自訂限制。您可以使用 and (&&) 和 or (||) 結合運算式,建立複雜的查詢。為自訂限制建立 YAML 或 JSON 檔案時,請將完整查詢內容放在雙引號 (") 內。
整數
整數字段 (例如上例中的 integerValue) 允許在條件中使用比較運算子。例如:
resource.integerValue == 1
resource.integerValue > 5
resource.integerValue < 10
字串
字串欄位 (例如上例中的 stringValue) 可以使用字串常值、規則運算式或 CEL 運算式進行評估。例如:
resource.stringValue == "abc"
// stringValue is exactly "abc".
resource.stringValue.matches("dev$")
// stringValue matches a regular expression, which specifies the string ends
// with the word "dev".
resource.stringValue.startsWith("startValue")
// stringValue starts with "startValue".
resource.stringValue.endsWith("endValue")
// stringValue ends with "endValue".
resource.stringValue.contains("fooBar")
// stringValue contains "fooBar".
巢狀欄位 (例如上一個範例中的 nestedStringValue) 必須使用完整路徑參照。例如:
resource.nestedValue.nestedStringValue == "foo"
// nestedValue contains the object nestedStringValue, which has a value of "foo".
布林值
布林值欄位 (例如上例中的 booleanValue) 包含布林值,也就是 true 或 false。
清單
清單欄位 (例如上例中的 listValue) 可根據清單大小、清單內容,以及清單中是否含有特定元素進行評估。
例如:
resource.listValue.size() >= 1 && resource.listValue[0] == "bar"
// listValue has size greater than or equal to one, and the first element is "bar".
resource.listValue.exists(value, value == "foo")
// listValue has at least one element that is exactly "foo".
resource.listValue.all(value, value.contains("foo"))
// listValue is a list of values that are all exactly "foo".
地圖
對應欄位 (例如上例中的 mapValue) 是鍵/值組合,可根據特定元素的存在與值進行評估。
例如:
has(resource.mapValue.foo) && resource.mapValue.foo == "bar"
// mapValue contains the key "foo", and that key has the value "bar".
排解自訂限制問題
下列各節說明建立自訂限制條件時的常見問題,並介紹這些問題的解決方法。
方法類型錯誤
自訂限制條件是使用強制執行的方法清單建立,通常是 CREATE 或 CREATE 和 UPDATE。如果您指定的資源不支援某種方法類型 (例如 Compute Engine 映像檔資源的 UPDATE 方法),就無法儲存自訂限制。
未評估的代碼
自訂限制支援機構、資料夾或專案資源上的標記。如要進一步瞭解哪些服務支援標記,請參閱服務專屬說明文件。
跨服務限制
部分服務 (例如 Compute Engine) 涉及大量相關資源。發生違反自訂機構政策的情況時,系統會顯示錯誤訊息,即使自訂限制適用於其他服務也一樣。
舉例來說,Compute Engine 資源的自訂限制可能會封鎖 Managed Service for Apache Spark 動作。
排解 CEL 錯誤
機構政策服務會編譯及驗證您建立的條件,如果條件語法不正確,就會傳回錯誤。如果無法建立或儲存自訂限制,可能是發生無效的 CEL 語法錯誤,請先解決這個問題。
在 Google Cloud 控制台中,系統會以「錯誤」圖示標示無效的 CEL 語法錯誤。醒目顯示這個圖示會顯示工具提示,內含語法錯誤的詳細資訊。
某些條件可能會編譯,但嘗試強制執行限制時會發生錯誤。 Google Cloud舉例來說,如果您設定的限制條件嘗試存取不存在的清單索引或對應鍵,限制條件就會在強制執行時失敗並傳回錯誤,且會封鎖任何建立資源的嘗試。
以下各節說明常見的 CEL 錯誤,以及這些錯誤的可能解決方法。
運算式無效或類型不符
如果建立條件時使用無效的運算式或類型不符,嘗試設定自訂限制時會傳回錯誤。舉例來說,假設有下列無效的自訂限制條件,會比較字串和整數:
name: organizations/1234567890123/customConstraints/custom.badConfig
resourceTypes: dataproc.googleapis.com/Cluster
methodTypes:
- CREATE
- UPDATE
condition: "resource.config.masterConfig.numInstances == 'mismatch'"
actionType: ALLOW
displayName: Number of instances is a string
description: Demonstrate that type mismatches cause an error.
如果您嘗試使用 Google Cloud CLI 設定這項限制,系統會產生錯誤:
ERROR: (gcloud.org-policies.set-custom-constraint) INVALID_ARGUMENT: Custom constraint condition [resource.config.masterConfig.numInstances == "mismatch"] is invalid. Error: ERROR: <input>:1:15: found no matching overload for '_==_' applied to '(int, string)' (candidates: (%A0, %A0))
| resource.config.masterConfig.numInstances == "mismatch"
| ..........................................^.
在 Google Cloud 控制台中,系統會以「錯誤」圖示標示無效的 CEL 語法錯誤。醒目顯示這個圖示會顯示工具提示,內含語法錯誤的詳細資訊。
機構政策服務會編譯及驗證您建立的條件,如果條件語法不正確,就會傳回錯誤。不過,某些條件可能會編譯,但在 Google Cloud 嘗試 Google Cloud 強制執行限制時傳回錯誤。舉例來說,如果您設定的限制條件嘗試存取不存在的清單索引或對應鍵,限制條件就會在強制執行時失敗並傳回錯誤,且會封鎖任何建立資源的嘗試。
建立取決於清單或對應元素的條件時,建議先檢查條件是否在所有情況下都有效。舉例來說,請先檢查 list.size(),再參照特定清單元素,或先使用 has(),再參照地圖元素。
支援的服務
每個服務都會定義一組自訂限制欄位,可用於對服務資源強制執行組織政策。如要查看支援自訂限制的服務清單,請參閱「支援自訂限制的服務」。
如要進一步瞭解如何設定機構政策掃描器,請參閱「機構政策安全漏洞發現項目」。
對資源強制執行必要標記
您可以使用自訂機構政策,強制在資源上使用標記。強制執行必要標記後,您只能建立符合機構標記政策的資源,也就是資源會繫結至政策中指定必要標記鍵的標記值。詳情請參閱「設定自訂限制來強制執行標記」。