Docker 的安全性


评估 Docker 的安全性时,主要考虑三个方面:

  • 由内核的命名空间和控制组机制提供的容器内在安全
  • Docker 程序(特别是服务端)本身的抗攻击性
  • 内核安全性的加强机制对容器安全性的影响

内核命名空间和私有网络

当用 docker run 启动一个容器时,在后台 Docker 为容器创建了一个独立的命名空间和控制组集合。命名空间提供了最基础也是最直接的隔离,在容器中运行的进程不会被运行在主机上的进程和其它容器发现和作用。

从网络架构的角度来看,所有的容器通过本地主机的网桥接口相互通信,就像物理机器通过物理交换机通信一样。每个容器都有自己独有的网络栈,意味着它们不能访问其他容器的 sockets 或接口,不过可以配置互通。

控制组

控制组是 Linux 容器机制的另外一个关键组件,负责实现资源的审计和限制。它提供了很多有用的特性;以及确保各个容器可以公平地分享主机的内存、CPU、磁盘 IO 等 资源;当然,更重要的是,控制组确保了当容器内的资源使用产生压力时不会连累主机系统。尽管控制组不负责隔离容器之间相互访问、处理数据和进程,它在防止拒绝服务(DDOS)攻击方面是必不可少的。

Docker 服务端的防护

Docker 服务的运行目前需要 root 权限,因此其安全性十分关键。

首先,确保只有可信的用户才可以访问 Docker 服务。

为了加强对服务端的保护,Docker 的 REST API(客户端用来跟服务端通信)在 0.5.2 之后使用本地的 Unix 套接字机制替代了原先绑定在 127.0.0.1 上的 TCP 套接字,因为后者容易遭受跨站脚本攻击。现在用户使用 Unix 权限检查来加强套接字的访问安全。

用户仍可以利用 HTTP 提供 REST API 访问。建议使用安全机制,确保只有可信的网络或 VPN,或证书保护机制(例如受保护的 stunnel 和 ssl 认证)下的访问可以进行。此外,还可以使用 HTTPS 和证书来加强保护。

最后,建议采用专用的服务器来运行 Docker 和相关的管理服务。其它的业务服务都放到容器中去运行。

内核能力机制

默认情况下,Docker 启动的容器被严格限制只允许使用内核的一部分能力。

为了加强安全,容器可以禁用一些没必要的权限:

  • 完全禁止任何 mount 操作;
  • 禁止直接访问本地主机的套接字;
  • 禁止访问一些文件系统的操作,比如创建新的设备、修改文件属性等;
  • 禁止模块加载。

默认情况下,Docker 采用白名单机制,禁用必需功能之外的其它权限。

总结

总体来看,Docker 容器还是十分安全的,特别是在容器内不使用 root 权限来运行进程的话。

另外,用户可以使用现有工具,比如 Apparmor、SELinux、GRSEC 来增强安全性;甚至自己在内核中实现更复杂的安全机制。


点赞 取消点赞 收藏 取消收藏

<< 上一篇: Docker Swarm

>> 下一篇: Docker 底层实现原理