1. 程式人生 > >Kubernetes 的審計日誌和採集_Kubernetes中文社群

Kubernetes 的審計日誌和採集_Kubernetes中文社群

基礎操作

一個正常執行的 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 服務中。