持續(xù)監(jiān)控集群中的鏡像漏洞

在使用 Shell-Operator,讓 Pod 繼承節(jié)點(diǎn)標(biāo)簽[1]一文中,展示了使用 Shell Operator 在創(chuàng)建工作負(fù)載時(shí)從對(duì)應(yīng)節(jié)點(diǎn)拷貝指定標(biāo)簽的方法。Shell Operator 還有個(gè)功能就是生成 Prometheus Metrics,本文就是從這個(gè)角度出發(fā),用 Shell Operator 定時(shí)調(diào)用 Trivy 掃描指定命名空間下的所有在用鏡像,并輸出指標(biāo)給 Prometheus,最終可以進(jìn)行展示和告警。
Shell Operator 除了上次提到的根據(jù) Kubernetes 事件進(jìn)行觸發(fā)之外,還包含了在啟動(dòng)時(shí)和定期運(yùn)行兩種觸發(fā)方式,這里我們用定時(shí)觸發(fā)的方式:
configVersion: v1
schedule:
- name: "scan images each 5 min"
crontab: "*/5 * * * *"
allowFailure: true
這里我定義了一個(gè) 5 分鐘觸發(fā)一次的任務(wù)。鏡像接受一個(gè)缺省為 NS_LABEL="trivy=true" 的標(biāo)簽,每次觸發(fā)時(shí),會(huì)根據(jù)這個(gè)標(biāo)簽選擇命名空間,獲取選定命名空間中運(yùn)行的鏡像,并調(diào)用 trivy i -f json [image] 輸出結(jié)果,將結(jié)果轉(zhuǎn)換為 Prometheus 指標(biāo)進(jìn)行輸出。
FROM flant/shell-operator:v1.0.0-rc.2
ENV TRIVY_CACHE_DIR=/data/trivy \
TRIVY_QUIET=true \
GITHUB_TOKEN="" \
NS_LABEL="trivy=true"
RUN apk --no-cache add python3=3.8.8-r0
COPY trivy-scanner.py /hooks
COPY trivy /usr/local/bin
VOLUME [ "/data/trivy", "/data/cache" ]
上文中的幾個(gè)環(huán)境變量:
TRIVY_CACHE_DIR:指定 Trivy 緩存目錄,可以在 Kubernetes 中把 Trivy 工作目錄持久化。 TRIVY_QUIET:Trivy 環(huán)境變量,指定 Trivy 用靜默方式運(yùn)行。 GITHUB_TOKEN:Trivy 會(huì)使用該 Token 更新漏洞庫(kù),防止觸發(fā) Rate Limit。 NS_LABLE:僅對(duì)符合標(biāo)簽的命名空間進(jìn)行掃描。
在腳本中執(zhí)行的任務(wù)還是很簡(jiǎn)單的三部曲:
kubectl get ns kubectl get po trivy
可以看到這里需要列表查看 Namespace 和 Pod 對(duì)象,因此我們的 RBAC 需要進(jìn)行相應(yīng)的配置,例如設(shè)置 ClusterRole:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: trivy-scanner
rules:
- resources:
- pods
- namespaces
verbs:
- get
- watch
- list
實(shí)際上也可以通過(guò)之前用到的 Kubernetes 事件進(jìn)行觸發(fā)。因此這里還保留了 watch 事件。
Deployment 需要注意一點(diǎn)是,Shell Operator 使用 9115 端口的 /metrics 開(kāi)放指標(biāo)數(shù)據(jù)供 Prometheus 抓取,因此需要使用 annotations 對(duì)此進(jìn)行標(biāo)注。
使用 Trivy 獲取到 JSON 格式出具的掃描結(jié)果之后,就可以利用 Shell Operator 的指標(biāo)輸出能力,把數(shù)據(jù)整理為如下格式:
{"name":"so_vulnerabilities","set":0,"labels":{"image":"dustise/sleep:v0.9.6","severity":"UNKNOWN"}}
{"name":"so_vulnerabilities","set":1,"labels":{"image":"dustise/sleep:v0.9.6","severity":"HIGH"}}
每行一條記錄,輸出到 $METRICS_PATH 環(huán)境變量指定的文本文件中,Shell Operator 會(huì)把它轉(zhuǎn)換為 Prometheus 指標(biāo):
so_vulnerabilities{hook="trivy-scanner.py",image="dustise/sleep:v0.9.6",severity="CRITICAL"} 1
so_vulnerabilities{hook="trivy-scanner.py",image="dustise/sleep:v0.9.6",severity="HIGH"} 11
so_vulnerabilities{hook="trivy-scanner.py",image="dustise/sleep:v0.9.6",severity="LOW"} 2
so_vulnerabilities{hook="trivy-scanner.py",image="dustise/sleep:v0.9.6",severity="MEDIUM"} 9
so_vulnerabilities{hook="trivy-scanner.py",image="dustise/sleep:v0.9.6",severity="UNKNOWN"} 0
接下來(lái)就可以在 Prometheus 中檢查輸出內(nèi)容,出具監(jiān)控圖表或者制定告警規(guī)則了。例如:

腳注
使用 Shell-Operator,讓 Pod 繼承節(jié)點(diǎn)標(biāo)簽: http://mp.weixin.qq.com/s?__biz=MzIxMDY5ODM1OA==&mid=2247485288&idx=1&sn=aea39927fea18efefe5b992ec3873fce&chksm=9761ee71a01667672d918f7a62be0d27e980185f72d66141588b2d937bcee85b26c2850ec6cb&scene=21#wechat_redirect


你可能還喜歡
點(diǎn)擊下方圖片即可閱讀

云原生是一種信仰 ??
關(guān)注公眾號(hào)
后臺(tái)回復(fù)?k8s?獲取史上最方便快捷的 Kubernetes 高可用部署工具,只需一條命令,連 ssh 都不需要!


點(diǎn)擊 "閱讀原文" 獲取更好的閱讀體驗(yàn)!
發(fā)現(xiàn)朋友圈變“安靜”了嗎?


