5 个容器安全开源工具

使用这些程序来识别漏洞并扫描容器中的恶意软件。
338 位读者喜欢这篇文章。
tools in the cloud with security

Opensource.com

随着容器成为几乎无处不在的应用程序打包和部署方法,恶意软件的实例也随之增加。保护容器现在是 DevOps 工程师的首要任务。幸运的是,许多开源程序可用于扫描容器和容器镜像。让我们来看看其中五个工具。

Anchore | Clair | Dagda | OpenSCAP | Sysdig Falco


Anchore

Anchore 引擎是一个开源项目,用于检查、分析和认证 Docker 镜像。Anchore 可以作为 Docker 镜像运行,可以独立运行,也可以与 Kubernetes 等编排平台一起运行。Anchore 从 Anchore 托管的云服务获取安全数据。Anchore 也可用作 Jenkins 插件,允许您将容器镜像扫描集成到 CI/CD 工作流程中。

得益于 Docker Compose 文件,Anchore Engine 的安装过程非常简单。安装说明可在 GitHub 页面以及支持知识库中找到。Anchore Engine 提供后端/服务器端组件,而为了扫描镜像,Anchore 需要另一个组件。扫描器可以是 CLI 工具,例如 Anchore CLIJenkins 插件,这两者都由 Anchore 开发和维护。

要启动扫描,请使用以下命令将镜像添加到 Anchore Engine

anchore-cli image add python:3

此命令提交要扫描的镜像。提交后,Anchore 将启动镜像扫描。遗憾的是,似乎没有办法知道扫描何时完成,除非键入(或编写脚本)

anchore-cli image get python:3 

来监控状态。扫描镜像后,使用以下命令列出镜像中报告的 CVE

anchore-cli image vuln python:3 os

漏洞 ID

软件包

严重性

修复

漏洞 URL

CVE-2017-1000379

linux-libc-dev-4.9.88-1+deb9u1

https://security-tracker.debian.org/tracker/CVE-2017-1000379

CVE-2017-14062

libidn11-1.33-1

https://security-tracker.debian.org/tracker/CVE-2017-14062

CVE-2017-15400

libcups2-2.2.1-8+deb9u1

https://security-tracker.debian.org/tracker/CVE-2017-15400

CVE-2017-17458

mercurial-4.0-1+deb9u1

https://security-tracker.debian.org/tracker/CVE-2017-17458

虽然 CLI 报告 CVE 漏洞,但 vuln 命令可以报告非操作系统漏洞。在此示例中运行它未报告任何数据

anchore-cli image vuln python:3
os: available
non-os: available

anchore-cli image vuln python:3 non-os
<no output>

Anchore 扫描还可以报告镜像中存在的工件,包括 Python 包、Ruby gem、操作系统包以及文件系统上的所有其他文件

anchore-cli image content python:3 python

软件包

版本

位置

Python

2.7.13

/usr/lib/python2.7/lib-dynload

argparse

1.2.1

/usr/lib/python2.7

bzr

2.8.0.dev1

/usr/lib/python2.7/dist-packages

configobj

5.0.6

/usr/lib/python2.7/dist-packages

mercurial

4

/usr/lib/python2.7/dist-packages

pip

10.0.1

/usr/local/lib/python3.7/site-packages

setuptools

39.2.0

/usr/local/lib/python3.7/site-packages

six

1.10.0

/usr/lib/python2.7/dist-packages

wheel

0.31.1

/usr/local/lib/python3.7/site-packages

wsgiref

0.1.2

/usr/lib/python2.7

借助这些数据,Anchore 允许您根据策略评估镜像,以检查安全合规性。为此,输入

anchore-cli evaluate check python:3
Image Digest: sha256:9d49a3fdfd4198061e10241ee2ff9d75fb270c80747973360c22cd553f1e228c
Full Tag: docker.io/python:3
Status: fail
Last Eval: 2018-07-11T13:20:58Z
Policy ID: 2c53a13c-1765-11e8-82ef-23527761d060

默认情况下,Anchore 只会提供评估摘要。要获得完整评估,您可以传递 --detail 标志,这将提供完整评估

anchore-cli evaluate check python:3 --detail
Image Digest: sha256:9d49a3fdfd4198061e10241ee2ff9d75fb270c80747973360c22cd553f1e228c
Full Tag: docker.io/python:3
Image ID: 17453243214e5dd215bdac0f00c639d82941e1d577ee959c842de73d533da572
Status: fail
Last Eval: 2018-07-11T13:22:12Z
Policy ID: 2c53a13c-1765-11e8-82ef-23527761d060
Final Action: stop
Final Action Reason: policy_evaluation

触发器

详细信息

状态

dockerfile

指令

未找到 Dockerfile 指令“HEALTHCHECK”,匹配条件“不存在”检查

警告

漏洞

软件包

在中等严重性漏洞中发现操作系统软件包类型 (dpkg) - imagemagick-6-common (CVE-2008-3134 - https://security-tracker.debian.org/tracker/CVE-2008-3134)

警告

漏洞

软件包

在中等严重性漏洞中发现操作系统软件包类型 (dpkg) - imagemagick-6-common (CVE-2017-14528 - https://security-tracker.debian.org/tracker/CVE-2017-14528)

警告

漏洞

软件包

在中等严重性漏洞中发现操作系统软件包类型 (dpkg) - imagemagick-6-common (CVE-2018-5248 - https://security-tracker.debian.org/tracker/CVE-2018-5248)

警告

漏洞

软件包

在中等严重性漏洞中发现操作系统软件包类型 (dpkg) - imagemagick-6-common (CVE-2018-11251 - https://security-tracker.debian.org/tracker/CVE-2018-11251)

警告

漏洞

软件包

在中等严重性漏洞中发现操作系统软件包类型 (dpkg) - mercurial (CVE-2018-1000132 - https://security-tracker.debian.org/tracker/CVE-2018-1000132)

警告

门、阈值和评估是根据上面提到的策略 ID 执行的。通过键入以下内容检查策略

anchore-cli policy get 2c53a13c-1765-11e8-82ef-23527761d060 --detail

这将输出策略的 JSON。开源 Anchore Engine 允许您定义和激活自定义策略,但它不附带可视化策略编辑器,因此尝试手动编辑策略可能会很棘手。Anchore 也适用于私有注册表;使用以下命令添加它们

anchore-cli registry add <registry> <username> <password>

Anchore 还可以配置为扫描存储库并添加在存储库中找到的任何标签。添加后,Anchore 引擎将定期轮询注册表并安排它们进行分析。

Clair

Clair 是 CoreOS 的开源漏洞扫描器和容器镜像静态分析工具,Clair 是为 CoreOS 的容器注册表 Quay.io 提供支持的同一工具。

Clair 定期从各种来源接收漏洞信息并将其保存在数据库中。Clair 公开 API,供客户端调用和执行扫描。也就是说,Clair 只是一个“后端”工具,不附带用于启动扫描的扫描器或前端。有一些与 Clair 集成的第三方工具,但要从终端扫描镜像作为部署脚本的一部分,唯一合理的选择似乎是 optiopay 的 klar

Clair 的安装说明可在其 Github 仓库中找到,并且可以作为 Docker 容器运行。Clair 还附带一个 Docker Compose 文件和一个 Helm Chart 来简化安装,或者 可以从源代码编译。这些步骤仅引导服务器启动——要运行扫描,您需要一个兼容的前端。

虽然 Clair 的 集成页面 列出了可用的选项,但对于本文,我研究了可用的命令行实用程序。在这些实用程序中,klar 是最简单快捷的。klar 可以从其 GitHub 发布页面 下载,或者 从头编译

运行 klar 非常简单。要启动扫描,语法为

CLAIR_ADDR=<Clair server URL>  klar <image name to be scanned>

例如,假设我们使用 Docker Compose 文件启动 Clair 服务器,并且我们想要扫描 python:3 Docker 镜像,则命令将如下所示

CLAIR_ADDR=localhost klar python:3

Klar 将拉取 Docker 镜像(如果主机上不存在),并针对 Clair 运行扫描。完成后,它将显示如下报告

Analysing 9 layers

Got results from Clair API v3
Found 488 vulnerabilities
Unknown: 22
Negligible: 181
Low: 150
Medium: 113
High: 22

CVE-2017-12424: [High]

Found in: shadow [1:4.4-4.1]

Fixed By:
In shadow before 4.5, the newusers tool could be made to manipulate internal data structures in ways unintended by the authors. Malformed input may lead to crashes (with a buffer overflow or other memory corruption) or other unspecified behaviors. This crosses a privilege boundary in, for example, certain web-hosting environments in which a Control Panel allows an unprivileged user account to create subaccounts.
https://security-tracker.debian.org/tracker/CVE-2017-12424

Klar 允许您通过环境变量自定义其功能。一些值得注意的环境变量包括

CLAIR_OUTPUT:允许您定义 klar 显示的漏洞的严重性。例如,将 CLAIR_OUTPUT 设置为 Medium 意味着 klar 将仅显示标记为中等严重性或更高的漏洞。

JSON_OUTPUT:如果设置为 true,klar 将以 JSON 格式输出漏洞报告。

WHITELIST_FILE:klar 将不会报告此处列出的 CVE 作为漏洞。这是一个 YAML 文件;示例配置可在 klar 的存储库中找到。

DOCKER_USER / DOCKER_PASSWORD / DOCKER_TOKEN:如果您的注册表需要身份验证,则传递这些凭据可以让 klar 使用这些凭据拉取镜像。

Dagda

Dagda 执行已知漏洞的静态分析。它使用 ClamAV 防病毒引擎来扫描和检测 Docker 镜像中包含的木马、病毒和恶意软件。Dagda 还与 Sysdig Falco 集成,以监控正在运行的 Docker 容器的异常情况。

Dagda 也附带 Docker Compose 文件,使其易于评估。Docker Compose 文件和相关安装说明可在 Dagda 的 Github 存储库中找到。在运行 Dagda CLI 之前,您必须设置 Dagda 服务器的主机名和端口。为此,请使用以下命令

export DAGDA_HOST='127.0.0.1'
export DAGDA_PORT=5000

在使用 Dagda 进行分析之前,您需要初始化漏洞数据库。为此,请使用以下命令

python3 dagda.py vuln --init

这需要一些时间,可以通过使用 --init_status 选项观看以下命令的结果来监控它

watch python3 dagda.py vuln --init_status

一旦漏洞数据库准备就绪,状态就会更新

1. Every 2.0s: python dagda.py vuln --init...  sabhat: Sun Jul 15 16:39:27 2018
2. 
3. {
4.     "status": "Updated",
5.     "timestamp": "2018-07-15 11:04:51.234453"
6. }
7.  Now, we can start using Dagda. 
8. Dagda lets us search for specific CVEs
9. 
10. python dagda.py vuln --cve_info CVE-2009-2890
11. [
12.     {
13.         "cveid": "CVE-2009-2890",
14.         "cvss_access_complexity": "Medium",
15.         "cvss_access_vector": "Network",
16.         "cvss_authentication": "None required",
17.         "cvss_availability_impact": "None",
18.         "cvss_base": 4.3,
19.         "cvss_confidentiality_impact": "None",
20.         "cvss_exploit": 8.6,
21.         "cvss_impact": 2.9,
22.         "cvss_integrity_impact": "Partial",
23.         "cvss_vector": [
24.             "AV:N",
25.             "AC:M",
26.             "Au:N",
27.             "C:N",
28.             "I:P",
29.             "A:N"
30.         ],
31.         "cweid": "CWE-79",
32.         "mod_date": "16-08-2017",
33.         "pub_date": "20-08-2009",
34.         "summary": "Cross-site scripting (XSS) vulnerability in results.php in PHP Scripts Now Riddles allows remote attackers to inject arbitrary web script or HTML via the searchquery parameter."
35.     }
36. ]

Dagda 还允许您按产品搜索 CVE

1. python dagda.py vuln --product openssh
2. [
3.     {
4.         "CVE-1999-1010": {
5.             "cveid": "CVE-1999-1010",
6.             "cvss_access_complexity": "Low",
7.             "cvss_access_vector": "Local access",
8.             "cvss_authentication": "None required",
9.             "cvss_availability_impact": "None",
10.             "cvss_base": 2.1,
11.             "cvss_confidentiality_impact": "Partial",
12.             "cvss_exploit": 3.9,
13.             "cvss_impact": 2.9,
14.             "cvss_integrity_impact": "None",
15.             "cvss_vector": [
16.                 "AV:L",
17.                 "AC:L",
18.                 "Au:N",
19.                 "C:P",
20.                 "I:N",
21.                 "A:N"
22.             ],
23.             "cweid": "CWE-0",
24.             "mod_date": "17-10-2016",
25.             "pub_date": "14-12-1999",
26.             "summary": "An SSH 1.2.27 server allows a client to use the \"none\" cipher, even if it is not allowed by the server policy."
27.         }

使用以下语法扫描 Docker 镜像

1. python3 dagda.py check --docker_image python:3
2. {
3.     "id": "5b4b2ef44785ff0001b76e9d",
4.     "msg": "Accepted the analysis of <python:3>"
5. }

上面获得的 ID 可用于使用以下命令获取详细报告

1. python dagda.py history python:3 --id 5b4b32ec4785ff000106c693
2. [
3.     {
4.         "id": "5b4b2ef44785ff0001b76e9d",
5.         "image_name": "python:3",
6.         "status": "Analyzing",
7.         "timestamp": "2018-07-15 11:24:36.866439"
8.     }
9. ]

分析可能需要一些时间,请耐心等待。分析完成后,您可以使用以下命令获取详细报告

1. python dagda.py history python:3 --id 5b4b32ec4785ff000106c693
2. [
3.     {
4.         "id": "5b4b32ec4785ff000106c693",
5.         "image_name": "python:3",
6.         "static_analysis": {
7.             "malware_binaries": [],
8.             "os_packages": {
9.                 "ok_os_packages": 388,
10.                 "os_packages_details": [
11.                     {
12.                         "is_false_positive": false,
13.                         "is_vulnerable": true,
14.                         "product": "bash",
15.                         "version": "4.4",
16.                         "vulnerabilities": [
17.                             {
18.                                 "CVE-2017-5932": {
19.                                     "cveid": "CVE-2017-5932",
20.                                     "cvss_access_complexity": "Low",
21.                                     "cvss_access_vector": "Local access",
22.                                     "cvss_authentication": "None required",
23.                                     "cvss_availability_impact": "Partial",
24.                                     "cvss_base": 4.6,
25.                                     "cvss_confidentiality_impact": "Partial",
26.                                     "cvss_exploit": 3.9,
27.                                     "cvss_impact": 6.4,
28.                                     "cvss_integrity_impact": "Partial",
29.                                     "cvss_vector": [
30.                                         "AV:L",
31.                                         "AC:L",
32.                                         "Au:N",
33.                                         "C:P",
34.                                         "I:P",
35.                                         "A:P"
36.                                     ],
37.                                     "cweid": "CWE-20",
38.                                     "mod_date": "31-03-2017",
39.                                     "pub_date": "27-03-2017",
40.                                     "summary": "The path autocompletion feature in Bash 4.4 allows local users to gain privileges via a crafted filename starting with a \" (double quote) character and a command substitution metacharacter."
41.                                 }
42.                             },
43.                             [....]
44.                         ]
45.                     },
46.                 [...]
47.                 ],
48.                 "total_os_packages": 416,
49.                 "vuln_os_packages": 28
50.             },
51.             "prog_lang_dependencies": {
52.                 "dependencies_details": {
53.                     "java": [],
54.                     "js": [
55.                         {
56.                             "is_false_positive": false,
57.                             "is_vulnerable": true,
58.                             "product": "jquery",
59.                             "product_file_path": "/usr/share/doc/libfreetype6/js/jquery-1.11.0.min.js",
60.                             "version": "1.11.0.min",
61.                             "vulnerabilities": []
62.                         }
63.                     ],
64.                     "nodejs": [],
65.                     "php": [],
66.                     "python": [],
67.                     "ruby": []
68.                 },
69.                 "vuln_dependencies": 1
70.             }
71.         },
72.         "status": "Completed",
73.         "timestamp": "2018-07-15 11:48:41.214345"
74.     }
75. ]

虽然 Dagda 确实支持容器监控,但这需要 Sysdig Falco 正在运行。Dagda 不支持扫描存储库或注册表,使其更适合按需扫描,而不是计划或自动注册表扫描。

OpenSCAP

安全内容自动化协议 (SCAP) 使用一组特定的标准,实现自动化的漏洞管理、测量和策略合规性评估。OpenSCAP 是 SCAP 实现的一个示例。OpenSCAP 提供 一组工具用于扫描和合规性管理,包括 oscap-docker,它可以扫描容器镜像。

oscap-docker 允许您使用以下命令扫描镜像的 xccdf(可扩展配置清单描述格式)合规性

oscap-docker image <image-name> xccdf eval --report results.html --profile standard <path to xccdf definition file>

例如,要扫描 CentOS 镜像

oscap-docker image centos xccdf eval --report results.html --profile standard /usr/share/xml/scap/ssg/content/ssg-centos7-xccdf.xml

结果输出将如下所示

1. Title   Disable At Service (atd)
2. Rule    service_atd_disabled
3. Result  pass
4. 
5. Title   Disable Network Router Discovery Daemon (rdisc)
6. Rule    service_rdisc_disabled
7. Result  fail
8. 
9. Title   Disable Odd Job Daemon (oddjobd)
10. Rule    service_oddjobd_disabled
11. Result  pass
12. 
13. Title   Disable Apache Qpid (qpidd)
14. Rule    service_qpidd_disabled
15. Result  pass
16. 
17. Title   Disable Automatic Bug Reporting Tool (abrtd)
18. Rule    service_abrtd_disabled
19. Result  pass
20. 
21. Title   Disable ntpdate Service (ntpdate)
22. Rule    service_ntpdate_disabled
23. Result  notapplicable
24. 
25. Title   Verify and Correct File Permissions with RPM
26. Rule    rpm_verify_permissions
27. Result  fail
28. 
29. Title   Verify File Hashes with RPM
30. Rule    rpm_verify_hashes
31. Result  pass
32. 
33. Title   Ensure Software Patches Installed
34. Rule    security_patches_up_to_date
35. Result  notchecked

OpenSCAP 的容器镜像 CVE 扫描似乎仅适用于 RHEL 镜像;对于其他镜像,oscap-docker 一直显示消息

<image> is not based on RHEL

扫描不会从该点继续。

Sysdig Falco

虽然 Sysdig Falco 不是纯粹的容器安全或 CVE 扫描解决方案,但 Sysdig Falco 值得一提。Sysdig Falco 监控我们正在运行的 Docker 容器,并提供对容器行为以及容器内应用程序行为的洞察。它提供了一组丰富的默认通知和警报,并允许您自定义它们的规则。

Sysdig Falco 可以在容器内以及 Linux 主机上工作,但 Sysdig 建议将其安装在主机操作系统上。以下提供了在容器和主机操作系统上安装 Sysdig Falco 的说明

安装完成后,启动 Sysdig Falco

sudo falco

Falco 将加载规则,并在准备就绪时提供以下消息

1. Falco initialized with configuration file /etc/falco/falco.yaml
2. Loading rules from file /etc/falco/falco_rules.yaml:
3. Loading rules from file /etc/falco/falco_rules.local.yaml:

Falco 将根据规则显示不同严重性级别的消息

1. Debug Shell spawned by untrusted binary (user=root shell=sh parent=httpd cmdline=sh -c ls > /dev/null pcmdline=httpd --action spawn_shell --interval 0 --once gparent=event_generator ggparent=docker-containe gggparent=docker-containe ggggparent=dockerd)
2. Notice Known system binary sent/received network traffic (user=root command=sha1sum --action network_activity --interval 0 --once connection=172.17.0.2:56852->10.2.3.4:8192)
3. Informational System user ran an interactive command (user=daemon command=login )
4. Error File below a known binary directory opened for writing (user=root command=event_generator  file=/bin/created-by-event-generator-sh parent=docker-containe pcmdline=docker-containe -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/82dc57b2e8b551e09a07a694763be59193f9b29e64773040a1710560d5570927 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc gparent=docker-containe)
5. Error File below /etc opened for writing (user=root command=event_generator  parent=docker-containe pcmdline=docker-containe -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/82dc57b2e8b551e09a07a694763be59193f9b29e64773040a1710560d5570927 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc file=/etc/created-by-event-generator-sh program=event_generator gparent=docker-containe ggparent=dockerd gggparent=systemd)

这些警报有什么好处?首先,它们可以转发到 SIEM 工具(如 Splunk),我们可以进一步根据这些警报的计数和频率创建/发出警报。Falco 还可以调用程序并将警报发送到该程序。例如,我们可以配置 Falco 通过对 webhook 端点进行 cURL 调用来将通知发送到 Slack。

结论

虽然大多数开源扫描器是较大容器安全平台的小组件,但它们性能出色。Anchore 和 Clair 为扫描注册表和存储库以及推送新镜像提供了完整的解决方案。Dagda 在扫描方面可能有点慢,但它确实完成了工作。对于基于 RHEL 的镜像,OpenSCAP 可能会很好地集成。

接下来阅读什么
Sathyajith Bhat
Sathyajith Bhat 是一位经验丰富的 DevOps/SRE 专业人士,目前在 Adobe I/O 担任 DevOps 工程师,Adobe I/O 是 Adobe 的开发者生态系统和社区,并且是《Practical Docker With Python》的作者。在此之前,他曾担任 Styletag.com 的首席 Ops/SRE。

评论已关闭。

© . All rights reserved.