安全似乎落后于Docker陣營在其他方面的發(fā)展步伐。雖然越來越多的企業(yè)在數(shù)據(jù)中心使用Docker,但管理員們用來保護(hù)容器的技術(shù)卻完全是慢慢站穩(wěn)腳跟。在許多情況下,正是當(dāng)初讓Docker大受歡迎的功能特性恰恰也暴露了安全漏洞(見圖1)。
圖1:Docker網(wǎng)站稱贊其容器是即刻奏效的解決方案。
什么是沒有隔離的內(nèi)核?
Docker依賴Linux內(nèi)核的功能:建立相互隔離的環(huán)境(應(yīng)用程序在里面運(yùn)行)。這些容器很精簡,因?yàn)樗鼈児蚕硗粌?nèi)核,卻在不同的運(yùn)行時(shí)環(huán)境中執(zhí)行,這歸功于控制組(cgroup)和命名空間,它們定義了容器可以使用哪些資源。與此同時(shí),容器本身只能看到某些進(jìn)程和網(wǎng)絡(luò)功能。
雖然攻擊者難以從一個(gè)被劫持的虛擬機(jī)與主機(jī)的內(nèi)核進(jìn)行交互,但容器隔離并不提供同樣的防御。除了/sys和/proc外,攻擊者還照樣可以進(jìn)入內(nèi)核的關(guān)鍵子系統(tǒng),比如SELinux和控制組,這意味著攻擊者有可能避開主機(jī)的安全功能特性。與此同時(shí),容器使用與主機(jī)系統(tǒng)同樣的用戶命名空間。換句話說,如果進(jìn)程以根權(quán)限在容器中運(yùn)行,它與內(nèi)核或掛載的文件系統(tǒng)交互時(shí),保留這些權(quán)限。因而,管理員還是別以根權(quán)限在容器中運(yùn)行軟件為妙;實(shí)際上,很少需要這樣。
風(fēng)險(xiǎn):Docker的守護(hù)進(jìn)程
然而,Docker守護(hù)進(jìn)程需要根權(quán)限。它管理主機(jī)上的容器,需要與提供隔離環(huán)境的內(nèi)核進(jìn)行對(duì)話。與守護(hù)進(jìn)程進(jìn)行交互的用戶因而被授予了訪問系統(tǒng)的權(quán)限。如果主機(jī)托管服務(wù)提供商通過Web界面將容器作為一個(gè)自助服務(wù)選項(xiàng)來提供,這種情形會(huì)來得尤其嚴(yán)重。
雖然使用docker群組是個(gè)辦法,但不太可能改善安全,因?yàn)槿航M成員可以構(gòu)建容器;而在容器中,首先可以運(yùn)行根外殼,其次可以掛載主機(jī)的根文件系統(tǒng)。這里的唯一辦法就是,嚴(yán)格監(jiān)管對(duì)Docker服務(wù)的訪問,避免不需要的權(quán)限升級(jí)。
此外,Docker的守護(hù)進(jìn)程可以通過HTTP(S),借助REST API進(jìn)行聯(lián)系。如果你使用這項(xiàng)功能,就需要限制只由可信賴網(wǎng)絡(luò)才可以訪問API,或者通過SSL客戶端證書或之類的機(jī)制來限制訪問。
對(duì)策
新版本的Docker隨帶減小上述攻擊場(chǎng)景帶來的影響的功能特性。Docker以只讀方式掛載/sys文件系統(tǒng)和/proc中的重要文件。容器無法寫入到它們,因而防止容器中的權(quán)限進(jìn)程操縱主機(jī)系統(tǒng)。
內(nèi)核將根權(quán)限細(xì)分成了幾項(xiàng)功能,然后將這些功能逐個(gè)分配給了進(jìn)程。默認(rèn)情況下,Docker阻止重要功能,防止容器中的權(quán)限進(jìn)程為非作歹。這些功能包括網(wǎng)絡(luò)配置、裝入內(nèi)核模塊的功能或者訪問音頻子系統(tǒng)。如果某個(gè)特殊的應(yīng)用程序需要被阻止的功能,Docker允許這些功能供某個(gè)容器使用。
SELinux局限性
SELinux是一種安全框架,它給每個(gè)文件和每個(gè)進(jìn)程分配了多部分標(biāo)簽(multipart label)。策略定義了哪個(gè)進(jìn)程標(biāo)簽可以訪問哪個(gè)文件標(biāo)簽。Docker支持兩個(gè)變種:類型強(qiáng)制(type enforcement)和多類別安全(MCS)。
類型強(qiáng)制限制了容器對(duì)主機(jī)文件系統(tǒng)的訪問。所有容器進(jìn)程都以同一種類型來運(yùn)行,這樣就可以訪問容器中的文件和許多主機(jī)系統(tǒng)文件,但是又可以防止訪問主機(jī)上的大多數(shù)文件夾(即/var、/root和/home)。
如果只使用類型強(qiáng)制,容器就能夠輕松訪問其他容器中的數(shù)據(jù)。歸功于MCS,容器啟動(dòng)時(shí),SELinux為容器分配了隨機(jī)的MCS標(biāo)簽;Docker守護(hù)進(jìn)程用這個(gè)標(biāo)簽標(biāo)記容器中的所有文件,而內(nèi)核可防止使用不同MCS標(biāo)簽的進(jìn)程訪問容器中的文件。
在許多企業(yè),SELinux已被認(rèn)為是一項(xiàng)不需要的功能特性,也是管理員們喜歡禁用的一項(xiàng)特性。然而,Docker容器的安全依賴安全虛擬化(sVirt)之類的功能特性。在幾乎沒有其他應(yīng)用程序幫助的情況下,單單sVirt就足以防止來自其他容器的用戶讀取你的文件。
未來
就未來而言,Docker開發(fā)人員在計(jì)劃增強(qiáng)容器的安全性和隔離性。三項(xiàng)功能特性會(huì)助一臂之力,包括用戶命名空間、Seccomp,以及基于角色的訪問控制(RBAC),加強(qiáng)對(duì)Docker守護(hù)進(jìn)程的訪問。
用戶命名空間獲得了優(yōu)先權(quán)。Docker將來自容器的用戶ID與其他主機(jī)的ID對(duì)應(yīng)起來。其想法是大大限制攻擊屬于根目錄的文件的能力。
由于所有容器都與同一個(gè)內(nèi)核對(duì)話,內(nèi)核功能方面的一個(gè)錯(cuò)誤對(duì)主機(jī)和容器之間的邊界以及對(duì)容器本身之間的邊界來說都是致命的。來自谷歌的Seccomp可防止進(jìn)程對(duì)特定系統(tǒng)調(diào)用的訪問。雖然進(jìn)程使用系統(tǒng)調(diào)用來訪問內(nèi)核,但在600個(gè)可用調(diào)用中大多數(shù)很少用到。要是沒有這些調(diào)用,有望減小潛在的攻擊面。Daniel Walsh在紅帽公司從事容器安全工作。他認(rèn)為,開發(fā)人員有望將可調(diào)用系統(tǒng)調(diào)用的數(shù)量最多減少50%。
此外,開發(fā)人員在期望完善對(duì)Docker服務(wù)的訪問,補(bǔ)充驗(yàn)證選項(xiàng)。這么做意味著,并沒有根授權(quán)以訪問主機(jī)的用戶可以使用這項(xiàng)服務(wù)。如果開發(fā)人員另外引入RBAC,Docker管理員就能為用戶分配不同的角色,因而為他們提供與守護(hù)進(jìn)程進(jìn)行交互的受限制權(quán)限。在這些方案的幫助下,應(yīng)該可以在未來進(jìn)一步限制對(duì)容器或功能的訪問。
結(jié)束語
Docker開發(fā)人員已經(jīng)在許多方面積極響應(yīng),加強(qiáng)容器的安全,他們?cè)诶^續(xù)添加新的功能特性,保持這個(gè)勢(shì)頭。最近為版本1.8中的Docker映像推出了一種驗(yàn)證系統(tǒng),那就是內(nèi)容信任(Content Trust)。此外,開放容器計(jì)劃(Open Container Initiative)正考慮將更多的精力投入到安全方面上。
未來仍需要做大量工作。比如說,需要定義容器管理方面可持續(xù)的最佳實(shí)踐,以促進(jìn)容器在企業(yè)得到更廣泛的使用。
原文標(biāo)題:Improving Docker security now and in the future