运维实战 容器部分 Docker安全
理解Docker安全
由于Docker
与传统虚拟化不同, 并不是完全隔离, 因此其安全性也是常被诟病的一点.
要做到相对安全的隔离就应该先了解Docker
安全相关的知识.
Docker容器的安全性, 很大程度上依赖于Linux系统自身, 评估Docker的安全性时, 主要考虑以下几个方面:
Linux
内核的命名空间机制提供的容器隔离安全Linux
控制组机制对容器资源的控制能力安全Linux
内核的能力机制所带来的操作权限安全Docker
程序(特别是服务端)本身的抗攻击性- 其他安全增强机制对容器安全性的影响
命名空间隔离的安全
-
当启动一个容器时,
Docker
将在后台为容器创建一个独立的命名空间. 命名空间提供了最基础也最直接的隔离. -
与虚拟机方式相比, 通过
Linux namespace
来实现的隔离不是那么彻底. -
容器只是运行在宿主机上的一种特殊的进程, 那么多个容器之间使用的就还是同一个宿主机的操作系统内核.
-
Docker
目前能够Namespace
化的资源只有6种. 在Linux
内核中, 仍旧有许多资源不能被Namespace
化, 比如系统时间, 内存信息等等.
控制组资源控制的安全
- 当启动一个容器时,
Docker
会在后台为容器创建一个独立的控制组策略集合. Linux
的Cgroups
特性提供了很多有用的特性支持, 这确保各容器可以公平地分享主机的内存、CPU
、磁盘IO
等资源.- 在考虑
Docker
安全性时, “确保容器内发生的资源压力不会影响到本地物理主机系统和其他容器” 这一思想是必不可少的.这在防止拒绝服务攻击 (DDoS) 方面能起到一定作用.
考虑内核能力机制
-
能力机制 (Capability) 是
Linux
内核一个强大的特性, 可以提供细粒度的权限访问控制. -
大部分情况下, 容器并不需要"真正的"
root
权限, 容器只需要少数的能力即可.实际上, 默认设置下在容器中看到的root
权限也并不完全具有我们一般意义上认为的操作系统root
权限. -
默认情况下,
Docker
采用"白名单"机制, 禁用"必需功能"之外的其他权限.
Docker服务端防护
- 既然
Docker
的安全性很大程度上依托于宿主机的安全性, 尽可能控制其对宿主机的影响以及宿主机本身的访问控制就是很重要一环了. - 保证只有可信用户可以访问
Docker
服务, 这一操作可以从源头降低出现安全风险的问题. - 为
Docker
分配专门的非root
用户, 并将容器的root
用户映射到专用用户上, 采用对该用户的权限控制降低容器和主机间因权限可能导致的安全问题出现的概率. - 允许
Docker
服务在非root
权限下运行, 采用安全可靠的子进程来代理执行那些需要特权权限的操作.
其他安全特性
- 采用具有安全特性的模板进行容器构建.
- 可以自定义更加严格的访问控制机制来提升安全性.
- 当需要挂载文件系统到容