开源 容器
随着容器成为打包和部署应用程序的一种几乎无处不在的方法,恶意软件的实例已经增加。 现在,保护容器是DevOps工程师的头等大事。 幸运的是,可以使用许多开源程序来扫描容器和容器图像。 让我们看一下五个这样的工具。
锚地 | 克莱尔 | 达格达 | OpenSCAP | Sysdig Falco
锚地
Anchore引擎是一个开源项目,用于检查,分析和认证Docker映像。 Anchore可以作为Docker映像使用,可以单独运行或与业务流程平台(例如Kubernetes)一起运行。 Anchore从Anchore的托管云服务中获取安全数据。 Anchore也可以作为Jenkins插件使用,使您可以将容器图像扫描集成为CI / CD工作流程的一部分。由于Docker compose文件,Anchore Engine的安装过程非常简单。 安装说明可在GitHub页面以及支持知识库中找到 。 Anchore引擎提供了后端/服务器端组件,而要扫描图像,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
Vulnerability ID | 包 | 严重程度 | 固定 | 漏洞网址 |
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
命令可以报告非OS漏洞。 在此示例中,运行它不会报告任何数据:
anchore-cli image vuln python:3
os: available
non-os: available
anchore-cli image vuln python:3 non-os
<no output>
锚定扫描还可以报告图像中存在的伪像,包括Python包,Ruby gem,os包以及文件系统上的所有其他文件:
anchore-cli image content python:3 python
Package | 版 | 位置 |
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
Gate | 触发 | 详情 | 状态 |
dockerfile | 指令 | 找不到Dockerfile指令'HEALTHCHECK',匹配条件'not_exists'检查 | 警告 |
vulnerabilities | 包 | 操作系统软件包类型(dpkg)中存在中等漏洞-imagemagick-6-common(CVE-2008-3134- https: //security-tracker.debian.org/tracker/CVE-2008-3134) | 警告 |
vulnerabilities | 包 | 在OS软件包类型(dpkg)中发现的中等漏洞-imagemagick-6-common(CVE-2017-14528- https: //security-tracker.debian.org/tracker/CVE-2017-14528) | 警告 |
vulnerabilities | 包 | 在OS软件包类型(dpkg)中发现的中等漏洞-imagemagick-6-common(CVE-2018-5248- https: //security-tracker.debian.org/tracker/CVE-2018-5248) | 警告 |
vulnerabilities | 包 | 在OS软件包类型(dpkg)中发现中等漏洞-imagemagick-6-common(CVE-2018-11251- https: //security-tracker.debian.org/tracker/CVE-2018-11251) | 警告 |
vulnerabilities | 包 | 操作系统软件包类型(dpkg)中发现的中等漏洞-Merurial(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是CoreOS的一种用于容器映像的开源漏洞扫描程序和静态分析工具,它是为CoreOS的容器注册表Quay.io提供支持的同一工具。
Clair定期从各种来源获取漏洞信息,并将其保存在数据库中。 Clair公开了供客户端调用和执行扫描的API。 就是说,Clair是“仅后端”工具,没有扫描仪或用于启动扫描的前端。 有迹象表明,与克莱尔集成了一些第三方的工具,而是从一个终端扫描图像作为部署脚本的一部分,唯一合理的选择似乎是KLAR由optiopay。
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对已知漏洞执行静态分析。 它使用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
虽然它不是纯粹的容器安全性或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)
这些警报有什么用? 首先,可以将它们转发到Splunk等SIEM工具,然后我们可以根据这些警报的数量和频率进一步创建/发出警报。 Falco还可以调用程序并将警报发送到该程序。 例如,我们可以通过对Webhook端点进行cURL
调用,将Falco配置为向Slack发送通知。
结论
尽管大多数开源扫描仪是较大的容器安全平台的小组件,但它们的性能令人钦佩。 当推送新图像时,Anchore和Clair提供了用于扫描注册表和存储库的完整解决方案。 Dagda的扫描速度可能会有些慢,但是可以完成这项工作。 对于基于RHEL的映像,OpenSCAP可能集成得很好。
接下来要读什么
翻译自: https://opensource.com/article/18/8/tools-container-security
开源 容器