本系列教程翻译自 Flux7 Docker Tutorial Series,系列共有九篇,本文译自第五篇 。
该系列所有文章将参考其他学习资料翻译,也会加入自己的学习作为部分注解。如有错误,欢迎指正。
题外话:本文所讲的是传统意义上的 Docker 安全,关于未来 Docker 的安全可以 。
Docker 安全
安全问题必须要被高度重视,无论是开发环境还是生产环境。如今 Docker 已经被部署在越来越多的地方,Docker 作为项目和平台的安全性也越来越要被重视。
因此,本系列教程关键的第五章用来讨论 Docker 可能面临的安全问题以及它们是如何影响到 Docker 整体的安全性的。但并不是说 Docker 本身不安全:Docker 是建立在 LXC 的基础上的,因此 Docker 继承了 LXC 绝大部分安全优势。
前文中提到 docker run
是用来运行容器的,那么 docker run
之后到底发生了什么?
docker run
命令初始化Docker 调用
lxc-start
命令。lxc-start
创建一系列的 namespaces 和 CGroups 进行资源限制。
namespace 是虚拟化的第一层,用于容器以及容器内之间互相隔离。所有的容器都有独立的网络栈、一个容器也无法访问到另一个容器的 Socket 端口。如果你希望容器之间通过网络互访的话,就要开启 Docker 的端口映射功能,或者为容器指定公网 IP。
CGroup 有如下的特点:
资源计数和资源控制。
限制内存、CPU、IO 和网络使用。
试图解决 Dos 攻击问题。
更适用于多用户、多进程的系统。
对于 namespace 和 CGroups 不熟悉的童鞋可以参考这么几篇文章:
Docker Daemon 的攻击层面
Docker daemon 使用 root 权限运行,肯定需要有许多地方需要特别注意,例如:
如果 Docker 容器有权限访问宿主机的话,那么要特别小心,Docker 进程的控制权只能给授权用户。举个极端的例子:容器内部的 UID=0 如果对容器外部某个不明程序执行了
chmod +s
。REST API 也支持 UNIX socket,从而避免了 XSS 攻击。
REST API 的 HTTP 端口(如果有的话)只能对可信的网络、VPN、IP 开放。
在服务器上运行 Docker 时需要与其他服务隔离。
一些必要的安全措施包括:
使用非特权用户运行容器。
Apparmor,SELinux,grsec 都可以当成是一层额外的安全加固。
可以使用其他容器系统的安全功能。
Docker.io API
本图中列举了几个用于维护和授权的安全性 Docker API。
本专栏将会在以后的文章中慢慢介绍现在的 Docker API。