Docker 容器真的安全么?

来源:互联网 发布:淘宝开店未认证 编辑:程序博客网 时间:2024/05/21 11:35

作者: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内和运行的docker之外的进程。

不要在系统上运行来源不可靠镜像。在很多方面,docker容器技术革命就像1999年的linux变革一样。在那时候,当linux管理员听到一个新的很酷的linux服务,他们会
  • 从网络搜索包, 如:rpmfind.net 或者其他的任意网站
  • 下载应用到自己系统
  • 安装RPM包或者make install应用
  • 然后使用root运行这个程序
两周之后,管理员听说下载的程序有安全隐患,当期望不会对系统产生影响的时候,他们的系统已经受到入侵


这就是为什么红帽和其它可信的伙伴建立分发领域的原因。 红帽公司给管理员提供:

  • 一个可信软件下载仓库
  • 对各种弱点的安全更新
  • 一个负责任的团队管理缺陷
  • 团队的工程师管理维护软件包和并工作的安全领域,提升系统安全
  • 遵循统一标准检查系统保证造作系统安全

仅仅相信来源可信的docker 镜像, 你可以继续从可信的老朋友那里获取代码和包。如果代码不是来自于内部或者守信的第三方,请不要相信容器技术会保护你的机器。

那么为什么呢?

最大的原因是:并不是所有的资源在linux中都已经被namespace化. 当前,docker使用五个namespaces来隔离系统,他们分别是:进程,网络,挂载,机器名,和共享内存。

这些提升了docker系统的安全性。但这并不是全部,不同于 KVM, 不允许直接和系统内核对话,kvm内进程不允许访问内核文件系统,像 /sys and/sys/fs, /proc/* 等。
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权限。

0 0
原创粉丝点击