作者:Daniel Walsh
Daniel Walsh 在计算机安全领域有30年的工作敬仰。他 2001年8月加入红帽。 Dan 自从2013年开始 领导RHEL的Docker方面的工作,但是在这之前,他已经从事容器方面的工作很多年了。他曾经带领过Selinux项目,侧重于 应用程序空间及策略的开发。Dan 帮助过开发sVirt ( Secure Vitrualization)。 也曾经创建过SELinux 沙箱, Xguest 用户和Secure Kiosk. 在这之情,Dan 为Netect 工作。
这篇文章基于 talk I gave at DockerCon this year. 主要讨论docker容器技术的安全问题。
Docker是真正的沙箱?
我曾经听到很多人认为docker容器是真正的沙箱,可以随意在其中使用root运行各种应用,认为docker容器可以保护他们的系统。
- 我听很多人说,docker容器可以像VMs/KMV一样的安全运行应用。
- 我听很多人说,可以网络上下载 docker镜像,在本地运行。
- 我甚至看到PasS服务器允许用户上传并运行自己的镜像。
- 我的一个伙伴说,Docker就是从网络上下载任意的代码并在容器内以root运行。
请不要有 Docker和Linux内核会保护你免受恶意软件攻击的想法。
你在乎么?
如果你的容器不是运行在一个多用户环境,或者你只是在做一些Docker容器的练习,你可能不需要担心。你只需要知道,有些进程在容器内外,具有相同特权。
有些人错误的认为容器时最好的最快的方式来运行虚拟机。其实,从安全角度来讲,容器不同于虚拟机,它的安全性很低。在下面我会详细说明。
请你相信我,Docker容器更应该被当作一种系统服务(docker 服务)。运行在docker中的apache服务跟运行在主机中的apache服务并没有什么区别。这意味这,在docker中运行服务,你需要做这些。
- 在容器中,抛弃特权
- 任何时候都不用使用root运行应用
- 把container中的root当作本地root来对待
不要在系统上运行来源不可靠镜像。在很多方面,docker容器技术革命就像1999年的linux变革一样。在那时候,当linux管理员听到一个新的很酷的linux服务,他们会
- 从网络搜索包, 如:rpmfind.net 或者其他的任意网站
- 下载应用到自己系统
- 安装RPM包或者make install应用
- 然后使用root运行这个程序
这就是为什么红帽和其它可信的伙伴建立分发领域的原因。 红帽公司给管理员提供:
- 一个可信软件下载仓库
- 对各种弱点的安全更新
- 一个负责任的团队管理缺陷
- 团队的工程师管理维护软件包和并工作的安全领域,提升系统安全
- 遵循统一标准检查系统保证造作系统安全
仅仅相信来源可信的docker 镜像, 你可以继续从可信的老朋友那里获取代码和包。如果代码不是来自于内部或者守信的第三方,请不要相信容器技术会保护你的机器。
那么为什么呢?
最大的原因是:并不是所有的资源在linux中都已经被namespace化. 当前,docker使用五个namespaces来隔离系统,他们分别是:进程,网络,挂载,机器名,和共享内存。
KVM 的进程访问的是VMs Kernel而不是 host Kernel。进程如果想到达VM之外,权限提升并不容易. 进程首先需要突破VM的内核,还需要在host系统进程找到弱点,突破SELinux 控制,然后才能攻击host。
但是当你在容器中时,这样的攻击将变的很容易,因为你可以直接访问host内核
大部分的linux 内核子系统,并没有像下面资源一样已经被namespace化
- SELinux
- Cgroups
- file systems under /sys
- /proc/sys, /proc/sysrq-trigger, /proc/irq, /proc/bus
很多设备没有被namespace化,像:
- /dev/mem
- /dev/sd* file system devices
- Kernel Modules
如果你以root身份攻击这些没有被namespace化的设备,你很容易获得host的root权限。