原文譯自:http://opensource.com/business/14/7/docker-security-selinuxnode
這篇文章基於我今年在DockerCon一個講座,它將討論咱們當前聽到的Docker容器的安全問題.linux
容器並不"包容"
我聽到也讀到不少假定Docker容器是應用沙盒的觀點--這意味着他們可以在他們的系統上使用有根權限的Docker來執行隨意的程序. 他們相信Docker容器將會保護他們的主機系統.docker
- 我聽到人們說Docker容器就像在VMs/KVM執行程序同樣安全
- 我知道人們在隨意的下載Docker鏡像而後在他們的主機上執行
- 我甚至看到PaaSserver(不是OpenShift)贊成用戶上傳他們本身的鏡像執行在多租戶系統上
- 我有一個同事說道: Docker就是從網上下載隨意的代碼並以root模式執行
"你要來個人客廳嗎", 蜘蛛對蝴蝶說道.
中止這樣的設爲Docker和Linux會保護你免於惡意軟件的想法吧!
你在意嗎?
假設你不在一個多租戶系統裏執行Docker,並且你對執行在容器裏的服務使用良好的安全策略,那你基本上不需要操心.只假定執行在容器裏的特權進程就像在容器外的特權進程同樣.
一些人錯誤的以爲容器是一種比虛擬機更好更快的方式,但從安全的角度來看,容器更脆弱,這點我將在文章的後面說明.
假設你相信我說的,Docker容器應該被視做"容器服務"-這意味着你要把執行Apache的容器看做在你的Host系統上執行的Apache服務,這就是說你要:
- 儘快的減小特權
- 儘量以非root模式執行你的服務
- 將容器裏的root模式視爲容器外的root模式
眼下咱們正在通用規範中告訴人們把容器的特權進程當在容器外的特權進程.
不要在你的系統裏執行隨意的Docker鏡像,我從不少方面看到Docker容器革命相似於1999年的Linux革命,那時當一個管理員聽到一個新的很是酷的Linux服務時,他們會:安全
- 去rpmfind.net和其它一些站點上去搜索包
- 下載這些包
- 經過RPM或make install來安裝
- 以管理者模式運行
會出什麼問題?
兩週後管理員聽到一個zlib的脆弱性問題並不得不指出( 他們但願並祈禱不是), 軟件是不安全的!網絡
這就是Red Hat發行版和其它一些值得信賴的第三方介入並解救他們的時刻, Red Hat的企業版Linux給管理員提供了:spa
- 一個提供下載的安全的repository
- 安全的升級來修復問題
- 發現問題並修復的團隊
- 管理/維護/安全加強的project師團隊
- 通用的認證標準來檢查OS的安全性問題
僅僅執行從可信賴組織得到的容器,我相信你應該繼續從一樣的人那邊得到代碼/包,就像你曾經作的同樣.假設代碼不從那邊來, 不要相信容器技術會保護你的主機.
因此問題是什麼? 爲何容器並不"包容"?
最大的問題就是Linux的一切都不是命名空間 (namespaced). 現在, Docker使用5個命名空間來改變系統的進程: 進程, 網絡, Mount, 主機名,共享內存.
儘管有給用戶必定的安全級別, 但沒法像KVM實施全面的安全保護. 在KVM環境下進程不直接和主機的內核交互.它們也不訪問內核的文件系統如/sys和/sys/fs, /proc/*
設備結點是用於和VMs 內核交互的,而不是主機.所以, 想要越過VM來擴展特權級別, 進程要去攻擊VM內核,找到HyperVisor的弱點,打破SELinux的控制(sVirt),終於攻擊主機的內核.
當你執行在一個容器裏時,你就已經直接可以和主機的內核打交道了..net
沒有被當成命名空間的基本的內核子系統如:server
- SELinux
- Cgroups
- /sys下的文件系統
- /proc/sys, /proc/sysrq-trigger, /proc/irq, /proc/bus
沒有被當成命名空間的設備:
- /dev/mem
- /dev/sd* 文件系統設備
- 內核模塊
假設經過一個特權進程對以上的某個模塊通訊或攻擊的話,你就擁有了整個系統.進程