使用限制進行稽核

您可以透過 Policy Controller 限制物件,對 Kubernetes 叢集強制執行政策。如要測試政策,您可以將強制執行動作新增至限制。然後您就能在限制物件和記錄中查看違規事項。

如果您是 IT 管理員和作業人員,希望確保雲端平台中執行的所有資源都符合機構的法規遵循規定,並提供及維護自動化功能來稽核或強制執行規定,以及管理基礎技術架構的生命週期,歡迎參閱這個頁面。如要進一步瞭解我們在Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE Enterprise 使用者角色和工作」。

違規處置類型

有三種強制執行動作:denydryrunwarn

deny 是預設的違規處置。即使您未在限制中新增強制執行動作,這項功能也會自動啟用。使用 deny 可防止違規時發生特定叢集作業。

dryrun 可讓您監控規則違規情形,而不主動封鎖交易。您可以使用這項功能測試限制是否正常運作,然後再使用 deny 動作啟用強制執行功能。以這種方式測試限制條件,可避免因限制條件設定錯誤而導致中斷。

warndryrun 類似,但也會立即提供有關在准入時發生違規行為的訊息。

測試新限制或執行遷移作業 (例如升級平台) 時,建議將強制執行動作從 deny 切換為 warndryrun,以便測試政策是否正常運作。

新增違規處置

您可以在限制條件中新增 enforcementAction: denyenforcementAction: 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"
}

後續步驟