高洪涛 译 分布式实验室
Docker容器的一个整洁之处在于它们是不可变的。 Docker附带一个写入时复制文件系统,这意味着基本映像不能被修改,除非你显式地做一个提交。
这么做的原因之一是你很容易检查偏差,如果试图调查一个安全事件,这可能会派上用场。
演示应用程序
以下面的演示架构为例:
我们有一个在前端运行的PHP应用程序(https://github.com/diogomonica/apachehackdemo),以及一个充当我们的后端数据库的MySQL服务器。你可以执行下面的命令:
➜ docker run -d --name db -e MYSQL_ROOT_PASSWORD=insecurepwd mariadb ➜ docker run -d -p 80:80 --link db:db diogomonica/phphack
当你已经运行了数据库和前端,你应该可以看到如下的页面:
不幸的是,并不像别的正常的PHP应用程序,这个应用程序有一个远程代码执行漏洞:
if($links) { Links found ... eval($_GET['shell']); ?>
它看起来像有人在使用本不该被使用的eval
!任何***者都可以利用此漏洞,并在远程主机上执行任意命令:
➜ curl -s http://localhost/\?shell\=system\("id"\)\; | grep "uid=" uid=33(www-data) gid=33(www-data) groups=33(www-data)
任何***者对被***的主机做的第一个操作是下载PHP shell和工具包。有些***者甚至可能会重新改造你的网站:
从被黑中恢复回来
回到不变性,写时拷贝文件系统提供的一个很酷的事情是能够看到发生的所有更改。通过使用docker diff
命令,我们可以看到***者对文件的所有修改:
➜ docker diff pensive_meitner C /run C /run/apache2 A /run/apache2/apache2.pid C /run/lock C /run/lock/apache2 C /var C /var/www C /var/www/html C /var/www/html/index.html A /var/www/html/shell.php
很有趣。似乎***者不仅修改了我们的index.html
,而且还下载了一个php-shell
,命名为shell.php
。但我们的重点应该是让网站恢复回来并重新上线。
我们通过做一个docker提交来存储这个镜像以供后续做分析,并且由于容器是不可变的,我们可以重新启动我们的容器,让业务继续提供服务:
➜ docker commit pensive_meitner sha256:ebc3cb7c3a312696e3fd492d0c384fe18550ef99af5244f0fa6d692b09fd0af3 ➜ docker kill pensive_meitner ➜ docker run -d -p 80:80 --link db:db diogomonica/phphack
我们现在可以回到保存的镜像,看看***者修改了什么
➜ docker run -it ebc3cb7c3a312696e3fd492d0c384fe18550ef99af5244f0fa6d692b09fd0af3 sh # cat index.htmlHACKED BY SUPER ELITE GROUP OF HACKERS # cat shell.php
这看起来像是我们刚刚被著名的超级精英集团***(SUPER ELITE GROUP OF HACKERS)***了。
增加******成本
在被***后查看***内容是一个很实用的功能,但是如何才能避免被***?这个时候--read-only
就要发挥作用了。
--read-only
会让Docker不允许任何在容器的file-system内进行写入操作。它可以避免index.php
被修改,更重要的是,它不会允许***者下载php shell,以及任何其他对于***者来说有用的工具。
我们下面来试验一下:
➜ docker run -p 80:80 --link db:db -v /tmp/apache2:/var/run/apache2/ -v /tmp/apache:/var/lock/apache2/ --sig-proxy=false --read-only diogomonica/phphack ... 172.17.0.1 - - [04/Sep/2016:03:59:06 +0000] "GET / HTTP/1.1" 200 219518 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48" sh: 1: cannot create index.html: Read-only file system
由于我们的文件系统现在是只读状态,因此***者无法修改index.html 。
这个方法能完全阻止***吗?
肯定是不可以的。在我们能够修复RCE漏洞之前,***者依然可以在host上运行代码,偷取我们的权限,在数据库中盗取数据。
但是尽管如此,我们毕竟通过组合最小化镜像和一些非常酷的Docker安全功能提升了***的***难度,让系统变得更安全了一些。
总结
我们的应用程序的安全性永远不会是完美的,但是具有不可变的基础架构有助于事件响应,允许快速恢复,并使***者的成本加大。
如果通过使用强大的沙箱和调整一些旋钮,你可以使你的应用程序更安全,你为什么不?