十個優秀開源Docker&Kubernetes安全掃描工具,提升容器安全性!
Kubernetes(k8s)是一種目前流行的開源容器編排系統,可以自動部署、擴展和管理容器化工作負載。Kubernetes提供了容器自修復、自動擴展和服務發現的功能,但是,也存在一些固有的安全風險。Docker 是一個容器平臺,用于構建、部署和管理應用程序。Docker容器的輕量、可移植和可擴展特性為應用程序的開發和交付帶來了巨大的便利,特別是在微服務架構應用上,是許多開發者和組織的首選。然而,隨著容器化的廣泛應用,Docker也面臨著日益復雜和嚴峻的容器安全挑戰。
本文主要介紹k8s和Docker所面對的安全性問題,并推薦幾款開源免費容器安全工具。
Kubernetes的安全性問題
(1)集群安全
集群安全包括通過啟用認證、授權和加密來保護控制組件,如API服務器、etcd和Kubernetes控制器管理程序(Kubernetes controller manager)等。
(2)節點安全
節點安全主要是指正確配置網絡和保護Kubernetes運行時環境,包括刪除不必要的用戶帳戶、確保應用訪問的合規性。
(3)應用程序安全
應用程序安全意味著要對pod進行保護,在Kubernetes中,pod是用于運行應用程序的容器。保護這些應用程序的前提是保護pod。Kubernetes提供了多個安全特性來幫助保護應用程序。這些特性可用于限制資源訪問、實施網絡策略,并支持容器之間的安全通信。
Docker容器的安全問題
(1)鏡像污染
目前Docker Hub上面有著數量眾多的第三方上傳鏡像,這些鏡像質量參差不齊。在這其中,不排除有黑客故意上傳包含了惡意程序的鏡像,并偽裝成業務鏡像供用戶下載使用。當用戶誤用此類鏡像啟動容器時,無疑會導致容器被入侵。因此,用戶必須對這些鏡像進行掃描甄別,以保證容器所使用的鏡像是可受信任的,盡可能不使用非信任的第三方鏡像。
(2)網絡攻擊
Docker默認使用bridge網絡,該網絡會創建一個虛擬網橋,連接在同一個網橋之間的容器可以互相訪問。當某個容器被入侵時,黑客有可能順著網絡訪問到宿主機中的其他容器。同時 ,攻擊者也可以通過DDos等方式,攻擊容器的服務來耗盡主機的資源,從而引起整個宿主機的崩潰。
(3)內核攻擊
當黑客獲取到容器權限時,由于共享內核的緣故,理論上可通過對內核的攻擊來達到控制或影響主機的地步 。
(4)操作不當
有些操作不當容易使容器出現漏洞,例如:
- 在啟動容器時將主機的根目錄映射到容器中;
- 在啟用容器時使用特權模式——privileged,此時Docker容器允許可以訪問主機上的所有設備,并可以獲取大量設備文件的訪問權限。
(5)針對Docker Daemon的攻擊
Docker使用的是C/S架構,作為服務端的Docker Daemon會接收客戶端通過CLI或者REST API發送的命令,并執行對容器的相應操作。但請求不一定都是由可信任的用戶發起的,攻擊者可能通過偽造請求的方式,來達到欺騙Daemon端執行危險的操作。
(6)Docker漏洞攻擊
Docker本身屬于應用程序,不可避免地會有出現代碼的漏洞,這可能導致程序受到攻擊。
綜上所述,要確保容器安全,涉及設備、系統、網絡、鏡像、應用、操作等各個層次。其中,容器本身的安全往往容易容易被忽略,下面內容主要推薦一些對保護Kubernetes集群和Docker容器有用的開源工具,有助于Docker 鏡像的靜態掃描、安全審計、加固 Kubernetes 集群和實現運行時安全性。
1.Trivy
https://github.com/aquasecurity/trivy
Trivy是一個全面且多功能的安全掃軟件。Trivy包含擁有查找安全問題的掃描器,并將目標定位在可以找到這些問題的地方。可用于查找容器、Kubernetes、代碼存儲庫、云等當中存在的漏洞、錯誤配置、密碼泄露、SBOM等問題。Trivy支持大多數流行的編程語言,支持跨平臺操作系統。
Trivy支持掃描的對象包括:
- 容器鏡像
- 文件系統
- Git倉庫(遠程)
- 虛擬機鏡像
- Kubernetes
- AWS
Trivy能夠發現的問題包括:
- 使用中的操作系統包和軟件依賴關系(SBOM)
- 已知漏洞(CVEs)
- IaC問題和錯誤配置
- 敏感信息和秘密
- 軟件許可信息
在執行Trivy掃描之后,將得到一個漏洞列表,包括漏洞的嚴重性和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
掃描結果如下:
2.Docker Bench for Security
https://github.com/docker/docker-bench-security
Docker Bench for Security是一個Docker安全相關的命令集,用于自動檢查在生產環境中部署Docker容器的數十種常見最佳實踐。
使用以下腳本可以從本機運行:
git clone https://github.com/docker/docker-bench-security.git
cd docker-bench-security
sudo sh docker-bench-security.sh
或者基于Docker執行:
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是一個用于靜態分析Docker和appc容器中的漏洞的開源項目。該工具有多種部署模式,最適合高可伸縮性和可用性。Clair 支持REST api,并提供HTML掃描報告。他還可以與Docker Registry集成以自動提供漏洞報告。
Clair 目前的版本v4使用ClairCore庫作為其檢查內容和報告漏洞的引擎。在較高的層次上,可以將Clair視為ClairCore庫中提供的功能的服務包裝器。Clair V4的架構如下圖所示:
詳細使用方式可以參考官方文檔:https://quay.github.io/clair/howto/getting_started.html
4.Kube-bench
https://github.com/aquasecurity/kube-bench
CIS Benchmarking 是保護IT系統和數據的全球公認標準,它提供了一系列的指導手冊來保護容易受到網絡攻擊的操作系統、軟件和網絡。
Kube-bench是一個開源工具,用于檢查Kubernetes是否按照CIS Kubernetes基準(包含一組Kubernetes安全最佳實踐)來優化部署。因此,當僅為CIS基準測試目的需要掃描時,kube-bench是最好的。
運行kube-bench有多種方法。可以在pod中運行kube-bench,但它需要訪問主機的PID命名空間以檢查正在運行的進程,以及訪問主機上存儲配置文件和其他文件的某些目錄。GitHub存儲庫包含特定于云的 job-*.yaml 文件 ,kube-bench將根據機器上運行的Kubernetes版本自動決定運行哪個測試集。
例如:
$ 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
...
具體可以參考相關文檔:https://github.com/aquasecurity/kube-bench/blob/main/docs/running.md
5.kubeaudit
https://github.com/Shopify/kubeaudit
kubeaudit是一個可以針對常見的安全控制對Kubernetes的部署進行審計的開源工具,比如:
- 以非root用戶運行
- 使用只讀的根文件系統
- 放棄易受攻擊的能力,不要添加新的
- 不要特權運行
kubeaudit的Brewhome安裝如下:
kubeaudit all -f "/path/to/manifest.yml"
Kubeaudit 可以在三種不同的模式下運行:manifest、cluster和local。它還可以自動修復清單,這使它有別于其他競爭對手。
manifest模式運行—在該模式下,需要提供相關Kubernetes資源的manifest文件。
例如:
kubeaudit all -f "/path/to/manifest.yml"
輸出結果:
$ 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有多個審計配置文件,包括外觀,能力,限制,特權,rootfs, seccomp, netpols和asat。
6.Kubescape
https://github.com/kubescape/kubescape
Kubescape是一個開源的Kubernetes安全平臺,適用于IDE、CI/CD管道和集群。它的功能包括風險分析、安全性、合規性和錯誤配置掃描,為Kubernetes用戶和管理員節省了寶貴的時間、精力和資源。
安裝:
curl -s https://raw.githubusercontent.com/kubescape/kubescape/master/install.sh | /bin/bash
執行掃描:
kubescape scan --verbose
結果如下
7.Kube-hunter
https://github.com/aquasecurity/kube-hunter
kube-hunter是一個用Python開發的開源滲透測試工具,用于在Kubernetes集群中尋找安全漏洞。它支持編寫可以在本地機器、集群內部以及主動和被動模式下遠程執行的自定義模塊。
在活動模式下,kube-hunter可以發現任何漏洞,還可以將kube-hunter作為模擬攻擊工具在staging 環境中運行。
安裝和使用方式如下:
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是一個網絡安全檢測項目,提供基于eBPF的網絡可觀察性和安全性解決方案。它與Docker和Kubernetes兼容,允許在不更改應用程序代碼或容器配置的情況下應用安全策略。
9.Syft and Grype
https://github.com/anchore/syft
https://github.com/anchore/grype
Syft是一個基于Go開發的CLI工具庫,用于從容器映像和文件系統生成軟件物料清單(SBOM)。Grype是一個針對容器映像和文件系統的漏洞掃描工具。當Syft與Grype等掃描工具一起搭配使用時,可以用于檢測系統漏洞或異常。
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(互聯網安全中心)Docker基準,并按照最佳實踐構建安全的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結果:
$ dockle -f json goodwithtech/test-image:v1
$ dockle -f json -o results.json goodwithtech/test-image:v1
更多操作可參考官方手冊。