十個優(yōu)秀開源Docker&Kubernetes安全掃描工具,提升容器安全性!
Kubernetes(k8s)是一種目前流行的開源容器編排系統(tǒng),可以自動部署、擴(kuò)展和管理容器化工作負(fù)載。Kubernetes提供了容器自修復(fù)、自動擴(kuò)展和服務(wù)發(fā)現(xiàn)的功能,但是,也存在一些固有的安全風(fēng)險。Docker 是一個容器平臺,用于構(gòu)建、部署和管理應(yīng)用程序。Docker容器的輕量、可移植和可擴(kuò)展特性為應(yīng)用程序的開發(fā)和交付帶來了巨大的便利,特別是在微服務(wù)架構(gòu)應(yīng)用上,是許多開發(fā)者和組織的首選。然而,隨著容器化的廣泛應(yīng)用,Docker也面臨著日益復(fù)雜和嚴(yán)峻的容器安全挑戰(zhàn)。
本文主要介紹k8s和Docker所面對的安全性問題,并推薦幾款開源免費(fèi)容器安全工具。
Kubernetes的安全性問題
(1)集群安全
集群安全包括通過啟用認(rèn)證、授權(quán)和加密來保護(hù)控制組件,如API服務(wù)器、etcd和Kubernetes控制器管理程序(Kubernetes controller manager)等。
(2)節(jié)點(diǎn)安全
節(jié)點(diǎn)安全主要是指正確配置網(wǎng)絡(luò)和保護(hù)Kubernetes運(yùn)行時環(huán)境,包括刪除不必要的用戶帳戶、確保應(yīng)用訪問的合規(guī)性。
(3)應(yīng)用程序安全
應(yīng)用程序安全意味著要對pod進(jìn)行保護(hù),在Kubernetes中,pod是用于運(yùn)行應(yīng)用程序的容器。保護(hù)這些應(yīng)用程序的前提是保護(hù)pod。Kubernetes提供了多個安全特性來幫助保護(hù)應(yīng)用程序。這些特性可用于限制資源訪問、實施網(wǎng)絡(luò)策略,并支持容器之間的安全通信。
Docker容器的安全問題
(1)鏡像污染
目前Docker Hub上面有著數(shù)量眾多的第三方上傳鏡像,這些鏡像質(zhì)量參差不齊。在這其中,不排除有黑客故意上傳包含了惡意程序的鏡像,并偽裝成業(yè)務(wù)鏡像供用戶下載使用。當(dāng)用戶誤用此類鏡像啟動容器時,無疑會導(dǎo)致容器被入侵。因此,用戶必須對這些鏡像進(jìn)行掃描甄別,以保證容器所使用的鏡像是可受信任的,盡可能不使用非信任的第三方鏡像。
(2)網(wǎng)絡(luò)攻擊
Docker默認(rèn)使用bridge網(wǎng)絡(luò),該網(wǎng)絡(luò)會創(chuàng)建一個虛擬網(wǎng)橋,連接在同一個網(wǎng)橋之間的容器可以互相訪問。當(dāng)某個容器被入侵時,黑客有可能順著網(wǎng)絡(luò)訪問到宿主機(jī)中的其他容器。同時 ,攻擊者也可以通過DDos等方式,攻擊容器的服務(wù)來耗盡主機(jī)的資源,從而引起整個宿主機(jī)的崩潰。
(3)內(nèi)核攻擊
當(dāng)黑客獲取到容器權(quán)限時,由于共享內(nèi)核的緣故,理論上可通過對內(nèi)核的攻擊來達(dá)到控制或影響主機(jī)的地步 。
(4)操作不當(dāng)
有些操作不當(dāng)容易使容器出現(xiàn)漏洞,例如:
- 在啟動容器時將主機(jī)的根目錄映射到容器中;
- 在啟用容器時使用特權(quán)模式——privileged,此時Docker容器允許可以訪問主機(jī)上的所有設(shè)備,并可以獲取大量設(shè)備文件的訪問權(quán)限。
(5)針對Docker Daemon的攻擊
Docker使用的是C/S架構(gòu),作為服務(wù)端的Docker Daemon會接收客戶端通過CLI或者REST API發(fā)送的命令,并執(zhí)行對容器的相應(yīng)操作。但請求不一定都是由可信任的用戶發(fā)起的,攻擊者可能通過偽造請求的方式,來達(dá)到欺騙Daemon端執(zhí)行危險的操作。
(6)Docker漏洞攻擊
Docker本身屬于應(yīng)用程序,不可避免地會有出現(xiàn)代碼的漏洞,這可能導(dǎo)致程序受到攻擊。
綜上所述,要確保容器安全,涉及設(shè)備、系統(tǒng)、網(wǎng)絡(luò)、鏡像、應(yīng)用、操作等各個層次。其中,容器本身的安全往往容易容易被忽略,下面內(nèi)容主要推薦一些對保護(hù)Kubernetes集群和Docker容器有用的開源工具,有助于Docker 鏡像的靜態(tài)掃描、安全審計、加固 Kubernetes 集群和實現(xiàn)運(yùn)行時安全性。
1.Trivy
https://github.com/aquasecurity/trivy
Trivy是一個全面且多功能的安全掃軟件。Trivy包含擁有查找安全問題的掃描器,并將目標(biāo)定位在可以找到這些問題的地方??捎糜诓檎胰萜鳌ubernetes、代碼存儲庫、云等當(dāng)中存在的漏洞、錯誤配置、密碼泄露、SBOM等問題。Trivy支持大多數(shù)流行的編程語言,支持跨平臺操作系統(tǒng)。
Trivy支持掃描的對象包括:
- 容器鏡像
- 文件系統(tǒng)
- Git倉庫(遠(yuǎn)程)
- 虛擬機(jī)鏡像
- Kubernetes
- AWS
Trivy能夠發(fā)現(xiàn)的問題包括:
- 使用中的操作系統(tǒng)包和軟件依賴關(guān)系(SBOM)
- 已知漏洞(CVEs)
- IaC問題和錯誤配置
- 敏感信息和秘密
- 軟件許可信息
在執(zhí)行Trivy掃描之后,將得到一個漏洞列表,包括漏洞的嚴(yán)重性和CVE編號。
實際的安裝和使用如下:
(1)安裝
使用Homebrew for MacOS and Linux 安裝:
brew install trivy
docker run aquasec/trivy
或者使用腳本安裝:
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin v0.47.0
也可以基于源碼安裝:
git clone --depth 1 --branch v0.47.0 https://github.com/aquasecurity/trivy
cd trivy
go install ./cmd/trivy
(2)掃描容器鏡像
docker run -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy:0.47.0 image python:3.4-alpine
掃描結(jié)果如下:
2.Docker Bench for Security
https://github.com/docker/docker-bench-security
Docker Bench for Security是一個Docker安全相關(guān)的命令集,用于自動檢查在生產(chǎn)環(huán)境中部署Docker容器的數(shù)十種常見最佳實踐。
使用以下腳本可以從本機(jī)運(yùn)行:
git clone https://github.com/docker/docker-bench-security.git
cd docker-bench-security
sudo sh docker-bench-security.sh
或者基于Docker執(zhí)行:
docker run --rm --net host --pid host --userns host --cap-add audit_control \
-e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
-v /etc:/etc:ro \
-v /lib/systemd/system:/lib/systemd/system:ro \
-v /usr/bin/containerd:/usr/bin/containerd:ro \
-v /usr/bin/runc:/usr/bin/runc:ro \
-v /usr/lib/systemd:/usr/lib/systemd:ro \
-v /var/lib:/var/lib:ro \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
--label docker_bench_security \
docker-bench-security
3.Clair
https://github.com/quay/clair
Clair是一個用于靜態(tài)分析Docker和appc容器中的漏洞的開源項目。該工具有多種部署模式,最適合高可伸縮性和可用性。Clair 支持REST api,并提供HTML掃描報告。他還可以與Docker Registry集成以自動提供漏洞報告。
Clair 目前的版本v4使用ClairCore庫作為其檢查內(nèi)容和報告漏洞的引擎。在較高的層次上,可以將Clair視為ClairCore庫中提供的功能的服務(wù)包裝器。Clair V4的架構(gòu)如下圖所示:
詳細(xì)使用方式可以參考官方文檔:https://quay.github.io/clair/howto/getting_started.html
4.Kube-bench
https://github.com/aquasecurity/kube-bench
CIS Benchmarking 是保護(hù)IT系統(tǒng)和數(shù)據(jù)的全球公認(rèn)標(biāo)準(zhǔn),它提供了一系列的指導(dǎo)手冊來保護(hù)容易受到網(wǎng)絡(luò)攻擊的操作系統(tǒng)、軟件和網(wǎng)絡(luò)。
Kube-bench是一個開源工具,用于檢查Kubernetes是否按照CIS Kubernetes基準(zhǔn)(包含一組Kubernetes安全最佳實踐)來優(yōu)化部署。因此,當(dāng)僅為CIS基準(zhǔn)測試目的需要掃描時,kube-bench是最好的。
運(yùn)行kube-bench有多種方法??梢栽趐od中運(yùn)行kube-bench,但它需要訪問主機(jī)的PID命名空間以檢查正在運(yùn)行的進(jìn)程,以及訪問主機(jī)上存儲配置文件和其他文件的某些目錄。GitHub存儲庫包含特定于云的 job-*.yaml 文件 ,kube-bench將根據(jù)機(jī)器上運(yùn)行的Kubernetes版本自動決定運(yùn)行哪個測試集。
例如:
$ kubectl apply -f job.yaml
job.batch/kube-bench created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kube-bench-j76s9 0/1 ContainerCreating 0 3s
# Wait for a few seconds for the job to complete
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kube-bench-j76s9 0/1 Completed 0 11s
# The results are held in the pod's logs
kubectl logs kube-bench-j76s9
[INFO] 1 Master Node Security Configuration
[INFO] 1.1 API Server
...
具體可以參考相關(guān)文檔:https://github.com/aquasecurity/kube-bench/blob/main/docs/running.md
5.kubeaudit
https://github.com/Shopify/kubeaudit
kubeaudit是一個可以針對常見的安全控制對Kubernetes的部署進(jìn)行審計的開源工具,比如:
- 以非root用戶運(yùn)行
- 使用只讀的根文件系統(tǒng)
- 放棄易受攻擊的能力,不要添加新的
- 不要特權(quán)運(yùn)行
kubeaudit的Brewhome安裝如下:
kubeaudit all -f "/path/to/manifest.yml"
Kubeaudit 可以在三種不同的模式下運(yùn)行:manifest、cluster和local。它還可以自動修復(fù)清單,這使它有別于其他競爭對手。
manifest模式運(yùn)行—在該模式下,需要提供相關(guān)Kubernetes資源的manifest文件。
例如:
kubeaudit all -f "/path/to/manifest.yml"
輸出結(jié)果:
$ kubeaudit all -f "internal/test/fixtures/all_resources/deployment-apps-v1.yml"
---------------- Results for ---------------
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
namespace: deployment-apps-v1
--------------------------------------------
-- [error] AppArmorAnnotationMissing
Message: AppArmor annotation missing. The annotation 'container.apparmor.security.beta.kubernetes.io/container' should be added.
Metadata:
Container: container
MissingAnnotation: container.apparmor.security.beta.kubernetes.io/container
-- [error] AutomountServiceAccountTokenTrueAndDefaultSA
Message: Default service account with token mounted. automountServiceAccountToken should be set to 'false' or a non-default service account should be used.
-- [error] CapabilityShouldDropAll
Message: Capability not set to ALL. Ideally, you should drop ALL capabilities and add the specific ones you need to the add list.
Metadata:
Container: container
Capability: AUDIT_WRITE
...
另外,還有集群模式:
kubeaudit all
本地模式:
kubeaudit all -f "/path/to/config"
br
此外,kubeaudit有多個審計配置文件,包括外觀,能力,限制,特權(quán),rootfs, seccomp, netpols和asat。
6.Kubescape
https://github.com/kubescape/kubescape
Kubescape是一個開源的Kubernetes安全平臺,適用于IDE、CI/CD管道和集群。它的功能包括風(fēng)險分析、安全性、合規(guī)性和錯誤配置掃描,為Kubernetes用戶和管理員節(jié)省了寶貴的時間、精力和資源。
安裝:
curl -s https://raw.githubusercontent.com/kubescape/kubescape/master/install.sh | /bin/bash
執(zhí)行掃描:
kubescape scan --verbose
結(jié)果如下
7.Kube-hunter
https://github.com/aquasecurity/kube-hunter
kube-hunter是一個用Python開發(fā)的開源滲透測試工具,用于在Kubernetes集群中尋找安全漏洞。它支持編寫可以在本地機(jī)器、集群內(nèi)部以及主動和被動模式下遠(yuǎn)程執(zhí)行的自定義模塊。
在活動模式下,kube-hunter可以發(fā)現(xiàn)任何漏洞,還可以將kube-hunter作為模擬攻擊工具在staging 環(huán)境中運(yùn)行。
安裝和使用方式如下:
pip install kube-hunter # Installing Kube-hunter.
kube-hunter --remote some.node.com # Running remotely.
kube-hunter --cidr 192.168.0.0/24. # Network Scanning.
kube-hunter --remote some.domain.com --active # Active Mode.
kube-hunter --list --active # List of test cases.
kube-hunter --remote some.node.com --json # Json output
kube-hunter --k8s-auto-discover-nodes --kubeconfig "/path/config"
8.Cilium
https://github.com/cilium/cilium
Cilium是一個網(wǎng)絡(luò)安全檢測項目,提供基于eBPF的網(wǎng)絡(luò)可觀察性和安全性解決方案。它與Docker和Kubernetes兼容,允許在不更改應(yīng)用程序代碼或容器配置的情況下應(yīng)用安全策略。
9.Syft and Grype
https://github.com/anchore/syft
https://github.com/anchore/grype
Syft是一個基于Go開發(fā)的CLI工具庫,用于從容器映像和文件系統(tǒng)生成軟件物料清單(SBOM)。Grype是一個針對容器映像和文件系統(tǒng)的漏洞掃描工具。當(dāng)Syft與Grype等掃描工具一起搭配使用時,可以用于檢測系統(tǒng)漏洞或異常。
Syft安裝:
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
Grype安裝:
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin
具體使用,可參考官方文檔。
10.Dockle
https://github.com/goodwithtech/dockle
Dockle是一個基于遵循CIS(互聯(lián)網(wǎng)安全中心)Docker基準(zhǔn),并按照最佳實踐構(gòu)建安全的Docker容器鏡像的工具。
掃描Docker Image的操作命令如下:
(1)掃描Docker鏡像:
$ dockle goodwithtech/test-image:v1
br
(2)掃描Docker鏡像文件:
$ docker save alpine:latest -o alpine.tar
$ dockle --input alpine.tar
(3)獲取掃描JSON結(jié)果:
$ dockle -f json goodwithtech/test-image:v1
$ dockle -f json -o results.json goodwithtech/test-image:v1
更多操作可參考官方手冊。