譯者 | 陳峻
審校 | 重樓
最近,我找到了一些既可以掃描Docker鏡像中的漏洞,又能夠被輕松地集成到CI/CD中的工具。除去那些較為老舊且不太直觀的,本文我將向您介紹四種免費(fèi)、最新且易用的掃描工具。
基本原理
所有這些工具的工作原理都比較類(lèi)似。它們使用的是如下兩步流程:
- 生成軟件物料清單(Software Bill of Materials,SBOM)。
- 將SBOM與不同的漏洞數(shù)據(jù)庫(kù)進(jìn)行比較。
此處的SBOM是針對(duì)那些Docker鏡像中運(yùn)行的系統(tǒng)和應(yīng)用而安裝的、所有軟件依賴包列表。由于系統(tǒng)級(jí)軟件包經(jīng)常被忽略,因此在管道中進(jìn)行Docker掃描是非常重要的。這就引出了第二步,即:根據(jù)多個(gè)漏洞數(shù)據(jù)庫(kù),對(duì)SBOM中的每個(gè)軟件包進(jìn)行檢查,以發(fā)現(xiàn)其中是否存在漏洞。而且在搜尋和匹配時(shí),軟件包的版本也應(yīng)被考慮在內(nèi)。
1. Docker Scout
該工具由Docker公司開(kāi)發(fā)并已內(nèi)置到了Docker Desktop應(yīng)用中。遺憾的是,它并沒(méi)有與Docker的CLI捆綁,所以您需要手動(dòng)進(jìn)行安裝。即,在Docker的CLI環(huán)境中,您需要使用如下單行命令來(lái)完成安裝:
curl -sSfL https://raw.githubusercontent.com/docker/scout-cli/main/install.sh | sh -s --
當(dāng)然,您也可以從其官方的GitHub庫(kù)處進(jìn)行復(fù)制。一旦您具備了運(yùn)行docker scout的條件,便可以運(yùn)行docker scout quickview了。顧名思義,它主要適合于只想獲悉Docker中存在著多少漏洞及其嚴(yán)重程度,而無(wú)需深究具體漏洞的需求。
~? 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鏡像并不存在嚴(yán)重或高危的漏洞,不過(guò)有著幾個(gè)中等嚴(yán)重程度的漏洞。若要獲取每個(gè)漏洞的詳細(xì)信息,請(qǐng)運(yùn)行docker scout cves。它將顯示與漏洞相關(guān)的CVE列表,并提供相應(yīng)的鏈接,以便您了解更多信息。此外,Docker Scout還會(huì)告訴你是否有更新版本的受影響軟件包修復(fù)了該漏洞。例如:
~? 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
...
在上述例子中,其中的一個(gè)中型漏洞來(lái)自版本為3.6.13-2ubuntu1.8的gnutls軟件包。該漏洞已在3.6.13-2ubuntu1.9版本中被修復(fù),但該Ubuntu Docker鏡像的維護(hù)者顯然還沒(méi)有及時(shí)更新鏡像。
同時(shí),Docker Scout還被內(nèi)置在了DockerHub中,DockerHub是由Docker公司托管的鏡像注冊(cè)中心。它可以免費(fèi)為您的3個(gè)鏡像執(zhí)行掃描。若要掃描更多的鏡像,則需升級(jí)到付費(fèi)計(jì)劃版本。DockerHub會(huì)在每次推送新標(biāo)簽時(shí),都執(zhí)行一次漏洞掃描。要啟用該服務(wù),請(qǐng)打開(kāi)鏡像的repo(存儲(chǔ)庫(kù)),進(jìn)入“設(shè)置”,然后啟用Docker Scout鏡像分析。
DockerHub上的Docker Scout掃描報(bào)告
2. Trivy
Trivy是由Aqua Security開(kāi)發(fā)的一款開(kāi)源工具。相比Docker Scout,它除了能夠掃描Docker鏡像外,也提供隱蔽檢測(cè)和對(duì)IaC(基礎(chǔ)設(shè)施即代碼)配置錯(cuò)誤的掃描。您既可以用多種軟件包管理器(如:apt、yum、brew、pacman、port、以及nix)來(lái)安裝Trivy,也可以通過(guò)鏈接--https://aquasecurity.github.io/trivy/v0.48/getting-started/installation/,直接下載其二進(jìn)制文件。在首次運(yùn)行時(shí),它會(huì)將所有漏洞數(shù)據(jù)庫(kù)都下載到本地環(huán)境中。您可以通過(guò)運(yùn)行trivy image來(lái)掃描目標(biāo)鏡像。下面,我們將從Dockerfile中創(chuàng)建一個(gè)自定義的鏡像:
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會(huì)使用alpine作為基礎(chǔ)鏡像,以創(chuàng)建帶有硬編碼AWS密鑰的aws-creds文件。我們可以通過(guò)如下命令來(lái)構(gòu)建鏡像并運(yùn)行掃描。
~? 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運(yùn)行了兩種類(lèi)型的掃描:針對(duì)已安裝軟件包的漏洞掃描、以及用于查找文件中密鑰的密鑰檢測(cè)。在本例中,漏洞掃描并沒(méi)有發(fā)現(xiàn)任何問(wèn)題。這是在意料之中的,畢竟我們使用的是alpine鏡像,其中只有非?;镜牟僮飨到y(tǒng)軟件包,沒(méi)有其他,甚至連Bash都沒(méi)有。不過(guò),密鑰檢測(cè)發(fā)現(xiàn)了aws-creds中的硬編碼密鑰。同時(shí),Trivy還能捕捉到環(huán)境變量中的密鑰。例如,使用如下由Dockerfile構(gòu)建的鏡像,其生成的報(bào)告也會(huì)體現(xiàn)出發(fā)現(xiàn)了關(guān)鍵性問(wèn)題。
FROM alpine:3.18
ENV AWS_ACCESS_KEY_ID=AKIA5432112345XXXXPP
ENV AWS_SECRET_ACCESS_KEY=P9YXdfASDfdsfdldFdfdfs4sldkfksfsdle3vg
此外,您還可以為密鑰掃描自定義匹配器,以掃描Dockerfile本身,而不是鏡像。為此,您可以導(dǎo)航到包含了Dockerfile的目錄,然后按照如下方式運(yùn)行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
─────────────────────────────────────────────────────────────────────────────
當(dāng)然,trivy config也會(huì)掃描Kubernetes、Terraform和CloudFormation清單,以檢查它們是否遵循了最佳實(shí)踐。您可以參照由鏈接--https://aquasecurity.github.io/trivy/latest/ecosystem/cicd/提供的多種選擇,將Trivy集成到自己的CI/CD中。
3. Grype
由Anchore開(kāi)發(fā)的Grype雖然不如Trivy那樣成熟,但是它仍在不斷改進(jìn)中。盡管Grype不具備配置掃描和密鑰檢測(cè)等功能,但是它能夠很好地完成掃描Docker鏡像包的主要功能。從原理上說(shuō),Grype實(shí)際上使用了同樣由Anchore開(kāi)發(fā)的Syft,來(lái)生成SBOM。據(jù)此,它將軟件包與漏洞數(shù)據(jù)庫(kù)進(jìn)行了比較。您可以使用如下命令來(lái)安裝它。
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sudo sh -s -- -b /usr/local/bin
要掃描鏡像,您只需運(yùn)行如下命令:
~? 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測(cè)試了Trivy的鏡像。類(lèi)似Docker Scout,Grype也會(huì)告訴你是否有更新版本的受影響軟件包修復(fù)了該漏洞。而且,Grype的優(yōu)點(diǎn)在于它的漏洞列表并不雜亂,其每個(gè)漏洞在屏幕上都只占一行。如果您想進(jìn)一步了解某個(gè)漏洞的話,則可以使用grype explain。
grype -o json aquasec/trivy | grype explain --id CVE-2023-42366
不過(guò),由于Grype不會(huì)緩存鏡像的SBOM,因此即便您剛剛完成了一次掃描,每次任務(wù)都必須從零開(kāi)始加載和掃描鏡像。對(duì)于CI/CD而言,由于它只有一個(gè)適用于GitHub Actions的模板,因此您必須手動(dòng)創(chuàng)建針對(duì)其他CI/CD服務(wù)的掃描任務(wù)。
4. Snyk Container
Snyk可以通過(guò)各種功能來(lái)簡(jiǎn)化應(yīng)用程序的安全加固過(guò)程。不過(guò),Snyk僅供個(gè)人免費(fèi)使用,而且并不開(kāi)源(當(dāng)然它也有付費(fèi)計(jì)劃)。其Snyk Container則是一款可以被免費(fèi)提供的,用于掃描Docker鏡像的工具。在使用之前,您需要在snyk.io處注冊(cè)一個(gè)賬戶,接著可以通過(guò)鏈接--https://docs.snyk.io/snyk-cli/install-or-update-the-snyk-cli安裝Snyk CLI,或運(yùn)行如下命令:
curl --compressed https://static.snyk.io/cli/latest/snyk-linux -o snyk
chmod +x ./snyk
sudo mv ./snyk /usr/local/bin/
在運(yùn)行任何命令之前,您都需要通過(guò)如下命令在頁(yè)面上完成身份驗(yàn)證。
Snyk auth
至此,我們便可以使用snyk container test來(lái)掃描鏡像了。注意,請(qǐng)不要被該命令的名稱(chēng)所誤導(dǎo)。它掃描的是鏡像,而不是正在運(yùn)行的容器。
~? 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來(lái)測(cè)試Grype的鏡像。可見(jiàn),Snyk發(fā)現(xiàn)了2個(gè)中等嚴(yán)重程度的問(wèn)題。不同于Trivy和Grype把摘要放在報(bào)告最上面,Snyk則在漏洞列表的末尾處才給出小結(jié)摘要。這就意味著,當(dāng)漏洞列表過(guò)長(zhǎng)時(shí),查閱小結(jié)就不太方便了。同時(shí),Snyk也能夠掃描各種IaC文件,即:使用snyk iac test命令來(lái)掃描Terraform、CloudFormation、Kubernetes、Kustomize、Helm、ARM和Serverless等文件。此外,Snyk還有一個(gè)Web應(yīng)用版的GUI(如下圖),可以連接到Git存儲(chǔ)庫(kù)處掃描漏洞。
來(lái)自docs.snyk.io的Snyk項(xiàng)目的漏洞信息
小結(jié)
綜上所述,Snyk無(wú)疑是四種工具中功能最強(qiáng)大的。但是它需要一個(gè)賬戶,而且只能免費(fèi)供個(gè)人使用。如果您正在尋找一款開(kāi)源工具的話,Trivy會(huì)是您的不二之選。它比Docker Scout和Grype具有更多的功能,且速度相當(dāng)快??偟膩?lái)說(shuō),我強(qiáng)烈建議您在CI/CD管道中至少實(shí)施這些工具中的一種,以實(shí)現(xiàn)對(duì)應(yīng)用程序的安全加固。
譯者介紹
陳峻(Julian Chen),51CTO社區(qū)編輯,具有十多年的IT項(xiàng)目實(shí)施經(jīng)驗(yàn),善于對(duì)內(nèi)外部資源與風(fēng)險(xiǎn)實(shí)施管控,專(zhuān)注傳播網(wǎng)絡(luò)與信息安全知識(shí)與經(jīng)驗(yàn)。
原文標(biāo)題:4 Free, Easy-To-Use Tools For Docker Vulnerability Scanning,作者:Tin Plavec