0

四款免费、易用的Docker漏洞扫描工具

 3 months ago
source link: https://www.51cto.com/article/779693.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

四款免费、易用的Docker漏洞扫描工具

译文 精选
作者: 陈峻 2024-01-18 09:00:00
本文向您介绍四种既可以扫描Docker镜像中的漏洞,又能够被轻松地集成到CI/CD中的实用工具。

译者 | 陈峻

审校 | 重楼

最近,我找到了一些既可以扫描Docker镜像中的漏洞,又能够被轻松地集成到CI/CD中的工具。除去那些较为老旧且不太直观的,本文我将向您介绍四种免费、最新且易用的扫描工具。

所有这些工具的工作原理都比较类似。它们使用的是如下两步流程:

  1. 生成软件物料清单(Software Bill of Materials,SBOM)。
  2. 将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/[email protected]?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扫描报告

DockerHub上的Docker Scout扫描报告Docker Scout对于CI/CD服务的支持相当不错。他们为GitHub Actions、GitLab CI/CD、CircleCI、Azure DevOps、Jenkins甚至是BitBucket Pipelines都提供了各种模板。请参见链接--https://github.com/docker/scout-cli?tab=readme-ov-file#ci-integration

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镜像,其中只有非常基本的操作系统软件包,没有其他,甚至连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/[email protected]
 From: google.golang.org/protobuf/encoding/[email protected]

✗ 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/[email protected]
 From: golang.org/x/crypto/[email protected]
 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项目的漏洞信息

来自docs.snyk.io的Snyk项目的漏洞信息当然,Snyk也集成了大量的CI/CD功能,具体请参考链接--https://docs.snyk.io/integrate-with-snyk/snyk-ci-cd-integrations

综上所述,Snyk无疑是四种工具中功能最强大的。但是它需要一个账户,而且只能免费供个人使用。如果您正在寻找一款开源工具的话,Trivy会是您的不二之选。它比Docker Scout和Grype具有更多的功能,且速度相当快。总的来说,我强烈建议您在CI/CD管道中至少实施这些工具中的一种,以实现对应用程序的安全加固。

陈峻(Julian Chen),51CTO社区编辑,具有十多年的IT项目实施经验,善于对内外部资源与风险实施管控,专注传播网络与信息安全知识与经验。

原文标题:4 Free, Easy-To-Use Tools For Docker Vulnerability Scanning,作者:Tin Plavec


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK