?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
在審查Docker安全性時,需要考慮四個主要方面:
內核的內在安全性及其對命名空間和cgroups的支持;
Docker守護進程本身的攻擊面;
容器配置文件中的漏洞,默認情況下或用戶自定義時。
內核的“hardening”安全功能以及它們如何與容器交互。
Docker容器與LXC容器非常相似,并且它們具有類似的安全功能。當你啟動一個容器時docker run
,Docker會在后臺創(chuàng)建一組容器的命名空間和控制組。
命名空間提供了第一個也是最直接的隔離形式:在容器中運行的進程看不到,甚至更少影響在另一個容器或主機系統(tǒng)中運行的進程。
每個容器也都有自己的網(wǎng)絡堆棧,這意味著容器不會獲得對另一個容器的套接字或接口的特權訪問。當然,如果主機系統(tǒng)相應設置,容器可以通過各自的網(wǎng)絡接口相互交互 - 就像他們可以與外部主機進行交互一樣。當您為容器指定公共端口或使用鏈接時,容器之間允許IP流量。它們可以互相ping通,發(fā)送/接收UDP數(shù)據(jù)包,并建立TCP連接,但如果需要可以限制它們。從網(wǎng)絡體系結構的角度來看,給定Docker主機上的所有容器都位于網(wǎng)橋接口上。這意味著它們就像通過普通以太網(wǎng)交換機連接的物理機器一樣; 不多也不少。
提供內核命名空間和專用網(wǎng)絡的代碼有多成熟?在內核版本2.6.15和2.6.26之間引入了內核命名空間。這意味著自2008年7月(2.6.26發(fā)布日期)以來,命名空間代碼已在大量生產(chǎn)系統(tǒng)上得到運用和審查。還有更多:命名空間代碼的設計和靈感甚至更老。命名空間實際上是為了重新實現(xiàn)OpenVZ的功能,以便它們可以在主流內核中合并。OpenVZ最初于2005年發(fā)布,因此設計和實現(xiàn)都相當成熟。
控制組是Linux容器的另一個關鍵組件。他們實施資源會計和限制。它們提供了許多有用的度量標準,但它們也有助于確保每個容器獲得其公平的內存,CPU和磁盤I/O份額; 更重要的是,單個容器不能耗盡這些資源中的一個來降低系統(tǒng)的性能。
因此,盡管它們不能阻止一個容器訪問或影響另一個容器的數(shù)據(jù)和進程,但它們對抵御一些拒絕服務攻擊至關重要。它們對于多租戶平臺尤其重要,例如公共和私有PaaS,即使在某些應用程序開始出現(xiàn)故障時也能保證一致的正常運行時間(和性能)。
控制組也有一段時間了:代碼是在2006年開始的,最初被合并到內核2.6.24中。
使用Docker運行容器(和應用程序)意味著運行Docker守護進程。這個守護進程當前需要root
特權,因此你應該知道一些重要的細節(jié)。
首先,應該只允許受信任的用戶來控制你的Docker守護進程。這是一些強大的Docker功能的直接后果。具體來說,Docker允許您在Docker主機和訪客容器之間共享一個目錄; 它允許您在不限制容器訪問權限的情況下這樣做。這意味著您可以啟動一個容器,其/host
目錄將成為/
主機上的目錄; 容器將能夠不受任何限制地改變你的主機文件系統(tǒng)。這與虛擬化系統(tǒng)如何允許文件系統(tǒng)資源共享類似。沒有什么能夠阻止你與虛擬機共享你的根文件系統(tǒng)(甚至你的根塊設備)。
這具有很強的安全意義:例如,如果您通過Web服務器來監(jiān)控Docker以通過API配置容器,則應該比平時更加仔細地進行參數(shù)檢查,以確保惡意用戶無法傳遞制作的參數(shù),從而導致Docker創(chuàng)建任意容器。
出于這個原因,Docker 0.5.2中更改了REST API端點(由Docker CLI用于與Docker守護進程通信),現(xiàn)在使用UNIX套接字而不是127.0.0.1上綁定的TCP套接字(后者容易發(fā)生如果您碰巧在您的本地機器上直接運行Docker,而不是在虛擬機之外),則可以發(fā)起跨站請求偽造攻擊。然后,您可以使用傳統(tǒng)的UNIX權限檢查來限制對控制套接字的訪問。
如果您明確決定這么做,您還可以通過HTTP公開REST API。但是,如果您這樣做,意識到上述安全隱含意義,則應確保它只能從可信網(wǎng)絡或VPN訪問; 或受到例如stunnel
和客戶端SSL證書的保護。您還可以使用HTTPS和證書保護他們。
守護進程也可能容易受到其他輸入的影響,例如從磁盤docker load
或從網(wǎng)絡加載磁盤的映像docker pull
。從Docker 1.3.2開始,圖像現(xiàn)在在Linux/Unix平臺的chrooted子進程中提取,這是實現(xiàn)特權分離更廣泛工作的第一步。從Docker 1.10.0開始,所有圖像都通過其內容的加密校驗和進行存儲和訪問,從而限制了攻擊者與現(xiàn)有圖像發(fā)生沖突的可能性。
最終,預計Docker守護進程將運行受限特權,將操作委托給審核良好的子進程,每個子進程都有其自己的(非常有限的)Linux功能范圍,虛擬網(wǎng)絡設置,文件系統(tǒng)管理等。也就是說,大多數(shù)很可能,Docker引擎本身的部分將運行在容器內部。
最后,如果您在服務器上運行Docker,則建議在服務器上專門運行Docker,并將所有其他服務移動到由Docker控制的容器中。當然,保留你最喜歡的管理工具(可能至少是一個SSH服務器)以及現(xiàn)有的監(jiān)控/監(jiān)督流程(如NRPE和collectd)是很好的。
默認情況下,Docker使用一組受限制的功能啟動容器。那是什么意思?
功能將二元“root/non-root”二分法轉變?yōu)橐粋€細粒度的訪問控制系統(tǒng)。只需要在1024以下的端口上綁定的進程(如Web服務器)不必以root用戶身份運行:他們可以net_bind_service
改為授予權限。對于幾乎所有需要root權限的特定領域,還有許多其他功能。
這對于容器安全意義重大。讓我們看看為什么!
您的平均服務器(裸機或虛擬機)需要以root身份運行一系列進程。那些通常包括SSH,cron,syslogd; 硬件管理工具(例如加載模塊),網(wǎng)絡配置工具(例如處理DHCP,WPA或VPN)等等。容器是非常不同的,因為幾乎所有這些任務都由容器周圍的基礎設施處理:
SSH訪問通常由Docker主機上運行的單個服務器管理;
cron
在必要時應該作為用戶進程運行,專門針對需要其調度服務的應用程序專門定制,而不是作為平臺范圍的設施;
日志管理通常也會交給Docker,或者由Loggly或Splunk等第三方服務提供;
硬件管理是無關緊要的,這意味著你永遠不需要udevd
在容器中運行或等效的守護進程;
網(wǎng)絡管理發(fā)生在容器的外面,執(zhí)行關注點分離盡可能的,這意味著一個容器不應該需要執(zhí)行ifconfig
,route
或IP命令(當容器被特別設計,以表現(xiàn)得象一個路由器或防火墻除外,當然) 。
這意味著,在大多數(shù)情況下,容器將不再需要“真正的” root特權可言。因此,集裝箱可以運行一個能力較低的集合;這意味著容器中的“根”比真正的“根”要少得多。例如,有可能:
否認所有“mount”操作;
拒絕訪問原始套接字(以防止數(shù)據(jù)包欺騙);
拒絕訪問某些文件系統(tǒng)操作,如創(chuàng)建新設備節(jié)點,更改文件所有者或更改屬性(包括不可變標志);
拒絕模塊加載;
和其他許多。
這意味著即使入侵者設法在容器內升級到根目錄,對于造成嚴重破壞或升級到主機也將變得更加困難。
這不會影響常規(guī)的網(wǎng)絡應用程序; 但惡意用戶會發(fā)現(xiàn)他們可以使用的武器庫大大縮??!默認情況下,Docker將刪除除所需功能之外的所有功能,即白名單而不是黑名單方法。您可以在Linux手冊頁中看到完整的可用功能列表。
運行Docker容器的一個主要風險是給容器默認的一組功能和掛載可能會獨立提供不完全的隔離,或者與內核漏洞結合使用。
Docker支持添加和刪除功能,允許使用非默認配置文件。這可能會通過刪除功能使Docker更安全,或者通過增加功能降低Docker的安全性。對于用戶來說,最好的做法是去除除了他們的進程明確需要的所有功能。
功能只是現(xiàn)代Linux內核提供的眾多安全功能之一。還可以利用Docker等現(xiàn)有知名系統(tǒng),如TOMOYO,AppArmor,SELinux,GRSEC等。
雖然Docker目前僅支持功能,但不會干擾其他系統(tǒng)。這意味著有很多不同的方法來加固Docker主機。這里有一些例子。
您可以使用GRSEC和PAX運行內核。這將在編譯時和運行時增加許多安全檢查; 它也會擊敗許多漏洞,這要歸功于地址隨機化等技術。它不需要特定于Docker的配置,因為這些安全特性適用于系統(tǒng)范圍,獨立于容器。
如果您的發(fā)行版帶有Docker容器的安全模型模板,您可以直接使用它們。例如,我們發(fā)布了一個可與AppArmor配合使用的模板,而Red Hat提供了適用于Docker的SELinux策略。這些模板提供了一個額外的安全網(wǎng)(盡管它與功能重疊)。
您可以使用您最喜歡的訪問控制機制來定義自己的策略。
就像有很多第三方工具來擴充Docker容器,例如特殊網(wǎng)絡拓撲或共享文件系統(tǒng)一樣,您可以期望看到工具來強化現(xiàn)有的Docker容器,而不會影響Docker的核心。
從Docker 1.10起,Docker守護進程直接支持用戶命名空間。此功能允許將容器中的根用戶映射到容器外部的非uid-0用戶,這有助于減輕容器突破的風險。該工具可用,但默認情況下不啟用。
有關此功能的更多信息,請參閱命令行參考中的守護程序命令。有關Docker中用戶命名空間實現(xiàn)的其他信息可以在此博客文章中找到。
默認情況下,Docker容器非常安全; 特別是如果你照顧在容器內運行你的進程作為非特權用戶(即非root
)。
您可以通過啟用AppArmor,SELinux,GRSEC或您最喜歡的強化解決方案來添加額外的安全層。
最后但并非最不重要的一點是,如果您在其他集裝箱系統(tǒng)中看到有趣的安全功能,這些內核功能也可能在Docker中實現(xiàn)。我們歡迎用戶提交問題,提出請求并通過郵件列表進行溝通。
使用可信映像
Seccomp Docker的安全配置文件
適用于Docker的AppArmor安全配置文件
關于集裝箱安全(2014年)
Docker群集模式覆蓋網(wǎng)絡安全模型