您可以透過 Policy Controller 限制物件,對 Kubernetes 叢集強制執行政策。如要測試政策,您可以將強制執行動作新增至限制。然後您就能在限制物件和記錄中查看違規事項。
如果您是 IT 管理員和作業人員,希望確保雲端平台中執行的所有資源都符合機構的法規遵循規定,並提供及維護自動化功能來稽核或強制執行規定,以及管理基礎技術架構的生命週期,歡迎參閱這個頁面。如要進一步瞭解我們在Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE Enterprise 使用者角色和工作」。
違規處置類型
有三種強制執行動作:deny
、dryrun
和 warn
。
deny
是預設的違規處置。即使您未在限制中新增強制執行動作,這項功能也會自動啟用。使用 deny
可防止違規時發生特定叢集作業。
dryrun
可讓您監控規則違規情形,而不主動封鎖交易。您可以使用這項功能測試限制是否正常運作,然後再使用 deny
動作啟用強制執行功能。以這種方式測試限制條件,可避免因限制條件設定錯誤而導致中斷。
warn
與 dryrun
類似,但也會立即提供有關在准入時發生違規行為的訊息。
測試新限制或執行遷移作業 (例如升級平台) 時,建議將強制執行動作從 deny
切換為 warn
或 dryrun
,以便測試政策是否正常運作。
新增違規處置
您可以在限制條件中新增 enforcementAction: deny
或 enforcementAction: dryrun
。
以下名為 audit.yaml
的限制範例會新增 dryrun
動作。
#audit.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPAllowedUsers
metadata:
name: user-must-be-3333
spec:
enforcementAction: dryrun
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
parameters:
runAsUser:
rule: MustRunAs
ranges:
- min: 3333
max: 3333
建立限制。舉例來說,使用 kubectl apply -f
套用:
kubectl apply -f audit.yaml
查看稽核結果
稽核違規事項會附加至 Constraint 物件,並寫入記錄。記錄檔不會顯示存取控制器拒絕的違規事項。
在限制物件中查看稽核結果
如要查看特定限制的違規事項,請執行下列指令並查看 spec.status
欄位。
kubectl get constraint-kind constraint-name -o yaml
範例
如要查看 audit.yaml
的限制條件輸出內容,請執行下列指令:
kubectl get K8sPSPAllowedUsers user-must-be-3333 -o yaml
您看到的輸出內容類似如下:
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPAllowedUsers
metadata:
creationTimestamp: "2020-05-22T01:34:22Z"
generation: 1
name: user-must-be-3333
resourceVersion: "13351707"
selfLink: /apis/constraints.gatekeeper.sh/v1beta1/k8spspallowedusers/user-must-be-3333
uid: 5d0b39a8-9bcc-11ea-bb38-42010a80000c
spec:
enforcementAction: dryrun
match:
kinds:
- apiGroups:
- ""
kinds:
- Pod
parameters:
runAsUser:
ranges:
- max: 3333
min: 3333
rule: MustRunAs
status:
auditTimestamp: "2020-05-22T01:39:05Z"
byPod:
- enforced: true
id: gatekeeper-controller-manager-6b665d4c4d-lwnz5
observedGeneration: 1
totalViolations: 5
violations:
- enforcementAction: dryrun
kind: Pod
message: Container git-sync is attempting to run as disallowed user 65533
name: git-importer-86564db8cb-5r4gs
namespace: config-management-system
- enforcementAction: dryrun
kind: Pod
message: Container manager is attempting to run as disallowed user 1000
name: gatekeeper-controller-manager-6b665d4c4d-lwnz5
namespace: gatekeeper-system
- enforcementAction: dryrun
kind: Pod
message: Container kube-proxy is attempting to run without a required securityContext/runAsUser
name: kube-proxy-gke-fishy131-default-pool-7369b17c-cckf
namespace: kube-system
- enforcementAction: dryrun
kind: Pod
message: Container kube-proxy is attempting to run without a required securityContext/runAsUser
name: kube-proxy-gke-fishy131-default-pool-7369b17c-jnhb
namespace: kube-system
- enforcementAction: dryrun
kind: Pod
message: Container kube-proxy is attempting to run without a required securityContext/runAsUser
name: kube-proxy-gke-fishy131-default-pool-7369b17c-xrd8
namespace: kube-system
在記錄中查看稽核結果
您可以使用記錄檔探索工具,擷取、查看及分析 Policy Controller 的記錄檔資料。
如要取得所有 Policy Controller 記錄,請執行下列指令:
kubectl logs -n gatekeeper-system -l gatekeeper.sh/system=yes
稽核結果的記錄行中含有 "process":"audit"
,因此您可以將輸出內容管道傳輸至其他指令,並依這些行進行篩選。舉例來說,您可以使用 jq
剖析 JSON 檔案,並為特定記錄類型設定篩選器。
記錄檔中的稽核結果範例:
{
"level":"info",
"ts":1590111401.9769812,
"logger":"controller",
"msg":"Container kube-proxy is attempting to run without a required securityContext/runAsUser",
"process":"audit",
"audit_id":"2020-05-22T01:36:24Z",
"event_type":"violation_audited",
"constraint_kind":"K8sPSPAllowedUsers",
"constraint_name":"user-must-be-3333",
"constraint_namespace":"",
"constraint_action":"dryrun",
"resource_kind":"Pod",
"resource_namespace":"kube-system",
"resource_name":"kube-proxy-gke-fishy131-default-pool-7369b17c-xrd8"
}
後續步驟
- 進一步瞭解如何建立限制
- 使用限制範本庫
- 瞭解如何使用限制取代 PodSecurityPolicies