為了滿足叢集合規性要求、提升叢集安全性,推薦您啟用安全性原則管理功能。安全性原則管理功能提供了符合Kubernetes容器應用情境的安全性原則規則,包括Infra(基礎設施層資源)、Compliance(Kubernetes合規規範)、PSP(基於PodSecurityPolicy能力的拓展)和K8s-general(通用策略)維度。您可以在控制台為容器應用開啟或自訂安全性原則,驗證Pod的部署和更新是否安全可控。
策略治理介紹
自Kubernetes 1.21起,PodSecurityPolicy(PSP)被標記為棄用(Deprecated)狀態。為此,ACK升級了原先基於PSP的策略管理功能。基於使用OPA策略的Gatekeeper Admission Controller,ACK擴充了相應的策略治理狀態統計、日誌上報檢索等能力,同時內建了種類豐富的策略治理規則庫,提供符合更多Kubernetes應用情境的策略規則。在規則配置上,您可以在控制台上白屏化配置,降低使用原則治理相關能力的門檻。
前提條件
叢集版本為1.16及以上。如需升級叢集,請參見手動升級叢集。
如需使用RAM使用者進行策略管理時,請確保該RAM使用者擁有以下授權:
cs:DescribePolicies:列舉策略治理規則庫列表cs:DescribePoliceDetails:擷取策略規則模板詳情cs:DescribePolicyGovernanceInCluster:擷取叢集策略治理詳情cs:DescribePolicyInstances:擷取叢集中當前部署的策略執行個體列表cs:DescribePolicyInstancesStatus:擷取叢集當前不同策略類型對應的執行個體部署狀態cs:DeployPolicyInstance:在指定叢集中部署策略規則執行個體cs:DeletePolicyInstance:在指定叢集中刪除策略規則執行個體cs:ModifyPolicyInstance:在指定叢集中修改策略規則執行個體
關於如何自訂RAM授權策略,請參見使用RAM授予叢集及雲資源存取權限。
安全性原則組件對比
ACK提供兩種安全性原則組件形態:託管版與非託管版。叢集在同一時間只能啟用其中一種。兩者詳細對比如下。
差異項 | 託管版 | 非託管版 |
部署模式 | 控制面託管:部署在叢集控制面,由ACK全面託管 | 資料面部署:通過工作負載的形式部署在叢集中,預設安裝在kube-system命名空間下,會佔用Worker節點的Pod資源 |
適用叢集 | 1.30及以上版本的Auto Mode叢集 | 1.16及以上版本的ACK託管叢集、ACK專有叢集 |
啟用參數配置 | 組件的啟動參數由系統預設配置,不支援自訂 | 可自訂修改組件的啟動參數 |
核心組件安裝 |
在控制台的組件管理頁面,託管版組件卡片將顯示託管 |
|
策略日誌採集 | 通過採集ACK託管叢集控制面組件日誌發送到指定的SLS Project中 | 通過在叢集中安裝日誌採集組件以採集日誌,並發送至指定的SLS Project中 |
策略規則庫 | 容器安全性原則規則庫說明中的所有策略 |
|
注意事項
僅適用於Linux節點。
不支援自訂策略規則。所有規則均來自於阿里雲Container Service內建的規則庫。
步驟一:安裝或升級安全性原則管理組件
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在策略管理頁面,根據頁面提示安裝或升級組件。
啟用安全性原則管理功能時,需安裝以下組件。以下組件本身不收取費用,但會佔用您的Pod資源。
gatekeeper組件:基於OPA策略引擎的Kubernetes策略准入控制器,便於您管理和應用叢集內的OPA策略,實現命名空間標籤管理等功能。
說明僅支援使用ACK叢集提供的gatekeeper組件。如您通過其他途徑安裝了gatekeeper組件,請卸載後重新安裝。關於gatekeeper組件的版本發布資訊,請參見gatekeeper。
日誌採集組件:用於收集和檢索不符合策略約束的攔截或警示事件。
policy-template-controller組件:基於阿里雲原則範本開發的Kubernetes控制器,便於您更好地管理基於不同原則範本部署的策略執行個體和叢集整體的治理狀態。
步驟二:使用安全性原則管理功能
操作入口
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在策略管理頁面,按頁面提示完成組件的安裝或升級(如有),然後按需進行以下操作。
查看叢集當前安全性原則執行狀態
您可以單擊策略實施總覽頁簽,查看叢集當前的策略治理狀態。
策略開啟總覽,包括高危和中危防護策略的總數和已開啟數展示,以及建議開啟的策略列表等。
近7天攔截和警示結果統計。
近7天策略實施記錄,當前頁面表格中會預設展示7天內最近100條的攔截或警示日誌,如果您想查看更多審計日誌,可以單擊近7天策略實施記錄後的
表徵圖,並單擊懸浮視窗中的Log Service連結在SLSLog Service控制台指定的logstore中查看全部日誌。
建立並管理安全性原則執行個體
單擊我的策略頁簽,然後單擊建立策略執行個體,在建立策略執行個體對話方塊配置相關參數。
配置項 | 說明 |
策略類型 | 首先選擇策略類型,包括如下大類:
更多資訊,請參見容器安全性原則規則庫說明。 |
策略名稱稱 | 根據選擇的策略類型,在策略名稱稱下拉式清單中選擇需要部署的原則範本名稱。 |
實施動作 |
|
作用範圍 | 選擇策略執行個體實施在叢集中哪些指定的命名空間。 |
參數配置 |
|
查看安全性原則列表和叢集中已部署的安全性原則執行個體
單擊我的策略頁簽,查看叢集所有可部署的策略名稱稱。
您可以在列表右上方篩選顯示的策略。已開啟的策略名稱稱會優先展示。策略執行個體數會顯示對應策略在叢集中已部署的執行個體個數。
如果策略執行個體數為空白,表明該策略還未在叢集中部署,可在操作列單擊開啟配置參數並部署對應的策略執行個體。

單擊操作列中的編輯可以修改策略執行個體的配置。
當策略在叢集中已部署超過1個執行個體時,可單擊操作列的查看策略執行個體,然後單擊編輯修改相關配置。
單擊操作列中的刪除,可以刪除該策略在叢集中部署的所有執行個體。
關於策略說明和模板樣本的更多資訊,請參見容器安全性原則規則庫說明。
相關操作
為命名空間或Service開啟刪除保護
參見步驟一:安裝或升級安全性原則管理組件啟用安全性原則管理功能後,您還可以為涉及關鍵業務、敏感性資料的命名空間或Service開啟刪除保護功能,以避免誤刪除帶來的維護成本。啟用後,僅當您手動關閉刪除保護後,對應的資源才可以被刪除。
下文以為存量命名空間的開啟刪除保護為例,介紹流程步驟。其他動作步驟流程類似,您可以進入控制台對應頁面,按照頁面提示完成配置。
為存量命名空間開啟刪除保護
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇命名空間與配額。
在命名空間列表的操作列,單擊編輯,在對話方塊中按照頁面完成刪除保護的啟用。
為存量Service開啟刪除保護
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在服務列表的操作列,單擊
,然後單擊開啟刪除保護,在對話方塊中按照頁面完成刪除保護的啟用。
通過ack-policy-external-provider實現跨資源驗證
預設情況下,Gatekeeper 策略的決策依據僅限於被審查的資源本身。但在許多複雜的安全情境中,策略需要引用叢集中的其他資源狀態才能做出正確判斷。
託管組件 ack-policy-external-provider 可充當 Gatekeeper 的外部資料源,讓策略開發人員可以在策略代碼(Rego)中查詢Kubernetes資源(如內建的CRD保護原則)。
ack-policy-external-provider需配合gatekeeper使用。請確保叢集中已部署 gatekeeper。
安裝和配置ack-policy-external-provider
在ACK叢集列表頁面,單擊目的地組群名稱,在叢集詳情頁左側導覽列,單擊组件管理。
搜尋並定位ack-policy-external-provider,按照頁面提示完成配置。
ProviderPodNumber:組件的執行個體個數。
ProtectedKinds:添加需要保護 CRD 對應的資源類型。
CRD 刪除保護需要檢查叢集中是否存在該資源類型的執行個體。遵循最小化許可權原則,ack-policy-external-provider預設不具備該檢查所需的查詢許可權,需手動設定。

介面定義及參數說明
ack-policy-external-provider 實現了一個標準的 Gatekeeper 外部資料 Provider。可在 Rego 原則範本中,通過調用 external_data 函數並指定 provider: ack-policy-external-data-provider,來向該組件發起資源查詢請求。
請求參數以 JSON 格式定義,樣本如下。
// 樣本 1
{
"action": "ListK8sResource",
"namespaced": false,
"group": "",
"version": "v1",
"resource": "persistentvolumeclaims"
"requestID": review.uid,
"userInfo": review.userInfo,
"requestFrom": "PVCProtector",
"labelSelector": "protected",
"limit": 1
}
// 樣本 2
{
"action": "GetK8sResource",
"namespaced": true,
"namespace": "default",
"group": "apps",
"version": "v1",
"resource": "deployments",
"requestID": review.uid,
"userInfo": review.userInfo,
"requestFrom": "FinOpsPolicy",
"labelSelector": "protected",
"limit": 1
}核心參數說明:
參數 | 說明 | 是否必選 |
| 操作類型,支援 | 是 |
| 目標資源的 API Group。 | 是 |
| 目標資源的 API Version。 | 否 |
| 目標資源的複數名稱(例如 | 是 |
| 目標資源是否位於命名空間內。 叢集範圍內資源請使用 | 是 |
| 當 | 否 |
| 當 | 否 |
| 基於標籤篩選資源,遵循 Kubernetes Label Selector 規範。 | 否 |
|
| 否 |
| 請求的唯一ID,建議使用 | 否 |
| 發起請求的使用者資訊,建議使用 | 否 |
| 請求來源標識,通常為原則範本名稱,用於日誌追溯。 | 是 |
情境樣本:防止CRD被刪除
本樣本展示利用 ack-policy-external-provider 實現一個常見的進階策略:當 CRD 仍然存在關聯的 CR 執行個體時,禁止刪除該 CRD。
此策略已作為內建規則集成到策略庫中,無需手動部署。僅作為原理說明。
策略邏輯
查詢:Rego 策略通過
external_data調用 ack-policy-external-provider。判斷:ack-policy-external-provider 根據請求參數查詢叢集中是否存在對應的 CR 執行個體。
決策:如果查詢結果返回了至少一個 CR 執行個體,ack-policy-external-provider 會將結果返回給 Rego 策略,策略最終會
deny(拒絕) 本次刪除操作。
原則範本(ConstraintTemplate)
定義策略的邏輯。
apiVersion: templates.gatekeeper.sh/v1beta1 kind: ConstraintTemplate metadata: name: blockcrddeletion annotations: meta.helm.sh/release-name: gatekeeper meta.helm.sh/release-namespace: kube-system metadata.gatekeeper.sh/version: 1.0.0 labels: app.kubernetes.io/managed-by: Helm spec: crd: spec: names: kind: BlockCrdDeletion validation: legacySchema: true targets: - target: admission.k8s.gatekeeper.sh rego: | package block_crd_deletion violation[{"msg": msg}] { before(input.review.operation) response := handle(input.review) msg := after(response) } before(operation) { operation == "DELETE" } handle(review) = response { customrequest := { "action": "ListK8sResource", "namespaced": false, "group": review.object.spec.group, "version": "", "resource": review.object.spec.names.plural, "requestID": review.uid, "userInfo": review.userInfo, "requestFrom": "BlockCrdDeletion", "labelSelector": "protected", "limit": 1 } request_keys := [json.marshal(customrequest)] response := external_data({ "provider": "ack-policy-external-data-provider", "keys": request_keys }) } after(response) = msg { count(response.responses[0]) > 0 msg := sprintf( "The CRD %v is not allowed to be deleted. Reason: It is not allowed to delete a CRD object when it contains a collection of custom resources. Current existing custom resources: %v, etc.", [input.review.name, response.responses[0][0]] ) }策略執行個體(Constraint)
將模板應用到具體資源。本樣本應用到所有CRD。
apiVersion: constraints.gatekeeper.sh/v1beta1 kind: BlockCrdDeletion metadata: name: block-crd-deletion-rule spec: enforcementAction: deny match: kinds: - apiGroups: - '*' kinds: - CustomResourceDefinition效果驗證
建立一個測試 CRD 和對應的 CR 執行個體:
# 建立 CRD apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: simplestthings.example.com spec: group: example.com scope: Namespaced names: plural: simplestthings singular: simplestthing kind: SimplestThing versions: - name: v1 served: true storage: true schema: openAPIV3Schema: type: object properties: spec: type: object properties: message: type: string --- # 建立 CR 執行個體 apiVersion: example.com/v1 kind: SimplestThing metadata: name: my-simple-thing namespace: default labels: protected: "false" spec: message: "Hello"嘗試刪除該 CRD。
kubectl delete crd simplestthings.example.com查看刪除操作是否被策略攔截,並返回明確的錯誤資訊。
預期輸出:
% kubectl delete crd simplestthings.example.com Error from server (Forbidden): admission webhook "delete.validation.gatekeeper.sh" denied the request: [block-crd-deletion-rule] The CRD simplestthings.example.com is not allowed to be deleted. Reason: It is not allowed to delete a CRD object when it contains a collection of custom resources. Current existing custom resources: my-simple-thing, etc.
相關文檔
配置巡檢功能可以掃描叢集中工作負載配置的安全隱患。更多資訊,請參見配置巡檢檢查叢集工作負載。