使用集群的API Server審計(jì)功能實(shí)現(xiàn)集群安全運(yùn)維
審計(jì)(Auditing)產(chǎn)生于API Server內(nèi)部,用于記錄對Kubernetes API的請求以及請求結(jié)果。ACK集群提供API Server的審計(jì)日志,幫助集群管理人員排查“什么人在什么時(shí)間對什么資源做了什么操作”,可用于追溯集群操作歷史、排查集群故障等,降低集群安全運(yùn)維壓力。
使用說明
本文僅適用于ACK托管集群、ACK專有集群、ACK Serverless集群。
如果您想在注冊集群中實(shí)現(xiàn)集群API Server審計(jì)功能,請參見啟用集群API Server審計(jì)功能。
計(jì)費(fèi)說明
您可以在費(fèi)用賬單的賬單總覽頁面,查看計(jì)費(fèi)明細(xì),包含審計(jì)日志的費(fèi)用信息。具體操作,請參見查看賬單。關(guān)于審計(jì)日志的計(jì)費(fèi)方式,請參見按使用功能計(jì)費(fèi)。
步驟一:啟用集群API Server審計(jì)功能
創(chuàng)建Kubernetes集群時(shí)會(huì)默認(rèn)選中使用日志服務(wù),開啟集群API Server審計(jì)功能。若您未開通,請參見下方步驟開通。
登錄容器服務(wù)管理控制臺,在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
若您未開通集群日志或集群審計(jì)功能,請按照頁面提示手動(dòng)選擇SLS Project并開啟功能。
請確保您賬號下日志服務(wù)資源沒有超出配額,否則會(huì)導(dǎo)致集群審計(jì)功能開啟失敗。
可創(chuàng)建的日志Project數(shù)量配額。
單個(gè)日志Project內(nèi)可創(chuàng)建的日志庫數(shù)量配額。
單個(gè)日志Project內(nèi)可創(chuàng)建的儀表盤數(shù)量配額。
關(guān)于SLS配額的說明和調(diào)整方式,請參見調(diào)整資源配額。
步驟二:查看審計(jì)報(bào)表
請勿修改審計(jì)報(bào)表。如果您有自定義審計(jì)報(bào)表的需求,請?jiān)?a id="xref-0kw-f0a-7e9" class="" target="_blank">日志服務(wù)管理控制臺創(chuàng)建新的報(bào)表。
ACK集群內(nèi)置了4個(gè)審計(jì)日志報(bào)表,包括審計(jì)中心概覽、資源操作概覽、資源操作詳細(xì)列表以及Kubernetes CVE安全風(fēng)險(xiǎn)。您可以在集群審計(jì)頁面選擇審計(jì)事件的篩選維度(例如命名空間、RAM用戶等),并通過報(bào)表獲取以下內(nèi)容。
您也可以在獲取結(jié)果后,單擊目標(biāo)區(qū)域右上角的圖標(biāo),進(jìn)行更多操作,例如查看指定區(qū)域全屏圖、預(yù)覽置頂區(qū)域?qū)?yīng)的查詢語句等。
審計(jì)中心概覽
審計(jì)中心概覽展示ACK集群中的事件整體概覽以及重要事件(例如RAM用戶操作、公網(wǎng)訪問、命令執(zhí)行、刪除資源、訪問保密字典、Kubernetes CVE安全風(fēng)險(xiǎn)等)的詳細(xì)信息。
資源操作概覽
資源操作概覽展示Kubernetes集群中常見的計(jì)算資源、網(wǎng)絡(luò)資源以及存儲(chǔ)資源的操作統(tǒng)計(jì)信息。操作包括創(chuàng)建、更新、刪除、訪問。其中:
計(jì)算資源:Deployment、StatefulSet、CronJob、DaemonSet、Job、Pod。
網(wǎng)絡(luò)資源:Service、Ingress。
存儲(chǔ)資源:ConfigMap、Secret、PersistentVolumeClaim。
訪問控制資源:Role、ClusterRole、RoleBinding、ClusterRoleBinding
資源操作詳細(xì)列表
該報(bào)表用于展示Kubernetes集群中某類資源的詳細(xì)操作列表。您需要選擇或輸入指定的資源類型進(jìn)行實(shí)時(shí)查詢。該報(bào)表會(huì)顯示:資源操作各類事件的總數(shù)、Namespace分布、成功率、時(shí)序趨勢以及詳細(xì)操作列表等。
若您需要查看Kubernetes中注冊的CRD(CustomResourceDefinition)資源或列表中沒有列舉的其他資源,可以手動(dòng)輸入資源名的復(fù)數(shù)形式。例如CRD資源為AliyunLogConfig,則輸入AliyunLogConfigs
。
Kubernetes CVE安全風(fēng)險(xiǎn)
該報(bào)表用于展示當(dāng)前集群中可能包含的Kubernetes CVE安全風(fēng)險(xiǎn),您可以選擇或輸入子賬號ID(即RAM用戶賬號)進(jìn)行實(shí)時(shí)查詢。該報(bào)表會(huì)顯示當(dāng)前賬號下的Kubernetes CVE安全風(fēng)險(xiǎn)。關(guān)于CVE詳情和解決方案,請參見【CVE安全】漏洞修復(fù)公告。
(可選)步驟三:查看詳細(xì)日志記錄
如果您有自定義查詢、分析審計(jì)日志的需求,可以進(jìn)入日志服務(wù)管理控制臺查看詳細(xì)的日志記錄。
ACK托管集群集群的API Server審計(jì)日志在日志服務(wù)中對應(yīng)的日志庫數(shù)據(jù)默認(rèn)保存時(shí)間為30天,ACK專有集群對應(yīng)的默認(rèn)保存時(shí)間為365天。如需修改日志的默認(rèn)保存時(shí)間,請參見管理Logstore。
登錄容器服務(wù)管理控制臺,在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇集群信息。
單擊基本信息頁簽,單擊日志服務(wù) Project對應(yīng)的Project ID,然后在Project列表區(qū)域,單擊名為audit-${clustered}的日志庫(Logstore)。
在集群創(chuàng)建過程中,指定的日志Project中會(huì)自動(dòng)添加一個(gè)名為
audit-${clustereid}
的日志庫。重要審計(jì)日志的Logstore默認(rèn)已經(jīng)配置好索引。請勿修改索引,以免報(bào)表失效。
在輸入框中輸入查詢和分析語句,并配置查詢分析的時(shí)間范圍,例如最近15分鐘,然后單擊查詢/分析,查看查詢分析結(jié)果。
常見的審計(jì)日志搜索方式如下:
查詢某一RAM用戶的操作記錄:輸入RAM用戶ID,單擊查詢/分析。
查詢某一資源的操作:輸入集群計(jì)算、網(wǎng)絡(luò)、存儲(chǔ)、訪問控制資源的名稱,單擊查詢/分析。
過濾掉系統(tǒng)組件的操作,輸入
NOT user.username: node NOT user.username: serviceaccount NOT user.username: apiserver NOT user.username: kube-scheduler NOT user.username: kube-controller-manager
,然后單擊查詢/分析。
更多查詢、統(tǒng)計(jì)方式,請參見日志服務(wù)查詢分析方法。
(可選)步驟四:配置告警
若您需要對某些資源的操作進(jìn)行實(shí)時(shí)告警,可以通過日志服務(wù)的告警功能實(shí)現(xiàn)。告警方式支持短信、釘釘機(jī)器人、郵件、自定義Webhook和通知中心。更多信息,請參見快速設(shè)置日志告警。
示例1:對容器執(zhí)行命令時(shí)告警
某公司對于Kubernetes集群使用有嚴(yán)格限制,不允許用戶登錄容器或?qū)θ萜鲌?zhí)行命令。如果有用戶執(zhí)行命令時(shí),告警需要立即被發(fā)送,并在告警信息中包含用戶登錄的具體容器、執(zhí)行的命令、操作人、事件ID、時(shí)間、操作源IP等信息。
查詢語句為:
verb : create and objectRef.subresource:exec and stage: ResponseStarted | SELECT auditID as "事件ID", date_format(from_unixtime(__time__), '%Y-%m-%d %T' ) as "操作時(shí)間", regexp_extract("requestURI", '([^\?]*)/exec\?.*', 1)as "資源", regexp_extract("requestURI", '\?(.*)', 1)as "命令" ,"responseStatus.code" as "狀態(tài)碼", 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 "操作時(shí)間" desc limit 10000
條件表達(dá)式為:
操作事件 =~ ".*"
。
示例2:API Server公網(wǎng)訪問失敗告警
某集群開啟了公網(wǎng)訪問,為防止惡意攻擊,需要監(jiān)控公網(wǎng)訪問的次數(shù)以及失敗率。當(dāng)訪問次數(shù)達(dá)到一定閾值(10次)且失敗率高于一定閾值(50%)時(shí),告警需要立即被發(fā)送,并在告警信息中包含用戶的IP所屬區(qū)域、操作源IP、是否高危IP等信息。
查詢語句為:
* | select ip as "源地址", total as "訪問次數(shù)", round(rate * 100, 2) as "失敗率%", failCount as "非法訪問次數(shù)", 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 "運(yùn)營商" 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 "訪問次數(shù)" desc limit 10000
條件表達(dá)式為:
源地址 =~ ".*"
。
相關(guān)操作
更換日志Project
如果您想將集群API Server審計(jì)日志數(shù)據(jù)遷移至另一個(gè)日志Project中,您可以使用集群審計(jì)中的更換日志Project功能。
登錄容器服務(wù)管理控制臺,在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在集群審計(jì)頁面右上角,單擊更換日志Project,將集群審計(jì)日志的數(shù)據(jù)遷移至另一個(gè)SLS Project中。
關(guān)閉集群API Server審計(jì)功能
如果您不再需要集群API Server的審計(jì)功能,可以通過以下方法關(guān)閉審計(jì)功能。
登錄容器服務(wù)管理控制臺,在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在集群審計(jì)頁面右上角,單擊關(guān)閉集群審計(jì),關(guān)閉當(dāng)前集群的審計(jì)功能。
在ACK專有集群中使用第三方日志解決方案
ACK推薦您使用阿里云日志服務(wù)SLS記錄集群審計(jì)日志。但如果您需要使用第三方日志服務(wù),您可以在部署集群時(shí)不使用阿里云SLS,根據(jù)需要對接其他的日志解決方案,完成相關(guān)審計(jì)日志的采集和檢索。集群Master各節(jié)點(diǎn)的審計(jì)日志的源文件(文件為標(biāo)準(zhǔn)的JSON格式)可在/var/log/kubernetes/kubernetes.audit
路徑下獲取。
參考信息:ACK專有集群API Server審計(jì)配置介紹
創(chuàng)建ACK專有集群集群配置集群組件時(shí),控制臺會(huì)默認(rèn)選中使用日志服務(wù),開啟API Server審計(jì)功能,按審計(jì)策略采集事件數(shù)據(jù),并將事件數(shù)據(jù)寫入到后端。
審計(jì)策略
審計(jì)策略定義了審計(jì)功能的配置和請求的采集規(guī)則。不同審計(jì)級別(Audit Level)的事件日志采集規(guī)則不同。Audit Level包括以下幾種。
Audit Level | 日志采集規(guī)則 |
None | 符合規(guī)則的事件不予采集。 |
Metadata | 采集請求的Metadata,例如用戶信息、時(shí)間戳等,但不采集請求體或返回體。 |
Request | 采集請求的Metadata和請求體,但不采集返回體。不適用于非資源請求(Non-Resource Request)。 |
RequestResponse | 采集請求的Metadata、請求體和返回體。不適用于非資源請求(Non-Resource Request)。 |
您可以使用--audit-policy-file
命令行標(biāo)志(flag)將以下YAML示例文件保存為API Server的啟動(dòng)參數(shù)。登錄Master節(jié)點(diǎn)后,您可以查看審計(jì)配置策略文件的目錄,即/etc/kubernetes/audit-policy.yml
。一個(gè)審計(jì)日志配置策略文件的YAML示例如下。
在收到請求后,日志不立即開始記錄,等待返回體Header發(fā)送后才開始記錄。
對于大量冗余的kube-proxy watch請求、kubelet和system:nodes
對節(jié)點(diǎn)的Get請求、kube組件在kube-system下對于endpoint的操作、以及API Server對Namespaces的Get請求等,系統(tǒng)不進(jìn)行審計(jì)。
對于authentication
、rbac
、certificates
、autoscaling
、storage
等敏感接口,系統(tǒng)根據(jù)讀寫記錄相應(yīng)的請求體和返回體。
審計(jì)后端
審計(jì)事件采集后,會(huì)被存儲(chǔ)到Log后端日志文件系統(tǒng),日志文件為標(biāo)準(zhǔn)的JSON格式。您可以配置并使用如下flag作為API Server的啟動(dòng)參數(shù)。
登錄到Master節(jié)點(diǎn)后,可通過/etc/kubernetes/manifests/kube-apiserver.yaml
查看API Server的配置文件。
配置參數(shù) | 說明 |
| 指定審計(jì)日志可分片存儲(chǔ)的最大文件數(shù)量,為10個(gè)。 |
| 指定單個(gè)審計(jì)日志的最大內(nèi)存容量,為100 MB。 |
| 指定審計(jì)日志的輸出路徑,為 |
| 指定審計(jì)日志最長的保存周期,為7天。 |
| 配置審計(jì)日志策略的文件路徑,為 |
相關(guān)文檔
如您想使用容器內(nèi)部的操作審計(jì)功能,即通過
kubectl exec
進(jìn)入到容器內(nèi)部執(zhí)行的命令的審計(jì),請參見使用容器內(nèi)部操作審計(jì)功能。關(guān)于為企業(yè)安全管理運(yùn)維人員提供使用集群的安全最佳實(shí)踐,請參見安全最佳實(shí)踐。