本文讲的是<b>Docker最新安全性能调整分析</b>,【编者的话】作者通过对Docker的最新安全更新的深入分析与探索,总结了四条有关Docker安全更新的调整建议,包括调整能力、调整SELinux的标签、多级安全模式、调整命名空间。
自我发表前两篇有关Docker安全系列的文章之后,至今已有一段时间。本文更新了自那以后有关Docker的新增内容,并且介绍了全新功能,其中涵盖了与上游Docker的合并过程。
在前面的文章中,我介绍了基于Linux功能的容器分离。
借助Linux功能,你可以分离根用户权限,形成更小的特权群。目前,在默认情况下,Docker容器只拥有以下功能。
在某些情况下,你可能要调整此列表,例如,如果你正在构建一个运行<code>ntpd</code>或<code>crony</code>的容器,那么需要能够修改主机的系统时间。由于需要<code>CAP_SYS_TIME</code>,该容器将无法运行。在Docker的旧版本中,容器必须在<code>--privileged</code>模式下运行,该模式关闭了所有的安全策略。
在Docker1.3版本中添加了<code>--cap-add</code>和<code>--cap-drop</code>。现在为了运行<code>ntpd</code>容器,你可以只需运行:
其中只将SYS_TIME功能添加到了你的容器中。
另如,如果你的容器没有更改UID/GID的任何进程,你可以从容器中删除这些功能,使其更加安全。
或者你可以删除所有的功能后,再进行一一添加。
与调整功能相类似,我们已经新增了调整SELinux标签的能力。
借助常规的SELinux和Apache httpd,在默认情况下,我们只允许Apache进程来监听Apache的端口(http_port_t)。
我们也可以阻断所有传出端口的连接。这可以帮助我们锁定Apache进程,即便像ShellShock一样的黑客通过安全漏洞破坏了应用程序,我们仍可以阻止应用程序成为一个垃圾邮件僵尸,或者允许进程攻击其它系统。正如《加州旅馆》歌中唱道,“你可以随时入住,但你永远无法离开。”
然而,借助容器的情况下,如果你在一个容器内运行一个Apache服务器应用程序,该应用程序会遭受攻击,Apache进程能够通过网络连接到任何网络端口、成为垃圾邮件僵尸或者攻击其他主机/容器。
使用SELinux创建一个新的策略类型供容器运行,这相当容易。首先,你可以创建一个SELinux TE(类型强制执行)文件。
现在使用新类型运行容器:
现在,该容器与正常容器相比,有着更为严格的SELinux安全性。注意,你可能会需要查看审计日志,以观察你的应用程序是否需要额外的SELinux准许规则。
你可以通过使用audit2allow命令来添加规则到现有.te文件,重新编译并安装如下规则。
目前,我们使用<code>MCS</code>分离,从而确保容器不被其它容器干扰或交互,除非它是通过网络进行的连接。某些政府系统需要不同类型的MLS(多极安全)政策。借助MLS,你可以基于看到的数据级别来标记进程。 MLS说如果你的容器要处理绝密数据,那么它应该在绝密的地方运行。我们已经添加了Docker选项,允许管理员设置容器在特定级别运行,这些应该会满足MLS系统的需求。
这个命令将确保开启Docker容器的两个交替类型与级别,并且可以阻止容器使用不是相同标签的数据。不过这方面尚未通过认证,但我们愿意帮助第三方为MLS用户构建解决方案。
在其他有关安全的对话中,我已经讨论了命名空间如何被看作是一种安全机制,因为其删除了一个进程查看系统(PID命名空间)上其他进程的能力。网络命名空间可以删除通过你的命名空间看到其他网络的能力。 IPC(内部进程间通信)命名空间具有阻断容器使用其它容器的IPC能力。
Docker现在已经放宽这些限制。您可以用容器来共享主机的命名空间:
--pid=主机让容器共享主机的PID命名空间
--net=主机让容器共享主机的主机空间
--ipc=主机让容器共享主机的IPC空间
需要注意的是,既然已与主机共享PID或IPC的命名空间,这就需要我们依序禁用SELinux分离,阻断其工作。
===========================
译者介绍
原文发布时间为:2015-03-12
本文作者:田浩浩
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:Docker最新安全性能调整分析