Docker 容器真的安全么?
2015-07-07 14:25
609 查看
作者: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容器可以像VMs/KMV一样的安全运行应用。
我听很多人说,可以网络上下载 docker镜像,在本地运行。
我甚至看到PasS服务器允许用户上传并运行自己的镜像。
我的一个伙伴说,Docker就是从网络上下载任意的代码并在容器内以root运行。
请不要有 Docker和Linux内核会保护你免受恶意软件攻击的想法。
有些人错误的认为容器时最好的最快的方式来运行虚拟机。其实,从安全角度来讲,容器不同于虚拟机,它的安全性很低。在下面我会详细说明。
请你相信我,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权限。
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权限。
相关文章推荐
- docker设置并运行部分命令及原文
- CentOS7中Docker文件挂载,容器中没有执行权限
- Docker 快速入门使用
- Docker为容器分配指定物理网段的静态IP
- 使用Docker部署Gitlab
- docker学习笔记
- 学习 Docker - 入门
- Ubuntu 12.04 LTS安装Docker
- 使用Docker、CoreOS、Mesos部署可扩展的Web应用
- ubuntu15.04中的docker...2
- Docker build报错FATA[0000]
- 利用Docker建立服务器和docker容器的监视系统
- Docker 开发实践
- 初始docker(三)
- Docker学习笔记 — Swarm搭建Docker集群
- jenkins script call docker
- ubuntu15.04中的docker...1
- CentOS7安装Docker,运行Nginx镜像、Centos镜像
- docker安装升级linux内核(2.6.32->3.10.81),安装成功!
- Centos 7安装Docker