譯者 | 陳峻
審校 | 重樓
最近,我找到了一些既可以掃描Docker鏡像中的漏洞,又能夠被輕松地集成到CI/CD中的工具。除去那些較為老舊且不太直觀的,本文我將向您介紹四種免費、最新且易用的掃描工具。
基本原理
所有這些工具的工作原理都比較類似。它們使用的是如下兩步流程:
- 生成軟件物料清單(Software Bill of Materials,SBOM)。
- 將SBOM與不同的漏洞數據庫進行比較。
此處的SBOM是針對那些Docker鏡像中運行的系統和應用而安裝的、所有軟件依賴包列表。由于系統級軟件包經常被忽略,因此在管道中進行Docker掃描是非常重要的。這就引出了第二步,即:根據多個漏洞數據庫,對SBOM中的每個軟件包進行檢查,以發現其中是否存在漏洞。而且在搜尋和匹配時,軟件包的版本也應被考慮在內。
1. Docker Scout
該工具由Docker公司開發并已內置到了Docker Desktop應用中。遺憾的是,它并沒有與Docker的CLI捆綁,所以您需要手動進行安裝。即,在Docker的CLI環境中,您需要使用如下單行命令來完成安裝:
curl -sSfL https://raw.githubusercontent.com/docker/scout-cli/main/install.sh | sh -s --
當然,您也可以從其官方的GitHub庫處進行復制。一旦您具備了運行docker scout的條件,便可以運行docker scout quickview了。顧名思義,它主要適合于只想獲悉Docker中存在著多少漏洞及其嚴重程度,而無需深究具體漏洞的需求。
~? docker scout quickview ubuntu:20.04
? Image stored for indexing
? Indexed 127 packages
Target │ ubuntu:20.04 │ 0C 0H 3M 10L
digest │ bf40b7bc7a11 │
如上所示,該Ubuntu 20.04鏡像并不存在嚴重或高危的漏洞,不過有著幾個中等嚴重程度的漏洞。若要獲取每個漏洞的詳細信息,請運行docker scout cves。它將顯示與漏洞相關的CVE列表,并提供相應的鏈接,以便您了解更多信息。此外,Docker Scout還會告訴你是否有更新版本的受影響軟件包修復了該漏洞。例如:
~? docker scout cves ubuntu:20.04
...
pkg:deb/ubuntu/gnutls28@3.6.13-2ubuntu1.8?os_distro=focal&os_name=ubuntu&os_version=20.04
? MEDIUM CVE-2023-5981
https://scout.docker.com/v/CVE-2023-5981
Affected range : <3.6.13-2ubuntu1.9
Fixed version : 3.6.13-2ubuntu1.9
CVSS Score : 5.9
CVSS Vector : CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N
...
在上述例子中,其中的一個中型漏洞來自版本為3.6.13-2ubuntu1.8的gnutls軟件包。該漏洞已在3.6.13-2ubuntu1.9版本中被修復,但該Ubuntu Docker鏡像的維護者顯然還沒有及時更新鏡像。
同時,Docker Scout還被內置在了DockerHub中,DockerHub是由Docker公司托管的鏡像注冊中心。它可以免費為您的3個鏡像執行掃描。若要掃描更多的鏡像,則需升級到付費計劃版本。DockerHub會在每次推送新標簽時,都執行一次漏洞掃描。要啟用該服務,請打開鏡像的repo(存儲庫),進入“設置”,然后啟用Docker Scout鏡像分析。
DockerHub上的Docker Scout掃描報告
2. Trivy
Trivy是由Aqua Security開發的一款開源工具。相比Docker Scout,它除了能夠掃描Docker鏡像外,也提供隱蔽檢測和對IaC(基礎設施即代碼)配置錯誤的掃描。您既可以用多種軟件包管理器(如:apt、yum、brew、pacman、port、以及nix)來安裝Trivy,也可以通過鏈接--https://aquasecurity.github.io/trivy/v0.48/getting-started/installation/,直接下載其二進制文件。在首次運行時,它會將所有漏洞數據庫都下載到本地環境中。您可以通過運行trivy image來掃描目標鏡像。下面,我們將從Dockerfile中創建一個自定義的鏡像:
FROM alpine:3.18
RUN mkdir /app
COPY <<EOF /app/aws-creds
[default]
aws_access_key_id = AKIA5432112345XXXXPP
aws_secret_access_key = P9YXdfASASDfdsfdldFdfdfs4sldkfksfsdle3vg
EOF
Dockerfile會使用alpine作為基礎鏡像,以創建帶有硬編碼AWS密鑰的aws-creds文件。我們可以通過如下命令來構建鏡像并運行掃描。
~? docker build -t test-image -f Dockerfile .
~? trivy image test-image
test-image (alpine 3.18.5)
Total: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)
/app/aws-creds (secrets)
Total: 2 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 2)
CRITICAL: AWS (aws-access-key-id)
═══════════════════════════════════════════════════════════════════════
AWS Access Key ID
───────────────────────────────────────────────────────────────────────
/app/aws-creds:2 (added by 'COPY <<EOF /app/aws-creds # buildkit')
───────────────────────────────────────────────────────────────────────
2 [ aws_access_key_id = ********************
3 aws_secret_access_key = ****************************************
───────────────────────────────────────────────────────────────────────
在此,Trivy運行了兩種類型的掃描:針對已安裝軟件包的漏洞掃描、以及用于查找文件中密鑰的密鑰檢測。在本例中,漏洞掃描并沒有發現任何問題。這是在意料之中的,畢竟我們使用的是alpine鏡像,其中只有非?;镜牟僮飨到y軟件包,沒有其他,甚至連Bash都沒有。不過,密鑰檢測發現了aws-creds中的硬編碼密鑰。同時,Trivy還能捕捉到環境變量中的密鑰。例如,使用如下由Dockerfile構建的鏡像,其生成的報告也會體現出發現了關鍵性問題。
FROM alpine:3.18
ENV AWS_ACCESS_KEY_ID=AKIA5432112345XXXXPP
ENV AWS_SECRET_ACCESS_KEY=P9YXdfASDfdsfdldFdfdfs4sldkfksfsdle3vg
此外,您還可以為密鑰掃描自定義匹配器,以掃描Dockerfile本身,而不是鏡像。為此,您可以導航到包含了Dockerfile的目錄,然后按照如下方式運行trivy config。
~? trivy config .
Dockerfile (dockerfile)
Tests: 26 (SUCCESSES: 24, FAILURES: 2, EXCEPTIONS: 0)
Failures: 2 (UNKNOWN: 0, LOW: 1, MEDIUM: 0, HIGH: 1, CRITICAL: 0)
HIGH: Specify at least 1 USER command in Dockerfile with non-root user
════════════════════════════════════════════════════════════════════════════=
Running containers with 'root' user can lead to a container escape situation.
It is a best practice to run containers as non-root users,
which can be done by adding a 'USER' statement to the Dockerfile.
See https://avd.aquasec.com/misconfig/ds002
─────────────────────────────────────────────────────────────────────────────
當然,trivy config也會掃描Kubernetes、Terraform和CloudFormation清單,以檢查它們是否遵循了最佳實踐。您可以參照由鏈接--https://aquasecurity.github.io/trivy/latest/ecosystem/cicd/提供的多種選擇,將Trivy集成到自己的CI/CD中。
3. Grype
由Anchore開發的Grype雖然不如Trivy那樣成熟,但是它仍在不斷改進中。盡管Grype不具備配置掃描和密鑰檢測等功能,但是它能夠很好地完成掃描Docker鏡像包的主要功能。從原理上說,Grype實際上使用了同樣由Anchore開發的Syft,來生成SBOM。據此,它將軟件包與漏洞數據庫進行了比較。您可以使用如下命令來安裝它。
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sudo sh -s -- -b /usr/local/bin
要掃描鏡像,您只需運行如下命令:
~? grype aquasec/trivy
? Scanned for vulnerabilities [14 vulnerability matches]
├── by severity: 0 critical, 0 high, 14 medium, 0 low, 0 negligible
└── by status: 2 fixed, 12 not-fixed, 0 ignored
NAME INSTALLED FIXED-IN TYPE VULNERABILITY SEVERITY
busybox 1.36.1-r5 apk CVE-2023-42366 Medium
busybox 1.36.1-r5 apk CVE-2023-42365 Medium
busybox 1.36.1-r5 apk CVE-2023-42364 Medium
busybox 1.36.1-r5 apk CVE-2023-42363 Medium
...
在上例中,Grype測試了Trivy的鏡像。類似Docker Scout,Grype也會告訴你是否有更新版本的受影響軟件包修復了該漏洞。而且,Grype的優點在于它的漏洞列表并不雜亂,其每個漏洞在屏幕上都只占一行。如果您想進一步了解某個漏洞的話,則可以使用grype explain。
grype -o json aquasec/trivy | grype explain --id CVE-2023-42366
不過,由于Grype不會緩存鏡像的SBOM,因此即便您剛剛完成了一次掃描,每次任務都必須從零開始加載和掃描鏡像。對于CI/CD而言,由于它只有一個適用于GitHub Actions的模板,因此您必須手動創建針對其他CI/CD服務的掃描任務。
4. Snyk Container
Snyk可以通過各種功能來簡化應用程序的安全加固過程。不過,Snyk僅供個人免費使用,而且并不開源(當然它也有付費計劃)。其Snyk Container則是一款可以被免費提供的,用于掃描Docker鏡像的工具。在使用之前,您需要在snyk.io處注冊一個賬戶,接著可以通過鏈接--https://docs.snyk.io/snyk-cli/install-or-update-the-snyk-cli安裝Snyk CLI,或運行如下命令:
curl --compressed https://static.snyk.io/cli/latest/snyk-linux -o snyk
chmod +x ./snyk
sudo mv ./snyk /usr/local/bin/
在運行任何命令之前,您都需要通過如下命令在頁面上完成身份驗證。
Snyk auth
至此,我們便可以使用snyk container test來掃描鏡像了。注意,請不要被該命令的名稱所誤導。它掃描的是鏡像,而不是正在運行的容器。
~? synk container test anchore/grype
Testing anchore/grype...
? Medium severity vulnerability found in google.golang.org/protobuf/encoding/protojson
Description: Stack-based Buffer Overflow
Info: https://security.snyk.io/vuln/SNYK-GOLANG-GOOGLEGOLANGORGPROTOBUFENCODINGPROTOJSON-6137908
Introduced through: google.golang.org/protobuf/encoding/protojson@v1.31.0
From: google.golang.org/protobuf/encoding/protojson@v1.31.0
? Medium severity vulnerability found in golang.org/x/crypto/ssh
Description: Authentication Bypass by Capture-replay
Info: https://security.snyk.io/vuln/SNYK-GOLANG-GOLANGORGXCRYPTOSSH-6130669
Introduced through: golang.org/x/crypto/ssh@v0.16.0
From: golang.org/x/crypto/ssh@v0.16.0
Fixed in: 0.17.0
Tested 827 dependencies for known issues, found 2 issues.
上例便是我們使用Snyk來測試Grype的鏡像??梢?,Snyk發現了2個中等嚴重程度的問題。不同于Trivy和Grype把摘要放在報告最上面,Snyk則在漏洞列表的末尾處才給出小結摘要。這就意味著,當漏洞列表過長時,查閱小結就不太方便了。同時,Snyk也能夠掃描各種IaC文件,即:使用snyk iac test命令來掃描Terraform、CloudFormation、Kubernetes、Kustomize、Helm、ARM和Serverless等文件。此外,Snyk還有一個Web應用版的GUI(如下圖),可以連接到Git存儲庫處掃描漏洞。
來自docs.snyk.io的Snyk項目的漏洞信息
小結
綜上所述,Snyk無疑是四種工具中功能最強大的。但是它需要一個賬戶,而且只能免費供個人使用。如果您正在尋找一款開源工具的話,Trivy會是您的不二之選。它比Docker Scout和Grype具有更多的功能,且速度相當快??偟膩碚f,我強烈建議您在CI/CD管道中至少實施這些工具中的一種,以實現對應用程序的安全加固。
譯者介紹
陳峻(Julian Chen),51CTO社區編輯,具有十多年的IT項目實施經驗,善于對內外部資源與風險實施管控,專注傳播網絡與信息安全知識與經驗。
原文標題:4 Free, Easy-To-Use Tools For Docker Vulnerability Scanning,作者:Tin Plavec