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