随着容器成为几乎无处不在的应用程序打包和部署方法,恶意软件的实例也随之增加。保护容器现在是 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 CLI 或 Jenkins 插件,这两者都由 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 |
高 |
无 |
|
CVE-2017-15400 |
libcups2-2.2.1-8+deb9u1 |
高 |
无 |
|
CVE-2017-17458 |
mercurial-4.0-1+deb9u1 |
高 |
无 |
虽然 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 可能会很好地集成。
评论已关闭。