本文譯自Docker官方文檔:https://docs.docker.com/articles/security/
在審查Docker的安全時(shí),需要斟酌3個(gè)主要方面:
?容器內(nèi)在的安全性,由內(nèi)核命名空間和cgroup中實(shí)現(xiàn);
?docker守護(hù)程序本身的攻擊面;
?加固內(nèi)核安全特性,和它們?nèi)绾闻c容器中互動(dòng)。
Docker容器中非常類(lèi)似LXC容器,并且它們都具有類(lèi)似的安全功能。當(dāng)您以“docker run”啟動(dòng)1個(gè)容器,后臺(tái)Docker為容器創(chuàng)建1組命名空間和控制組的集合。
命名空間提供隔離的最初也是最簡(jiǎn)單的情勢(shì):1個(gè)容器中運(yùn)行的進(jìn)程看不到運(yùn)行在另外一個(gè)容器中或在主機(jī)系統(tǒng)中的進(jìn)程,乃至它們之間更少的影響,。
每一個(gè)容器也都有自己的網(wǎng)絡(luò)協(xié)議棧,這意味著容器沒(méi)有得到特權(quán)訪問(wèn)另外一個(gè)容器的套接字或接口。固然,如果主機(jī)系統(tǒng)是設(shè)置因此,容器中可以相互通過(guò)各自的網(wǎng)絡(luò)接口進(jìn)
行交互 - 就像他們可以與外部的主機(jī)進(jìn)行交互。當(dāng)您為您的容器中或使用鏈路指定公共端口則IP通訊允許容器之間。他們可以相互ping通,發(fā)送/接收UDP數(shù)據(jù)包,并建立
TCP連接,但可以在必要時(shí)會(huì)遭到限制。從1個(gè)網(wǎng)絡(luò)架構(gòu)來(lái)看,給定Docker主機(jī)上的所有容器都坐在橋接接口。這意味著,他們只是想通過(guò)1個(gè)普通的以太網(wǎng)交換機(jī)連接的物
理機(jī)器;不多,不會(huì)少。
代碼是如何成熟提供內(nèi)核命名空間和專(zhuān)用網(wǎng)絡(luò)??jī)?nèi)核命名空間的內(nèi)核版本2.6.15和2.6.26之間進(jìn)行了介紹。這意味著,自2008年7月(2.6.26發(fā)布日期,現(xiàn)在5年前),命名
空間代碼已實(shí)行和審查上有大量的生產(chǎn)系統(tǒng)。還有更多:設(shè)計(jì)靈感的命名空間代碼,乃至更老。命名空間實(shí)際上是為了重新實(shí)現(xiàn)的,由于它們可能被主流內(nèi)核內(nèi)合并這樣
的方式的OpenVZ的特性。OpenVZ的最初發(fā)布于2005年,所以在設(shè)計(jì)和履行都相當(dāng)做熟。
控制組是Linux的容器的另外一重要組成部份。他們實(shí)行資源核算和限制。他們提供了很多非常有用的指標(biāo),但他們也有助于確保每一個(gè)容器取得其公平的內(nèi)存,CPU,磁盤(pán)同享
I/O;并且,更重要的是,1個(gè)單1的容器不能用盡這些資源中的1個(gè)而使系統(tǒng)癱瘓。
因此,雖然它們不起到避免1個(gè)容器訪問(wèn)或影響數(shù)據(jù)和另外一個(gè)容器的進(jìn)程的作用,它們是必不可少的,以抵擋謝絕服務(wù)的1些攻擊。他們是在多租戶(hù)平臺(tái),像公共和私有
PaaS尤其重要,以保證正常運(yùn)行時(shí)間1致(和性能),即便1些利用開(kāi)始胡作非為。
控制組已存在了1段時(shí)間,和:代碼在2006年已開(kāi)始,并在內(nèi)核2.6.24開(kāi)始合并。
運(yùn)行容器(和利用程序)與Docker意味著運(yùn)行Docker守護(hù)進(jìn)程。此守護(hù)進(jìn)程目前需要root權(quán)限,因此,你應(yīng)當(dāng)知道的1些重要的細(xì)節(jié)。
首先,只有受信任的用戶(hù)應(yīng)當(dāng)可以控制你的Docker守護(hù)進(jìn)程。這是直接造成1些強(qiáng)大的Docker功能。具體來(lái)講,Docker可讓你分享的Docker主體和客體容器之間的目錄;它
允許你這樣做不限制容器的訪問(wèn)權(quán)限。這意味著,你可以開(kāi)始1個(gè)容器,其中/host目錄將是你的主機(jī)上的/目錄下;并且容器將能夠改變你的主機(jī)文件系統(tǒng)沒(méi)有任何限制。這
聽(tīng)起來(lái)很瘋狂?好吧,你要知道,所有的虛擬化系統(tǒng)允許文件系統(tǒng)資源同享的行動(dòng)方式相同。沒(méi)有甚么能禁止你從1個(gè)虛擬機(jī)同享您的根文件系統(tǒng)(乃至是你的root塊裝備
)。
這具有很強(qiáng)的安全性含義:例如,如果從通過(guò)API的Web服務(wù)器來(lái)提供容器中工具Docker,你應(yīng)當(dāng)比平常使用參數(shù)檢查多加謹(jǐn)慎,以確保歹意用戶(hù)沒(méi)法通過(guò)精雕細(xì)琢的參數(shù)引
起Docker創(chuàng)建任意容器。
出于這個(gè)緣由,所述的REST API端點(diǎn)(所使用的DockerCLI與Docker守護(hù)程序進(jìn)行通訊)中Docker0.5.2改變,現(xiàn)在采取的是UNIX套接字代替結(jié)合在127.0.0.1 TCP套接字(后
者是容易跨站點(diǎn)腳本攻擊,如果你碰巧直接在本地計(jì)算機(jī)上運(yùn)行Docker,1個(gè)VM以外)。然后,您可使用傳統(tǒng)的UNIX權(quán)限檢查限制訪問(wèn)控制套接字。
您也能夠通過(guò)暴露在HTTP REST API,如果你明確決定等。但是,如果你這樣做,意想到上述的安全含義,你應(yīng)當(dāng)確保它會(huì)到達(dá)只能從1個(gè)可信任的網(wǎng)絡(luò)或VPN;或受保護(hù)的如
與安全通道和客戶(hù)真?zhèn)€SSL證書(shū)。你也能夠保證他們HTTPS和證書(shū)。
在Linux的命名空間中的最新改進(jìn)將很快允許沒(méi)有root權(quán)限運(yùn)行全功能的容器中,這要?dú)w功于新的用戶(hù)空間。這是覆蓋在這里詳細(xì)。另外,這將解決由同享主機(jī)和客戶(hù)之間的
文件系統(tǒng)的問(wèn)題,由于用戶(hù)命名空間允許容器(包括root用戶(hù))內(nèi)的用戶(hù)被映照到在主機(jī)系統(tǒng)的其他用戶(hù)。
因此,終究目標(biāo)是Docker要實(shí)現(xiàn)兩個(gè)額外的安全性改進(jìn):
?映照容器的root用戶(hù)的Docker主機(jī)的非root用戶(hù),以減少容器到主機(jī)的權(quán)限提升的效果;
? 允許docker守護(hù)程序沒(méi)有root權(quán)限運(yùn)行,并拜托操作要求這些特權(quán)和審計(jì)的子流程,每一個(gè)都有自己的(非常有限)適用范圍:虛擬網(wǎng)絡(luò)設(shè)置,文件系統(tǒng)管理,等等。
最后,如果在服務(wù)器上運(yùn)行Docker,建議以在服務(wù)器上運(yùn)行專(zhuān)門(mén)Docker,并且通過(guò)Docker控制容器中內(nèi)移動(dòng)的所有其他服務(wù)。固然,這是好的,讓您最喜歡的管理工具(可
能最少SSH服務(wù)器),和現(xiàn)有的監(jiān)測(cè)/監(jiān)控進(jìn)程(例如,NRPE,collectd等)。
默許情況下,Docker開(kāi)始容用具有非常有限的功能集。這意味著甚么?
功能打開(kāi)2進(jìn)制“root/非root”2分法成細(xì)粒度的訪問(wèn)控制系統(tǒng)。進(jìn)程(如Web服務(wù)器),僅僅需要綁定低于1024的端口上沒(méi)有以root身份運(yùn)行:他們可以被授與
net_bind_service能力來(lái)代替。而且還有很多其他功能,幾近所有的地方,通常都需要root權(quán)限的具體領(lǐng)域。
這意味著許多為docker的安全;讓我們來(lái)看看為何!
1般的服務(wù)器(裸機(jī)或虛擬機(jī))都需要運(yùn)行1堆流程作為root。這些通常包括SSH,cron,syslogd;硬件管理工具(如加載模塊),網(wǎng)絡(luò)配置工具(如處理DHCP,WPA或VPN)
的,等等。容器是非常不同的,由于幾近所有的這些任務(wù)由容器周?chē)幕A(chǔ)設(shè)施進(jìn)行處理:
?SSH訪問(wèn)通常由Docker主機(jī)運(yùn)行的單個(gè)服務(wù)器進(jìn)行管理;
?cron,必要的時(shí)候,應(yīng)當(dāng)運(yùn)行作為1個(gè)用戶(hù)進(jìn)程,敬業(yè),專(zhuān)為需要它的調(diào)度服務(wù),而不是作為1個(gè)平臺(tái)性的裝備利用程序;
?日志管理層也通常會(huì)被交給Docker,或由第3方服務(wù),如Loggly或Splunk的;
?硬件管理是無(wú)關(guān)緊要的,這意味著你永久不需要容器中運(yùn)行udevd會(huì)或同等守護(hù)進(jìn)程;
?網(wǎng)絡(luò)管理產(chǎn)生在容器外,履行的盡量多的分離關(guān)注點(diǎn),這意味著容器不應(yīng)當(dāng)需要履行ifconfig,route,或IP命令(除當(dāng)1個(gè)容器是專(zhuān)為像1個(gè)路由器或防火墻,固然
)。
這意味著,在大多數(shù)情況下,容器將不會(huì)在所有需要的“真實(shí)”root特權(quán)。因此,容器可使用減少的能力集運(yùn)行;這意味著“root”在1個(gè)容器內(nèi)具有比真實(shí)的“root”少很多特
權(quán)。例如,它是可能的:
?謝絕所有“裝載”操作;
?謝絕訪問(wèn)原始套接字(避免數(shù)據(jù)包欺騙);
?謝絕訪問(wèn)某些文件系統(tǒng)操作,如創(chuàng)建新的裝備節(jié)點(diǎn),改變文件的所有者,或改變屬性(包括不可變標(biāo)志);
?謝絕模塊加載;
?和等等。
這意味著,即便入侵者想法升級(jí)到root的容器內(nèi),這將是非常困難做嚴(yán)重破壞,或升級(jí)到主機(jī)。
這不會(huì)影響常規(guī)的網(wǎng)絡(luò)利用;但歹意的用戶(hù)會(huì)發(fā)現(xiàn),軍工廠在他們的處置大幅降落!默許情況下,Docker滴除那些需要的,白名單,而不是黑名單的方式全部功能。你可以
看到在Linux中提供聯(lián)機(jī)幫助功能的完全列表。
固然,你可以隨時(shí)啟用額外的功能,如果你真的需要它們(舉例來(lái)講,如果你想使用FUSE為基礎(chǔ)的文件系統(tǒng)),但默許情況下,Docker容器使用默許的核心能力,只有白名
單。
Capabilities 能力是現(xiàn)代Linux內(nèi)核提供了許多安全特性之1。另外,也能夠利用現(xiàn)有的,公知的系統(tǒng),如TOMOYO,AppArmor,SELinux,GRSEC等使用Docker。
而Docker目前只允許功能,它不干擾其它系統(tǒng)。這意味著,有許多不同的方式來(lái)加固Docker主機(jī)。下面是1些例子。
?您可以運(yùn)行GRSEC和PAX內(nèi)核。這將增加很多安全檢查,不管是在編譯時(shí)和運(yùn)行時(shí);它也將打敗很多漏洞,這要?dú)w功于像地址隨機(jī)化技術(shù)。它不需要Docker特定的配置中,由
于這些安全功能適用全系統(tǒng),獨(dú)立的容器中。
?如果你的發(fā)行版自帶的Docker容器安全模型模板,你可使用它們的開(kāi)箱即用。舉例來(lái)講,推出1個(gè)與AppArmor工作和Red Hat自帶SELinux策略Docker的模板。這些模板提
供了1個(gè)額外的安全網(wǎng)(即便它大大堆疊使用能力)。
?您可使用自己喜歡的訪問(wèn)控制機(jī)制,定義自己的策略。
就像有許多第3方工具來(lái)增強(qiáng)Docker容器如特殊的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)或同享文件系統(tǒng),你可以期望看到的工具來(lái)強(qiáng)化現(xiàn)有的Docker容器,而不會(huì)影響Docker的核心。
Docker容器,默許情況下,相當(dāng)安全的;特別是如果你把你的運(yùn)行進(jìn)程容器非特權(quán)用戶(hù)內(nèi)部的護(hù)理(即非root)。
您可以通過(guò)啟用AppArmor中,SELinux,GRSEC,或你最喜歡的加固解決方案中添加額外的安全層。
最后但并不是最不重要的,如果你看到在其他容器化系統(tǒng),有趣的安全功能,您將能夠?qū)崿F(xiàn)它們,和使用Docker,由于1切不管如何都是由內(nèi)核提供。
欲了解更多情況下,特別是與虛擬機(jī)和其他容器系統(tǒng)的比較,也請(qǐng)看到原來(lái)的博客文章:http://blog.docker.com/2013/08/containers-docker-how-secure-are-they/。