審計(Auditing)產生於API Server內部,用於記錄對Kubernetes API的請求以及請求結果。ACK叢集提供API Server的審計日誌,協助叢集管理員排查“什麼人在什麼時間對什麼資源做了什麼操作”,可用於追溯叢集操作歷史、排查叢集故障等,降低叢集安全營運壓力。
使用說明
本文僅適用於ACK託管叢集、ACK專有叢集、ACK Serverless叢集。
如果您想在註冊叢集中實現叢集API Server審計功能,請參見啟用叢集API Server審計功能。
計費說明
您可以在費用賬單的賬單總覽頁面,查看計費明細,包含審計日誌的費用資訊。具體操作,請參見查看賬單。關於審計日誌的計費方式,請參見按使用功能計費。
步驟一:啟用叢集API Server審計功能
建立Kubernetes叢集時會預設選中使用Log Service,開啟叢集API Server審計功能。若您未開通,請參見下方步驟開通。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
若您未開通叢集日誌或叢集審計功能,請按照頁面提示手動選擇SLS Project並開啟功能。
請確保您帳號下Log Service資源沒有超出配額,否則會導致叢集審計功能開啟失敗。
可建立的日誌Project數量配額。
單個日誌Project內可建立的日誌庫數量配額。
單個日誌Project內可建立的儀錶盤數量配額。
關於SLS配額的說明和調整方式,請參見調整資源配額。
步驟二:查看審計報表
請勿修改審計報表。如果您有自訂審計報表的需求,請在Log Service管理主控台建立新的報表。
ACK叢集內建了4個審計日誌報表,包括審計中心概覽、資源操作概覽、資源操作詳細列表以及Kubernetes CVE安全風險。您可以在叢集審計頁面選擇審計事件的篩選維度(例如命名空間、RAM使用者等),並通過報表擷取以下內容。
您也可以在擷取結果後,單擊目的地區域右上方的表徵圖,進行更多操作,例如查看指定地區全屏圖、預覽置頂地區對應的查詢語句等。
審計中心概覽
審計中心概覽展示ACK叢集中的事件整體概覽以及重要事件(例如RAM使用者操作、公網訪問、命令執行、刪除資源、訪問保密字典、Kubernetes CVE安全風險等)的詳細資料。
資源操作概覽
資源操作概覽展示Kubernetes叢集中常見的計算資源、網路資源以及儲存資源的操作統計資訊。操作包括建立、更新、刪除、訪問。其中:
計算資源:Deployment、StatefulSet、CronJob、DaemonSet、Job、Pod。
網路資源:Service、Ingress。
儲存資源:ConfigMap、Secret、PersistentVolumeClaim。
存取控制資源:Role、ClusterRole、RoleBinding、ClusterRoleBinding
資源操作詳細列表
該報表用於展示Kubernetes叢集中某類資源的詳細巨集指令清單。您需要選擇或輸入指定的資源類型進行即時查詢。該報表會顯示:資源操作各類事件的總數、Namespace分布、成功率、時序趨勢以及詳細巨集指令清單等。
若您需要查看Kubernetes中註冊的CRD(CustomResourceDefinition)資源或列表中沒有列舉的其他資源,可以手動輸入資源名的複數形式。例如CRD資源為AliyunLogConfig,則輸入AliyunLogConfigs
。
Kubernetes CVE安全風險
該報表用於展示當前叢集中可能包含的Kubernetes CVE安全風險,您可以選擇或輸入子帳號ID(即RAM使用者帳號)進行即時查詢。該報表會顯示當前帳號下的Kubernetes CVE安全風險。關於CVE詳情和解決方案,請參見【CVE安全】漏洞修複公告。
(可選)步驟三:查看詳細日誌記錄
如果您有自訂查詢、分析審計日誌的需求,可以進入Log Service管理主控台查看詳細的日誌記錄。
ACK託管叢集叢集的API Server審計日誌在Log Service中對應的日誌庫資料預設儲存時間為30天,ACK專有叢集對應的預設儲存時間為365天。如需修改日誌的預設儲存時間,請參見管理Logstore。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇叢集資訊。
單擊基本資料頁簽,單擊Log Service Project對應的Project ID,然後在Project列表地區,單擊名為audit-${clustered}的日誌庫(Logstore)。
在叢集建立過程中,指定的日誌Project中會自動添加一個名為
audit-${clustereid}
的日誌庫。重要審計日誌的Logstore預設已經配置好索引。請勿修改索引,以免報表失效。
在輸入框中輸入查詢和分析語句,並配置查詢分析的時間範圍,例如最近15分鐘,然後單擊查詢/分析,查看查詢分析結果。
常見的審計記錄搜尋方式如下:
查詢某一RAM使用者的操作記錄:輸入RAM使用者ID,單擊查詢/分析。
查詢某一資源的操作:輸入集群計算、網路、儲存、存取控制資源的名稱,單擊查詢/分析。
過濾掉系統組件的操作,輸入
NOT user.username: node NOT user.username: serviceaccount NOT user.username: apiserver NOT user.username: kube-scheduler NOT user.username: kube-controller-manager
,然後單擊查詢/分析。
更多查詢、統計方式,請參見Log Service查詢分析方法。
(可選)步驟四:配置警示
若您需要對某些資源的操作進行即時警示,可以通過Log Service的警示功能實現。警示方式支援DingTalk機器人、自訂Webhook和通知中樞。更多資訊,請參見快速設定日誌警示。
樣本1:對容器執行命令時警示
某公司對於Kubernetes叢集使用有嚴格限制,不允許使用者登入容器或對容器執行命令。如果有使用者執行命令時,警示需要立即被發送,並在警示資訊中包含使用者登入的具體容器、執行的命令、操作人、事件ID、時間、操作源IP等資訊。
查詢語句為:
verb : create and objectRef.subresource:exec and stage: ResponseStarted | SELECT auditID as "事件ID", date_format(from_unixtime(__time__), '%Y-%m-%d %T' ) as "操作時間", regexp_extract("requestURI", '([^\?]*)/exec\?.*', 1)as "資源", regexp_extract("requestURI", '\?(.*)', 1)as "命令" ,"responseStatus.code" as "狀態代碼", CASE WHEN "user.username" != 'kubernetes-admin' then "user.username" WHEN "user.username" = 'kubernetes-admin' and regexp_like("annotations.authorization.k8s.io/reason", 'RoleBinding') then regexp_extract("annotations.authorization.k8s.io/reason", ' to User "(\w+)"', 1) ELSE 'kubernetes-admin' END as "操作帳號", CASE WHEN json_array_length(sourceIPs) = 1 then json_format(json_array_get(sourceIPs, 0)) ELSE sourceIPs END as "源地址" order by "操作時間" desc limit 10000
條件運算式為:
操作事件 =~ ".*"
。
樣本2:API Server公網訪問失敗警示
某叢集開啟了公網訪問,為防止惡意攻擊,需要監控公網訪問的次數以及失敗率。當訪問次數達到一定閾值(10次)且失敗率高於一定閾值(50%)時,警示需要立即被發送,並在警示資訊中包含使用者的IP所屬地區、操作源IP、是否高危IP等資訊。
查詢語句為:
* | select ip as "源地址", total as "訪問次數", round(rate * 100, 2) as "失敗率%", failCount as "非法訪問次數", CASE when security_check_ip(ip) = 1 then 'yes' else 'no' end as "是否高危IP", ip_to_country(ip) as "國家", ip_to_province(ip) as "省", ip_to_city(ip) as "市", ip_to_provider(ip) as "電訊廠商" from (select CASE WHEN json_array_length(sourceIPs) = 1 then json_format(json_array_get(sourceIPs, 0)) ELSE sourceIPs END as ip, count(1) as total, sum(CASE WHEN "responseStatus.code" < 400 then 0 ELSE 1 END) * 1.0 / count(1) as rate, count_if("responseStatus.code" = 403) as failCount from log group by ip limit 10000) where ip_to_domain(ip) != 'intranet' and ip not LIKE '%,%' ORDER by "訪問次數" desc limit 10000
條件運算式為:
源地址 =~ ".*"
。
相關操作
更換日誌Project
如果您想將叢集API Server審計日誌資料移轉至另一個日誌Project中,您可以使用叢集審計中的更換日誌Project功能。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在叢集審計頁面右上方,單擊更換日誌Project,將叢集審計日誌的資料移轉至另一個SLS Project中。
關閉叢集API Server審計功能
如果您不再需要叢集API Server的審計功能,可以通過以下方法關閉審計功能。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在叢集審計頁面右上方,單擊關閉叢集審計,關閉當前叢集的審計功能。
在ACK專有叢集中使用第三方日誌解決方案
ACK推薦您使用阿里雲Log ServiceSLS記錄集群審計日誌。但如果您需要使用第三方Log Service,您可以在部署叢集時不使用阿里雲SLS,根據需要對接其他的日誌解決方案,完成相關審計日誌的採集和檢索。叢集Master各節點的審計日誌的源檔案(檔案為標準的JSON格式)可在/var/log/kubernetes/kubernetes.audit
路徑下擷取。
參考資訊:ACK專有叢集API Server審計配置介紹
建立ACK專有叢集叢集配置叢集組件時,控制台會預設選中使用Log Service,開啟API Server審計功能,按審計策略採集事件數目據,並將事件數目據寫入到後端。
審計策略
審計策略定義了審計功能的配置和請求的採集規則。不同審計層級(Audit Level)的事件記錄採集規則不同。Audit Level包括以下幾種。
Audit Level | 日誌採集規則 |
None | 符合規則的事件不予採集。 |
Metadata | 採集請求的Metadata,例如使用者資訊、時間戳記等,但不採集請求體或返回體。 |
Request | 採集請求的Metadata和請求體,但不採集返回體。不適用於非資源請求(Non-Resource Request)。 |
RequestResponse | 採集請求的Metadata、請求體和返回體。不適用於非資源請求(Non-Resource Request)。 |
您可以使用--audit-policy-file
命令列標誌(flag)將以下YAML樣本檔案儲存為API Server的啟動參數。登入Master節點後,您可以查看審計配置策略檔案的目錄,即/etc/kubernetes/audit-policy.yml
。一個審計日誌配置策略檔案的YAML樣本如下。
在收到請求後,日誌不立即開始記錄,等待返回體Header發送後才開始記錄。
對於大量冗餘的kube-proxy watch請求、kubelet和system:nodes
對節點的Get請求、kube組件在kube-system下對於endpoint的操作、以及API Server對Namespaces的Get請求等,系統不進行審計。
對於authentication
、rbac
、certificates
、autoscaling
、storage
等敏感介面,系統根據讀寫記錄相應的請求體和返回體。
審計後端
審計事件採集後,會被儲存到Log後端記錄檔系統,記錄檔為標準的JSON格式。您可以配置並使用如下flag作為API Server的啟動參數。
登入到Master節點後,可通過/etc/kubernetes/manifests/kube-apiserver.yaml
查看API Server的設定檔。
配置參數 | 說明 |
| 指定審計日誌可分區儲存的最大檔案數量,為10個。 |
| 指定單個審計日誌的最大記憶體容量,為100 MB。 |
| 指定審計日誌的輸出路徑,為 |
| 指定審計日誌最長的儲存周期,為7天。 |
| 配置審計日誌策略的檔案路徑,為 |
相關文檔
如您想使用容器內部的Action Trail功能,即通過
kubectl exec
進入到容器內部執行的命令的審計,請參見使用容器內部Action Trail功能。關於為企業安全管理營運人員提供使用叢集的安全最佳實務,請參見安全最佳實務。