基礎操作
一個正常運作的 Kubernetes 叢集,除了利用通路控制對叢集操作的許可進行限制之外,對于操作過程的跟蹤審計也是比不可少的,圍繞不同的實體,例如使用者、節點以及各種工作負載進行觀測是很有必要的。Kubernetes 的 API Server 提供了審計日志支援,利用審計日志的方式對系統内的操作進行記錄,這裡我們可以沿用推薦的 Elastic Search + Fluentd 對審計
日志進行采集存儲,最終使用 Kibana 或者其他支援 ES 查詢的工具對關鍵資源或使用者進行通路跟蹤。
首先要啟用 API Server 的審計功能。Kubernetes 提供了四個基礎參數來定義審計功能:
- audit-log-path 啟用審計日志,并将日志内容寫入指定檔案,“-” 代表 stdout。
- audit-log-maxage 日志檔案的最大儲存天數,根據檔案名中的日期進行确定。
- audit-log-maxbackup 最多儲存日志檔案的數量。
- audit-log-maxsize 最大檔案尺寸,超過尺寸會被翻轉。機關是 MB,預設為 100MB。
例如:
--audit-log-path=/var/log/kubernetes/kubernetes.audit \
--audit-log-maxage=7 \
--audit-log-maxbackup=4 \
--audit-log-maxsize=10
在 Kubernetes API Server 的啟動參數中加入這些開關之後,重新啟動服務。
這時我們就可以看到檔案/var/log/kubernetes/kubernetes.audit已經生成。利用 tail 指令看看他的結構和内容,例如請求内容是這樣的:
2017-08-30T16:28:35.485818099+08:00 AUDIT: id="ebc47b7b-c4fe-4a9a-861c-d9686903cec4" ip="127.0.0.1" method="GET" user="system:apiserver" groups="\"system:masters\"" as="<self>" asgroups="<lookup>" namespace="<none>" uri="/apis/admissionregistration.k8s.io/v1alpha1/initializerconfigurations"
而響應内容格式如下:
2017-08-30T16:28:35.486131325+08:00 AUDIT: id="ebc47b7b-c4fe-4a9a-861c-d9686903cec4" response="404"
我們本文中暫時隻對請求内容進行進一步解析,響應内容可以通過加入第二格式的方式進行采集。内容中的id字段,可以看作是會話 id,用于連接配接請求和響應。
根據上述文本内容,可以開始 Fluentd 檔案的編寫。請求和響應的内容都很規則,簡單的正規表達式即可完成解析,例如我寫的是這樣的:
<source>
type tail
format /^(?<time>\d.*?)\s+(?<action>\w+).\s+id=\"(?<id>.*?)\"\s+ip=\"(?<ip>.*?)\"\s+method=\"(?<method>.*?)\"\s+user=\"(?<user>.*?)\"\s+groups=(?<groups>.*?)\s+as=\"(?<as>.*?)\"\s+asgroups=\"(?<asgroups>.*?)\"\s+namespace=\"(?<namespace>.*?)\"\s+uri=\"(?<uri>.*?)\"$/
path /var/log/kubernetes/kubernetes.audit
pos_file /var/log/audit.pos
time_format %Y-%m-%dT%H:%M:%S.%N%z
tag audit.response
</source>
将這一部分内容加入到 Fluentd 配置之中去,啟動抓取。日志入庫之後,我們就可以對指定使用者或者資源進行查詢,獲知他的黑曆史了,例如我們要查找使用者admin的操作曆史:
{ "query": { "match": { "user": { "query": "admin", "type": "phrase" } } } }
在 Kibana 中執行查詢,會看到類似内容(如果所在叢集沒有該使用者,可以替換為 system:apiserver等内置使用者進行測試):
利用解析出的各個字段,可以比較清楚的看到什麼人,在什麼時間,對什麼對象進行了什麼操作。

進階審計
在 Kubernetes 1.7 中新增了 Advanced audit 特性(Alpha),可以對審計内容、以及後續處理進行定義。
- 首先加入了審計政策的支援,可以使用行為,動作等條件進行限制,過濾掉無需考慮的審計内容。
- 存儲後端在日志之外,還增加了 Web Hook 的支援,可以直接将審計内容釋出到指定的 Web 服務中。
本文轉自中文社群-
Kubernetes 的審計日志和采集