Docker如何改變?cè)朴?jì)算安全?
譯文
自云計(jì)算問世以來,人們就一直對(duì)云計(jì)算技術(shù)的安全性持有懷疑態(tài)度。一提到多租戶模式:你可能與陌生人在同一個(gè)物理硬件上,即便服務(wù)提供商承諾采用虛擬機(jī)來隔離,也是如此,人們總是想到安全災(zāi)難。
時(shí)間證明,虛擬機(jī)確實(shí)提供了一層有效的隔離;更多的公司每天在采用虛擬機(jī)。Docker容器就好比微型虛擬機(jī)。比如說,如果一臺(tái)服務(wù)器上可以運(yùn)行10個(gè)虛擬機(jī),同樣這臺(tái)服務(wù)器上可以運(yùn)行100個(gè)、甚至1000個(gè)Docker容器。
壞消息是,默認(rèn)狀態(tài)下的Docker其安全性不如虛擬機(jī)和大多數(shù)云計(jì)算技術(shù)。由于多個(gè)Docker容器共享一個(gè)Linux內(nèi)核,內(nèi)核漏洞可能導(dǎo)致特權(quán)升級(jí)攻擊方面存在更大的風(fēng)險(xiǎn)。通俗地說,Docker使用多租戶模式是個(gè)壞主意,因?yàn)槿萜髦g沒有足夠的固有隔離,無法完全確保一個(gè)用戶根本無法訪問另一個(gè)用戶的容器。
現(xiàn)在有不少辦法可以緩解這種風(fēng)險(xiǎn)。比如說,如果使用安全增強(qiáng)Linux(即SELinux,最初由NSA開發(fā)),即便Linux內(nèi)核遭到危及,在容器外面肆意妄為的能力也很有限。但是完善這種辦法卻困難重重。
減小受攻擊面
好消息是,Docker采用共享式Linux內(nèi)核的架構(gòu)實(shí)際上讓你能夠?yàn)殚_發(fā)的Linux應(yīng)用程序大大減小受攻擊面。如果你在開發(fā)并不需要多租戶模式的技術(shù)(比如為銀行、零售商和在線商家開發(fā)的軟件),實(shí)際上可以通過采用Docker來增強(qiáng)安全性。
如何實(shí)現(xiàn)?如果你從一款為Docker開發(fā)的簡(jiǎn)約版Linux操作系統(tǒng)(比如開源CoreOS)開始入手,就能減少主機(jī)系統(tǒng)上面臨的潛在攻擊途徑。CoreOS擯棄了Linux的大多數(shù)特性和功能,包括apt-get和yum之類的程序包管理器。要是不使用Docker,就很難將外部代碼安裝到CoreOS上。比如說,如果你想要安裝Apache,就必須通過拉取里面有Apache的Docker容器才能安裝上去。
這個(gè)要求減少了一系列受攻擊面,因?yàn)闊o意中在Docker主機(jī)上運(yùn)行不安全的代碼變得極其困難。但是如果你將CoreOS與一項(xiàng)名為“臨時(shí)映像”(sratch image)的特殊的Docker特性結(jié)合起來,安全方面的好處變得還要明顯。
臨時(shí)映像是最簡(jiǎn)約的Docker容器。它里面到底有什么東西呢?絕對(duì)是什么都沒有。它是用一個(gè)空的打包文件創(chuàng)建而成的。不僅沒有Apache,連二進(jìn)制代碼都根本沒有創(chuàng)建。這個(gè)無二進(jìn)制代碼的磁盤映像概念在虛擬機(jī)上不可能實(shí)現(xiàn),因?yàn)樘摂M機(jī)并不共享Linux內(nèi)核,這意味著虛擬機(jī)需要隨帶各自的二進(jìn)制代碼,才能正常運(yùn)行。
眼下使用經(jīng)過編譯的Go二進(jìn)制代碼構(gòu)建單單一套二進(jìn)制代碼的Docker容器方面在開展令人關(guān)注的工作。這種工作顯著減小了Docker容器本身里面的受攻擊面。比如說,如果你在臨時(shí)映像里面運(yùn)行你的應(yīng)用程序代碼,就沒必要擔(dān)心Bash Shellshock這個(gè)軟件錯(cuò)誤(bug)。那是由于你首先并不壓根在容器里面使用bash命令。Linux內(nèi)核本身成了唯一有可能的操作系統(tǒng)層面(非網(wǎng)絡(luò)層面)的攻擊途徑。
為Docker化的應(yīng)用程序確保安全的若干原則
如果你將CoreOS等簡(jiǎn)約的操作系統(tǒng)和SELinux以及臨時(shí)映像結(jié)合起來,就能擯棄那些可能被人鉆空子的不必要的技術(shù)。與大多數(shù)Linux發(fā)行版捆綁了大量不必要的工具不同,如果使用Docker,你就能創(chuàng)建經(jīng)過精細(xì)調(diào)整、異常高效的基礎(chǔ)設(shè)施集群,攻擊途徑比較少。
如果你將該方法與Docker公司打算未來一年推出的網(wǎng)絡(luò)層安全特性結(jié)合起來,那么部署的Docker化的應(yīng)用程序其安全性就會(huì)大大加強(qiáng)。
當(dāng)然了,如果你在Docker里面構(gòu)建的應(yīng)用程序本身存在安全漏洞,這個(gè)方法沒有太大幫助,而有時(shí)候,未知因素卻是最讓我們擔(dān)憂不止的隱患。還有多少Heartbleeds和Shellshocks位于完全沒有被發(fā)現(xiàn)的/usr/bin中呢?
布加迪編譯