審計(Auditing)產生于API Server內部,用于記錄對Kubernetes API的請求以及請求結果。ACS集群提供API Server的審計日志,幫助集群管理人員排查“什么人在什么時間對什么資源做了什么操作”,可用于追溯集群操作歷史、排查集群故障等,降低集群安全運維壓力。
步驟一:啟用集群API Server審計功能
創建Kubernetes集群時會默認選中使用日志服務,開啟集群API Server審計功能。若您未開通,請參見下方步驟開通。
登錄容器計算服務控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇安全管理 > 集群審計。
若您未開通集群日志或集群審計功能,請按照頁面提示手動選擇SLS Project并開啟功能。
請確保您賬號下日志服務資源沒有超出配額,否則會導致集群審計功能開啟失敗。
可創建的日志Project數量配額。
單個日志Project內可創建的日志庫數量配額。
單個日志Project內可創建的儀表盤數量配額。
關于SLS配額的說明和調整方式,請參見調整資源配額。
步驟二:查看審計報表
請勿修改審計報表。如果您有自定義審計報表的需求,請在日志服務管理控制臺創建新的報表。
ACK集群內置了4個審計日志報表,包括審計中心概覽、資源操作概覽、資源操作詳細列表以及Kubernetes CVE安全風險。您可以在集群審計頁面選擇審計事件的篩選維度(例如命名空間、RAM用戶等),并通過報表獲取以下內容。
您也可以在獲取結果后,單擊目標區域右上角的圖標,進行更多操作,例如查看指定區域全屏圖、預覽置頂區域對應的查詢語句等。
審計中心概覽
審計中心概覽展示ACK集群中的事件整體概覽以及重要事件(例如RAM用戶操作、公網訪問、命令執行、刪除資源、訪問保密字典、Kubernetes CVE安全風險等)的詳細信息。
資源操作概覽
資源操作概覽展示Kubernetes集群中常見的計算資源、網絡資源以及存儲資源的操作統計信息。操作包括創建、更新、刪除、訪問。其中:
計算資源:Deployment、StatefulSet、CronJob、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安全】漏洞修復公告。
(可選)步驟三:查看詳細日志記錄
如果您有自定義查詢、分析審計日志的需求,可以進入日志服務管理控制臺查看詳細的日志記錄。
ACS集群的API Server審計日志在日志服務中對應的日志庫數據默認保存時間為30天.如需修改日志的默認保存時間,請參見管理Logstore。
登錄容器計算服務控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇集群信息。
單擊集群資源頁簽,單擊日志服務 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
,然后單擊查詢/分析。
更多查詢、統計方式,請參見日志服務查詢分析方法。
(可選)步驟四:配置告警
若您需要對某些資源的操作進行實時告警,可以通過日志服務的告警功能實現。告警方式支持短信、釘釘機器人、郵件、自定義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 '%,%' and not try(is_subnet_of('7.0.07.0.X.Xip)) ORDER by "訪問次數" desc limit 10000
條件表達式為:
源地址 =~ ".*"
。
相關操作
更換日志Project
如果您想將集群API Server審計日志數據遷移至另一個日志Project中,您可以使用集群審計中的更換日志Project功能。
登錄容器計算服務控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇安全管理 > 集群審計。
在集群審計頁面右上角,單擊更換日志Project,將集群審計日志的數據遷移至另一個SLS Project中。
關閉集群API Server審計功能
如果您不再需要集群API Server的審計功能的話,可以通過以下方法關閉審計功能。
登錄容器計算服務控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇安全管理 > 集群審計。
在集群審計頁面右上角,單擊關閉集群審計,關閉當前集群的審計功能。
在ACS集群中使用第三方日志解決方案
ACS推薦您使用阿里云日志服務SLS記錄集群審計日志。但如果您需要使用第三方日志服務,您可以在部署集群時不使用阿里云SLS,根據需要對接其他的日志解決方案,完成相關審計日志的采集和檢索。集群Master各節點的審計日志的源文件(文件為標準的JSON格式)可在/var/log/kubernetes/kubernetes.audit
路徑下獲取。
參考信息:ACS集群API Server審計配置介紹
創建ACS集群配置集群組件時,控制臺會默認選中使用日志服務,開啟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個。 |
| 指定單個審計日志的最大內存容量,為100MB。 |
| 指定審計日志的輸出路徑,為 |
| 指定審計日志的最長保存周期,為7天。 |
| 配置審計日志策略的文件路徑,為 |