Docker安全(翻譯)

當我們提到Docker安全時,主要考慮四個方面:

內核本身的安全性和內核對namespace和cgroup的支持;

Docker Deamon 本身的攻擊面

默認的或是用戶定製的配置文件的漏洞

“固化的”內核安全功能,以及他們如何同容器交互

 

內核的命名空間

Docker容器與LXC容器非常像,他們有相同的安全功能。當你使用docker run 命令開啓一個容器時,其實Docker爲容器創建了一系列的namespace和controlgroup。

Namespace提供了最初最直接的隔離形式:當你在容器中運行一個進程,其它容器或者host系統中的進程不可見甚至不會受其影響。

 

每個容器有其自己的網絡協議棧,這意味着一個容器不會得到權限去訪問其它容器的socket和接口。當然,如果host系統做了相應的設置,那麼容器間可以的接口可以彼此交互——就像他們可以和外部host交互一樣。當你爲你的容器指定一個公共接口或者或使用鏈接,那麼容器之間就可以出現IP的交通(IP traffic),他們可以互相ping通,或者收發UDP數據包、建立TCP 鏈接,但在需要的時候可以限制他們。從一個網絡架構的觀點來看,Docker提供的所有的容器都與網橋的對應接口相連。這意味着他們就像物理機通過以太網交換機相連一樣,不多也不少。

由代碼提供的內核namespace和私有網絡有多成熟呢?在內核版本2.6.15至2.6.26時引入namespaces。這說明自從2008年6月就已經實施了namespace的代碼,並經過了大量的系統產品的檢查。甚至,設計和創造namespace代碼的時間就更長了。Namespaces的確是一個合併於主流操作系統的重新實現OpenVZ特徵方法。OpenVZ最早於2005年發行,所以namespace的設計和實行都十分成熟了。

 

Controlgroups(控制組)

Controlgroups是Linux Container(Linux容器)的關鍵組件。他們實現了資源統計和限制。他們提供了許多有用的metrics(韻律?),但是也確實幫助每個容器可以公平的分享內存、CPI、磁盤讀寫等等。更爲重要的是,單獨一個容器不能消耗所有的資源後使計算機宕機。

所以他們無法避免一個容器中的數據被其他容器訪問,但是他們主要可以避免拒絕服務攻擊(DOS)。尤其在多租戶系統中他們顯得尤爲有用,例如私有或公有PaaS,甚至在有應用出現誤操作時,來保證連續的運行(和性能)。

ControlGroups也運行了很長的時間,從2006年起,最早被整合在2.6.24內核中。

 

 

DockerDaemon攻擊面

運行中的容器(和應用)意味着Docker Daemon也在運行。這個Daemon當前要求root權限,並且你應該注意一些重要的細節。

首先,只有你信任的用戶才允許控制你的Docker Daemon。這直接導致一些有效地Docker特性。特別得,Docker允許Dockerhost和容器共享目錄;這允許你做不受容器訪問權限控制的操作。這意味着你可以將 / 路徑設爲/host 然後開啓容器,那麼容器就可以不受限制地訪問你的主機文件系統。這很像虛擬系統允許文件系統資源共享。沒有人阻攔你和虛擬機分享你的根文件系統甚至塊設備。

這是一個強烈的安全隱患:例如,如果你在web服務器通過一個API來部署容器,你應該比平時檢查參數時更小心,確定是否有禁止惡意用戶自己設定參數來隨意創建容器。

出於這個原因,REST API終端(用於DcokerCLI和Docker Daemon通信)在Docker0.5.2時改進,現在使用了UNIXsocket而不是使用與127.0.0.1綁定的TCPsocket(後者易於跨站請求僞造攻擊,如果直接在主機上運行Docker)。你可以使用傳統的UNIX授權檢查來限制控制socket(controlsocket)。

如果你的確確定的話,你也可以使用RST API 而不是http。然而如果你這麼做,要意識到上述的安全隱患,你應該確保只能接收到可信的網絡或VPN;或者保護比如stunnl和SSL證書。你也可以通過HTTPS和證書來保護他們。

Daemon也有可能被其他輸入攻擊,比如使用docker load從磁盤load圖片,或從其他網站使用docker pull。截至Docker1.3.2,在Linux、Unix平臺上,鏡像現在被取至chroot,這是將權限分開的有重要意義的第一步。截至Docker1.10.0,所有的鏡像訪問時加密他的內容的checksum(all images are stored andaccessed by the cryptographic checksums of their contents),用於限制攻擊者破壞一個已有的鏡像。

甚至,Dcoker Daemon會被限制運行權限,代表操作會被子進程仔細檢查Linux的容量、網絡設置,文件系統管理,等等。也就是說,Docker引擎本身可能運行於容器之中。

最後,如果您在服務器上運行Docker,則建議在服務器上專門運行Docker,並將所有其他服務移動到由Docker控制的容器中。當然,它會很好地保留你的管理工具,(可能至少是一個SSL服務),和存在的監視器、監管進程,比如NRPE(Nagios Remote Plugin Executor)和collected.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章