本文說明 Google Kubernetes Engine (GKE) 的稽核記錄政策。本文假設您已瞭解下列事項:
GKE 會擷取並記錄叢集中的事件,而記錄的資訊、資訊儲存位置,以及影響稽核記錄顯示內容的政策,都取決於多項因素。
本文適用於資安專家,可協助您深入瞭解叢集中的活動,以便監控安全威脅、追蹤變更及排解問題。如要進一步瞭解 Google Cloud 內容中提及的常見角色和工作範例,請參閱「常見的 GKE 使用者角色和工作」。
如要瞭解如何啟用及查看不同類型的稽核記錄,以及所需的 IAM 權限,請參閱「GKE 稽核記錄資訊」。
稽核政策總覽
在 GKE 叢集中,Kubernetes API 伺服器會將稽核記錄項目寫入 GKE 管理的後端。GKE 收到 Kubernetes API 伺服器的記錄項目後,會將這些項目寫入專案的管理員活動記錄和資料存取記錄。
有兩個政策會影響您在專案稽核記錄裡看到的內容:
Kubernetes 稽核政策,用以定義事件記錄為記錄項目時應遵循的規則。此外,此政策也指定應該納入記錄項目之中的資料。
GKE 稽核政策會決定哪些項目會寫入管理員活動記錄,哪些會寫入資料存取記錄。
寫入資料存取記錄的稽核記錄取決於稽核記錄設定。資料存取記錄採用 Google Cloud Observability 定價。管理員活動記錄不收費。GKE 支援下列類型的資料存取記錄。
ADMIN_READ:讀取 Kubernetes 資源中繼資料的操作,例如列出 Pod。DATA_READ:讀取 Kubernetes 資源中資料的操作,例如讀取 Pod 的記錄。DATA_WRITE:將資料寫入 Kubernetes 資源的操作,例如更新 Pod 狀態。
詳情請參閱「設定資料存取稽核記錄」。
Kubernetes 稽核政策
Kubernetes API 伺服器會遵循 kube-apiserver 指令的 --audit-policy-file 旗標中指定的政策。
GKE 啟動 Kubernetes API 伺服器時,會設定 --audit-policy-file 旗標的值,提供稽核政策檔案。在開放原始碼 Kubernetes 存放區中,您可以看到 configure-helper.sh 指令碼,這個指令碼會產生稽核政策檔案。只要直接查看指令碼,就能看到稽核政策檔案大部分的內容。
事件和階段
某個人或某個元件向 Kubernetes API 伺服器提出要求時,該要求會經過一或多個「階段」:
| 階段 | 說明 |
|---|---|
| RequestReceived (要求已收到) | 稽核處理常式已收到要求。 |
| ResponseStarted (回應已開始) | 回應標頭已傳送,但回應內文尚未傳送。 |
| ResponseComplete (回應已完成) | 回應內文已完成,不會再送出更多位元組。 |
| Panic (錯誤) | 發生內部伺服器錯誤,該要求未完成。 |
各個要求階段分別會產生一個「事件」,而事件會根據政策進行處理。政策會指定事件是否應記錄為記錄項目,如果答案為是,那麼政策也會指定哪些資料應納入記錄項目之中。
稽核層級
Kubernetes 稽核政策檔案含有規則清單。在政策檔案中,第一條符合事件的規則會設定事件的「稽核層級」。
規則可指定以下其中一個稽核層級:
| 層級 | 說明 |
|---|---|
| None (無) | 不替事件建立記錄項目。 |
| Metadata (中繼資料) | 建立記錄項目。將中繼資料納入,但不納入要求內文或回應內文。 |
| Request (要求) | 建立記錄項目。將中繼資料與要求內文納入,但不納入回應內文。 |
| RequestResponse (要求回應) | 建立記錄項目。將中繼資料、要求內文和回應內文全數納入。 |
以下為規則範例。如果事件符合規則,Kubernetes API 伺服器就會在 Request 層級建立記錄項目。
- level: Request
userGroups: ["system:nodes"]
verbs: ["update","patch"]
resources:
- group: "" # core
resources: ["nodes/status", "pods/status"]
omitStages:
- "RequestReceived"
如果符合下列所有條件,就表示事件與規則相符:
- 該事件不符合政策檔案裡任何一條先前的規則。
- 發出呼叫的身分位於
system:nodes使用者群組中。 - 呼叫是
update要求或patch要求。 - 要求是針對
nodes/status資源或pods/status資源。 - 事件不適用於通話的
RequestReceived階段。
GKE 稽核政策
GKE 收到 Kubernetes API 伺服器的記錄項目後,會套用自己的政策,判斷哪些項目要寫入專案的管理員活動記錄,哪些項目要寫入專案的資料存取記錄。
在大多數情況下,GKE 會對來自 Kubernetes API 伺服器的記錄項目套用下列規則:
代表
create、delete和update要求的項目會傳送至管理員活動記錄。代表
get、list和updateStatus要求的項目會傳送至資料存取記錄。
有關定價和預設啟用記錄類型的詳情,請參閱記錄詳細資料。
GKE 叢集的 Kubernetes 稽核政策檔案
如果是 GKE 叢集,Kubernetes 稽核政策檔案會以規則開頭,指定不應記錄特定事件。舉例來說,這項規則指出,kubelet 對 nodes 資源或 nodes/status 資源提出的任何 get 要求都不應記錄。請注意,None 級別表示不應記錄任何相符事件:
- level: None
users: ["kubelet"] # legacy kubelet identity
verbs: ["get"]
resources:
- group: "" # core
resources: ["nodes", "nodes/status"]
在 level: None 規則清單之後,政策檔案會列出特殊情況的規則。例如,以下是特殊案例規則,用於記錄 Metadata 層級的特定要求:
- level: Metadata
resources:
- group: "" # core
resources: ["secrets", "configmaps"]
- group: authentication.k8s.io
resources: ["tokenreviews"]
omitStages:
- "RequestReceived"
如果符合下列所有條件,就表示事件與規則相符:
- 該事件不符合政策檔案裡任何一條先前的規則。
- 要求是針對
secrets、configmaps或tokenreviews類型的資源。 - 事件不適用於通話的
RequestReceived階段。
在特殊案例規則清單之後,政策檔案會有一些一般規則。如要查看指令碼中的一般規則,您必須將 known_apis 的值替換為 ${known_apis}。取代後就會獲得這樣的規則:
- level: Request
verbs: ["get", "list", "watch"]
resources:
- group: "" # core
- group: "admissionregistration.k8s.io"
- group: "apiextensions.k8s.io"
- group: "apiregistration.k8s.io"
- group: "apps"
- group: "authentication.k8s.io"
- group: "authorization.k8s.io"
- group: "autoscaling"
- group: "batch"
- group: "certificates.k8s.io"
- group: "extensions"
- group: "metrics.k8s.io"
- group: "networking.k8s.io"
- group: "policy"
- group: "rbac.authorization.k8s.io"
- group: "settings.k8s.io"
- group: "storage.k8s.io"
omitStages:
- "RequestReceived"
這項規則適用於不符合政策檔案中任何先前規則,且不處於 RequestReceived 階段的事件。規則指出,如果對屬於其中一個列出群組的任何資源提出 get、list 和 watch 要求,應在 Request 層級記錄。
政策檔案裡的下一條規則如下所示:
- level: RequestResponse
resources:
- group: "" # core
- group: "admissionregistration.k8s.io"
- group: "apiextensions.k8s.io"
- group: "apiregistration.k8s.io"
- group: "apps"
- group: "authentication.k8s.io"
- group: "authorization.k8s.io"
- group: "autoscaling"
- group: "batch"
- group: "certificates.k8s.io"
- group: "extensions"
- group: "metrics.k8s.io"
- group: "networking.k8s.io"
- group: "policy"
- group: "rbac.authorization.k8s.io"
- group: "settings.k8s.io"
- group: "storage.k8s.io"
omitStages:
- "RequestReceived"
這項規則適用於不符合政策檔案中任何先前規則,且不處於 RequestReceived 階段的事件。具體來說,這項規則不適用於讀取要求:get、list 和 watch。而是適用於 create、update 和 delete 等寫入要求。規則指出,寫入要求應記錄在 RequestResponse 層級。
GKE 叢集的 Kubernetes 稽核政策摘要
以下清單總結了 GKE 叢集的 Kubernetes 稽核政策:
一般來說,
create、update和delete等寫入要求會記錄在RequestResponse層級。一般來說,
get、list和watch事件會記錄在Metadata層級。有些事件會被視為特殊案例。如需視為特殊案例的要求完整清單,請參閱政策指令碼。特殊案例包括:
kubelet、system:node-problem-detector或system:serviceaccount:kube-system:node-problem-detector對nodes/status資源或pods/status資源提出的更新和修補要求,都會記錄在要求層級。system:nodes群組中任何身分對nodes/status資源或pods/status資源提出的更新和修補要求,都會記錄在要求層級。system:serviceaccount:kube-system:namespace-controller的deletecollection要求會記錄在要求層級。系統會在中繼資料層級記錄
secrets資源、configmaps資源或tokenreviews資源的要求。
某些要求完全不會記錄下來。如需未記錄要求的完整清單,請參閱政策指令碼中的
level: None規則。系統不會記錄下列要求:system:kube-proxy提出的要求,用於監控endpoints資源、services資源或services/status資源。kube-system命名空間中configmaps資源上system:unsecured的 GET 要求。kubelet對nodes資源或nodes/status資源提出的 GET 要求。system:nodes群組中任何身分對nodes資源或nodes/status資源提出的 GET 要求。在
kube-system命名空間中,透過system:kube-controller-manager、system:kube-scheduler或system:serviceaccount:endpoint-controller取得及更新endpoints資源的要求。system:apiserver對namespaces資源、namespaces/status資源或namespaces/finalize資源提出的 GET 要求。取得並列出
metrics.k8s.io群組中任何資源的system:kube-controller-manager要求。對符合
/healthz*、/version或/swagger*的網址發出的要求。