本頁說明如何使用 Organization Policy Service 自訂限制,限制對下列 Google Cloud 資源執行的特定作業:
binaryauthorization.googleapis.com/Policy
binaryauthorization.googleapis.com/Attestor
如要進一步瞭解機構政策,請參閱「自訂機構政策」。
關於機構政策和限制
Google Cloud 機構政策服務可讓您透過程式以集中方式控管機構的資源。身為機構政策管理員,您可以定義機構政策,也就是一組稱為「限制」的限制,適用於Google Cloud 資源和Google Cloud 資源階層中這些資源的子系。您可以在機構、資料夾或專案層級強制執行機構政策。
機構政策提供各種 Google Cloud 服務的內建代管限制。不過,如要更精細地自訂機構政策中受限的特定欄位,也可以建立自訂限制,並在機構政策中使用這些自訂限制。
政策繼承
根據預設,機構政策會由您強制執行政策的資源子系繼承。舉例來說,如果您對資料夾強制執行政策, Google Cloud 系統會對該資料夾中的所有專案強制執行政策。如要進一步瞭解這項行為及如何變更,請參閱「階層評估規則」。
優點
使用自訂機構政策,透過二進位授權政策執行下列操作:
- 強制使用者授權部署系統映像檔,以落實安全規定。
- 確認二進位授權政策中所有 Pod 部署作業都必須經過認證。
- 確認用於認證驗證的二進位授權政策中包含特定驗證者。
- 在二進位授權政策中,將允許的操作限制為定義的允許清單模式。
使用自訂機構政策,透過二進位授權認證執行下列操作:
- 請務必使用描述性中繼資料建立認證者,清楚定義認證者的用途。
- 請務必使用特定預先決定的簽章演算法,為每個認證者產生相關聯的加密金鑰。
事前準備
- 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.
-
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.
-
Verify that billing is enabled for your Google Cloud project.
-
Install the Google Cloud CLI.
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
如要初始化 gcloud CLI,請執行下列指令:
gcloud init
- 請確認您知道機構 ID。
-
機構政策管理員 (
roles/orgpolicy.policyAdmin
) 機構資源 -
如要更新政策,請按照下列步驟操作:
二進位授權政策角色 (
roles/binaryauthorization.policyEditor
) 專案 -
如要建立及更新驗證者,請在專案中指派以下角色:
二進位授權驗證者角色 (
roles/binaryauthorization.attestorsAdmin
) -
orgpolicy.*
機構資源 -
如要更新二進位授權政策,請按照下列步驟操作:
-
專案資源的
binaryauthorization.policy.update
-
專案資源的
binaryauthorization.policy.get
-
專案資源的
-
如要建立或更新二進位授權驗證者,請按照下列步驟操作:
-
專案資源的
binaryauthorization.attestors.get
-
專案資源的
binaryauthorization.attestors.list
-
專案資源的
binaryauthorization.attestors.create
-
專案資源的
binaryauthorization.attestors.update
-
專案資源的
ORGANIZATION_ID
:您的機構 ID,例如123456789
。CONSTRAINT_NAME
:新自訂限制的名稱。自訂限制條件必須以custom.
開頭,且只能包含大寫英文字母、小寫英文字母或數字。例如,custom.ensureBinaryAuthorizationEnforcementEnabled
。這個欄位的長度上限為 70 個字元。RESOURCE_NAME
:包含要限制物件和欄位的Google Cloud 資源完整名稱。例如:binaryauthorization.googleapis.com/Policy
。CONDITION
:針對支援服務資源的代表項目編寫的 CEL 條件。這個欄位的長度上限為 1000 個字元。如要進一步瞭解可編寫條件的資源,請參閱「支援的資源」。例如:"resource.defaultAdmissionRule.enforcementMode == 'ENFORCED_BLOCK_AND_AUDIT_LOG'"
。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.ensureBinaryAuthorizationEnforcementEnabled
。 - 每個專案只需啟用一次 Binary Authorization API。
- 瞭解機構 ID。
- 瞭解專案 ID。
將下列檔案儲存為
constraint.yaml
:name: organizations/ORGANIZATION_ID/customConstraints/custom.ensureBinaryAuthorizationEnforcementEnabled resourceTypes: - binaryauthorization.googleapis.com/Policy methodTypes: - CREATE - UPDATE condition: "resource.defaultAdmissionRule.enforcementMode == 'ENFORCED_BLOCK_AND_AUDIT_LOG'" actionType: ALLOW displayName: Ensure Binary Authorization Enforcement is enabled description: Binary Authorization policy must have enforcement enabled to block deployments if one or more required attestations are missing.
除非將
defaultAdmissionRule.enforcementMode
設為ENFORCED_BLOCK_AND_AUDIT_LOG
,否則這項限制會禁止更新二進位授權政策。套用限制:
gcloud org-policies set-custom-constraint ~/constraint.yaml
確認限制條件是否存在:
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
輸出結果會與下列內容相似:
CUSTOM_CONSTRAINT: custom.ensureBinaryAuthorizationEnforcementEnabled ACTION_TYPE: DENY METHOD_TYPES: CREATE,UPDATE RESOURCE_TYPES: binaryauthorization.googleapis.com/Policy DISPLAY_NAME: Ensure Binary Authorization Enforcement is enabled
將下列檔案儲存為
policy.yaml
:name: projects/PROJECT_ID/policies/custom.ensureBinaryAuthorizationEnforcementEnabled spec: rules: - enforce: true
將
PROJECT_ID
替換為您的專案 ID。套用政策:
gcloud org-policies set-policy ~/policy.yaml
確認政策存在:
gcloud org-policies list --project=PROJECT_ID
輸出結果會與下列內容相似:
CONSTRAINT: custom.ensureBinaryAuthorizationEnforcementEnabled LIST_POLICY: - BOOLEAN_POLICY: SET ETAG: CJSetr4GEPil1JAB-
必要的角色
如要取得管理機構政策所需的權限,請要求管理員授予下列 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 就會開始強制執行政策。
測試政策
cat > binauthzPolicy.yaml << EOM
globalPolicyEvaluationMode: DISABLE
defaultAdmissionRule:
evaluationMode: ALWAYS_DENY
enforcementMode: DRYRUN_AUDIT_LOG_ONLY
EOM
gcloud container binauthz policy import binauthzPolicy.yaml '--format=json'
輸出內容如下:
Operation denied by org policy: ["customConstraints/custom.ensureBinaryAuthorizationEnforcementEnabled": "Pod deployment should be blocked when admission rule are not satisfied."].
常見用途的自訂機構政策範例
下表提供一些常見用途的自訂限制語法:
說明 | 限制語法 |
---|---|
確認二進位授權政策中是否包含認證 |
name: organizations/ORGANIZATION_ID/customConstraints/custom.podCreationRequireAttestations resourceTypes: - binaryauthorization.googleapis.com/Policy methodTypes: - CREATE - UPDATE condition: "resource.defaultAdmissionRule.evaluationMode == 'REQUIRE_ATTESTATION'" actionType: ALLOW displayName: Attestations are required in Binary Authorization Policy description: Binary Authorization Policy evaluation requires attestations. |
確認准入規則中是否有特定認證者 |
name: organizations/ORGANIZATION_ID/customConstraints/custom.policyWithParticularAttestor resourceTypes: - binaryauthorization.googleapis.com/Policy methodTypes: - CREATE - UPDATE condition: "resource.defaultAdmissionRule.requireAttestationsBy.size() > 0 && resource.defaultAdmissionRule.requireAttestationsBy.exists(value, value.matches(r'^projects/[^/]+/attestors/qa-attestor$'))" actionType: ALLOW displayName: Ensure Binary Authorization policy contains qa-attestor. description: Ensure Binary Authorization policy contains qa-attestor. |
如果沒有說明,就不允許建立驗證者 |
name: organizations/ORGANIZATION_ID/customConstraints/custom.enforceAttestorDescription resourceTypes: - binaryauthorization.googleapis.com/Attestor methodTypes: - CREATE - UPDATE condition: "resource.description == ''" actionType: DENY displayName: Deny Attestor creation that have no description. description: Binary Authorization Attestor should have description associated with it. |
只允許金鑰使用特定簽章演算法 |
name: organizations/ORGANIZATION_ID/customConstraints/custom.allowParticularKeySignatureAlgorithm resourceTypes: - binaryauthorization.googleapis.com/Attestor methodTypes: - CREATE - UPDATE condition: "resource.userOwnedGrafeasNote.publicKeys.all(publicKey, publicKey.pkixPublicKey.signatureAlgorithm == 'ECDSA_P256_SHA256')" actionType: ALLOW displayName: Allow particular signature algorithm description: Only particular signature Algorithm is allowed. |
二進位授權支援的資源
下表列出可在自訂限制中參照的 Binary Authorization 資源。資源 | 欄位 |
---|---|
binaryauthorization.googleapis.com/Attestor |
resource.description
|
resource.name
| |
resource.userOwnedGrafeasNote.noteReference
| |
resource.userOwnedGrafeasNote.publicKeys.asciiArmoredPgpPublicKey
| |
resource.userOwnedGrafeasNote.publicKeys.comment
| |
resource.userOwnedGrafeasNote.publicKeys.pkixPublicKey.keyId
| |
resource.userOwnedGrafeasNote.publicKeys.pkixPublicKey.publicKeyPem
| |
resource.userOwnedGrafeasNote.publicKeys.pkixPublicKey.signatureAlgorithm
| |
binaryauthorization.googleapis.com/Policy |
resource.admissionWhitelistPatterns.namePattern
|
resource.clusterAdmissionRules[*].enforcementMode
| |
resource.clusterAdmissionRules[*].evaluationMode
| |
resource.clusterAdmissionRules[*].requireAttestationsBy
| |
resource.defaultAdmissionRule.enforcementMode
| |
resource.defaultAdmissionRule.evaluationMode
| |
resource.defaultAdmissionRule.requireAttestationsBy
| |
resource.description
| |
resource.globalPolicyEvaluationMode
| |
resource.istioServiceIdentityAdmissionRules[*].enforcementMode
| |
resource.istioServiceIdentityAdmissionRules[*].evaluationMode
| |
resource.istioServiceIdentityAdmissionRules[*].requireAttestationsBy
| |
resource.kubernetesNamespaceAdmissionRules[*].enforcementMode
| |
resource.kubernetesNamespaceAdmissionRules[*].evaluationMode
| |
resource.kubernetesNamespaceAdmissionRules[*].requireAttestationsBy
| |
resource.kubernetesServiceAccountAdmissionRules[*].enforcementMode
| |
resource.kubernetesServiceAccountAdmissionRules[*].evaluationMode
| |
resource.kubernetesServiceAccountAdmissionRules[*].requireAttestationsBy
|