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