Docker容器的安全性

注意事项 佩雷夫 :Docker安全主题可能是当今IT世界中永恒的主题之一。 因此,在不作进一步解释的情况下,我们将介绍相关建议的下一部分。 如果您已经对此问题感兴趣,那么您将很熟悉其中的许多内容。 此外,我们还为选区本身提供了有用的实用程序列表和一些资源,供您进一步研究该问题。



这是Docker安全指南。 欢迎您提供反馈,因为它只是来自各种资源的摘录的集合,而并非所有摘录都经过了彻底的检查。 这些建议分为三类:

  1. 使用Docker时主机操作系统内部的必要措施;
  2. 有关程序集配置文件和创建容器的说明;
  3. 可与特定Docker Enterprise功能集成的安全工具。

各种资源已成为领导的基础,下面列出了许多资源。 它不能被称为详尽无遗,但它涵盖了所有基础知识。 可以在CIS测试的说明中找到更多信息(该链接在本手册的末尾提供)以及Docker文档中。

Docker安全基准


Docker Bench for Security自动检查您的Docker是否符合最常见的最佳实践。 该脚本是一个很好的启发式安全测试,但不应视为全面的分析工具。

主机操作系统


显然,如果主机系统本身不受保护,则无法保护Docker容器。 因此,您必须遵循操作系统安全领域的最佳实践。 另外,除了以下建议之外,进行漏洞分析也是明智的。

审核规则


使用auditctl为与Docker相关的文件创建和使用审核规则。 例如,您可以将-w /usr/bin/dockerd -k docker添加到/etc/audit.rules并重新启动审核服务。

FIPS模式


启用FIPS模式会强制密码工具切换到FIPS (美国联邦信息处理标准 -大约翻译)中引入的算法,从而符合联邦和行业标准及要求。 如果主机操作系统支持FIPS模式,则可以通过运行以下命令来启用它:

 sed -i 's/GRUB_CMDLINE_LINUX="/GRUB_CMDLINE_LINUX="fips=1 /g' /etc/default/grub grub2-mkconfig -o /boot/grub2/grub.cfg && reboot 

您还必须在Docker Engine中启用FIPS:

 mkdir -p /etc/systemd/system/docker.service.d 2>&1; echo -e "[Service]\n Environment=\"DOCKER_FIPS=1\"" > /etc/systemd/system/docker.service.d/fips-module.conf; systemctl daemon-reload; systemctl restart docker 

有关更多信息,请参阅DockerRed Hat文档。

Docker的秘密


机密数据应保密。 您可以使用docker service create命令启动相应的服务:

 docker service create --label com.docker.ucp.access.label=/prod --name nginx --publish 443 --secret source=orcabank_prod_mobile.ca.pem.v1,target=ca.pem nginx 

有关详细信息,请参见文档

Docker配置文件


可以将以下设置添加到/etc/docker/daemon.json配置/etc/docker/daemon.json

  • "icc":false禁用容器之间的数据交换,以避免不必要的信息泄漏。
  • log-level: "info" -捕获除调试以外的所有日志。
  •  { "log-driver": "syslog", "log-opts": { "syslog-address": "udp://1.2.3.4:1111" } } 

    -连接远程日志记录,将其转发到指定地址。 仅在syslog守护程序正在运行时有效。 可以选择使用TCP和UDP。 每个特定容器的连接也是可能的。 为此,启动Docker时会设置一个特殊标志( --log-opt syslog-address=ADDRESS )。
  • "userns-remap": "Your_User" -通过隔离特定用户的名称空间来防止特权升级。

运输安全


只有具有TLS客户端凭据访问权限的用户才能连接到Docker守护程序(如果需要远程访问)。

授权插件


确定允许哪些用户执行哪些命令并为Docker创建适当的授权插件。 然后运行Docker守护程序并将插件添加到其中:

 dockerd --authorization-plugin=PLUGIN_ID 

要了解有关创建授权插件的更多信息,请参阅文档

守护程序选项


Docker守护程序可以使用一组默认参数。

  • --live-restore此选项有助于减少系统关闭或重新引导期间的容器停机时间。 以最小的停机时间来修补或更新它们变得更加容易。
  • --userland-proxy=false当发夹式NAT可用或使用时,用户空间中的代理成为冗余服务,这只会增加可能的攻击媒介数量;
  • --no-new-privileges防止容器使用suid或sguid获得附加特权;
  • --seccomp-profile /path/to/profile -如果您有自己的seccomp配置文件,则可以将此标志与它一起使用。 在此处了解有关Seccomp和Docker的更多信息。

配置容器和程序集文件


用户创建


确保为该容器创建了一个用户,并在该用户下运行它(不要在根目录下运行该容器)。

远程访问


拒绝对守护程序的远程访问。 如果仍然有必要,请使用证书对其进行保护。

隔离用户名空间


确保隔离Docker中的用户名空间特别重要,因为默认情况下它与主机名空间共享。 在某些情况下,这可以用于提升特权,甚至可以用于容器之外。 您可以通过编辑配置文件来隔离用户名称空间(如上所述,在Docker Configuration File部分中)。 由于此问题的重要性,因此另外提及了该问题。

健康检查


Healthcheck(运行状况检查)是用于检查容器完整性的强大工具。 使用HEALTHCHECK在Dockerfile中对其进行配置。 运行状况检查可让您验证容器是否正常运行。 在下面的示例中,运行状况检查如果服务器正在运行,则以0结尾,如果服务器“崩溃”,则以1结尾:

 HEALTHCHECK CMD curl --fail http://localhost || exit 1 

SELinux


如果主机操作系统支持SELinux,请创建或导入SELinux策略,并在启用SELinux的守护进程模式下运行Docker:

 docker daemon --selinux-enable 

在这种情况下,可以使用安全设置启动Docker容器,例如:

 docker run --interactive --tty --security-opt label=level:TopSecret centos /bin/bash 

网络接口


默认情况下,Docker侦听所有网络接口。 由于在大多数情况下,仅预期其中之一会发生流量,因此这种方法会不合理地增加遭受攻击的风险。 因此,启动容器时,可以将其端口绑定到主机上的特定接口:

 docker run --detach --publish 10.2.3.4:49153:80 nginx 

缓存的图像版本


下载图像时,请确保本地缓存与存储库的内容匹配。 否则,您可能会收到该图像的过时版本或包含漏洞的图像。

网桥


默认网络模型docker0容易受到ARP欺骗和MAC泛洪等攻击。 要解决此问题,请按照您的说明创建网桥,如此处所述。

Docker套接字警告


切勿将Docker套接字扔入容器中。 否则,该容器将能够执行Docker命令,并因此与主机操作系统进行通信并对其进行控制。 不要这样做。

配置Docker Enterprise


Docker信任


Docker Trust允许您生成可用于验证图像的加密完整性的密钥。 Docker Trust密钥可用于通过私钥对Docker映像进行签名,这些私钥已通过Notary Server上的公钥进行验证。 更多信息在这里文档的此部分详细介绍了在Enterprise Engine中启用Docker Trust。

漏洞扫描


Docker Enterprise有一个内置的漏洞扫描器,它使得下载CVE数据库成为可能,从而可以离线扫描图像中的漏洞。 定期扫描图像有助于使其更安全:用户会立即收到有关发现的漏洞的警告。 有关如何执行此操作的更多信息,请参见此处

注意事项 佩雷夫 :Docker映像中也有开放源代码漏洞扫描程序,请参阅本文结尾处的示例。

LDAP和UCP集成


通用控制平面可以与LDAP集成。 结果将是简化的认证系统,以避免不必要的重复。 在文章与LDAP目录集成中了解有关此内容的更多信息。

其他材质


有关Docker最佳安全做法的更多信息,请访问docs.docker.com 。 我们还建议下载Docker的Internet安全测试中心

翻译者的奖金


作为对本文的逻辑补充,我们将在Docker中发布10种流行的开源安全工具的列表。 它是从另一篇文章中借用的(由Doerrfeld.io的Bill Doerrfeld撰写)。

注意 :请阅读“ 33+ Kubernetes安全工具 ”一文中提到的许多项目的更多信息。

  1. Docker Bench for Security是本文开头提到的脚本,用于检查Docker容器是否符合常见的安全惯例。

  2. 对于静态分析容器中的漏洞, Clair可能是最受欢迎的实用程序。 它使用了许多CVE漏洞数据库(包括领先的Linux发行版的跟踪器,例如Red Hat,Debian,Ubuntu)。 它为开发人员提供了API,并为扩展功能提供了简单的机会(通过添加“驱动程序”)。 它在流行的容器映像公共注册表中使用(类似于Docker Hub)-Quay.io。
  3. Cilium是基于BPF网络数据包过滤技术的内核级网络安全解决方案。
  4. Anchore是基于CVE的实用程序,用于分析图像内容的安全漏洞。 另外,它允许您应用自定义策略(基于各种数据,包括白/黑名单,文件内容等)来评估容器的安全性。
  5. OpenSCAP Workbench是一个用于跨平台创建和维护安全策略的完整生态系统。 为了检查容器,它提供了oscap-docker实用程序。
  6. Dagda是用于扫描Docker容器中的漏洞,木马,病毒和恶意软件的实用程序。 CVE数据库包括OWASP依赖项检查,Red Hat椭圆数据库,漏洞数据库漏洞利用存储库。
  7. 公证是用于签名Docker映像的框架,最初由Docker Inc.创建(然后移交给CNCF进行开发)。 它的使用使您可以委派角色并在容器之间分配职责,以及验证图像的加密完整性。
  8. Grafaes是一种元数据API,旨在管理内部安全策略。 例如,它提高了容器安全扫描器的性能。 Shopify使用此API来管理其500,000张图像中的元数据。
  9. Sysdig Falco - Kubernetes的实用程序,用于监视系统的行为:容器中,主机上,网络上的活动。 允许您在基础架构中配置连续检查,检测异常并将警报发送到任何Linux系统调用。
  10. Banyanops Collector是用于Docker容器的静态图像分析的另一个工具。 使您可以“查看”图像文件,收集必要的数据,应用必要的策略等。

可以在 Aqua Security 文章中找到关于使Docker更安全的另一种实用技巧的精选 。 她的许多技巧与上面已经提到的那些技巧重叠,但是还有其他一些技巧。 例如,作者建议监视容器中的活动,并指出使用Docker Swarm时要查找的内容。

去年,对于那些想更深入地研究这个主题的人, 出版了《 Docker安全性:快速参考 》一书 ,其片段可在此处免费获得。

最后,要实际了解Docker安全性的一些方面:Seccomp配置文件和在容器中使用Linux内核的功能-您可以Play with Docker * 资源上进行相应的实验室工作 -请参阅“安全性”部分。



*两年前,我们谈论了这个资源,2018年11月,发生了一个非常有趣的故事(从安全角度来看)。 简而言之,来自Cyber​​Ark Software Ltd.的专家 设法破解:实现在容器外部执行命令的能力,即 在主机系统上。 很好地说明了Docker中的安全问题,对吗? 阅读发生在这里的所有详细信息。

译者的PS


另请参阅我们的博客:

Source: https://habr.com/ru/post/zh-CN474012/


All Articles