主頁(yè) > 知識(shí)庫(kù) > 對(duì)于Docker使用的一些安全配置建議

對(duì)于Docker使用的一些安全配置建議

熱門標(biāo)簽:Win7旗艦版 網(wǎng)站建設(shè) 電話銷售團(tuán)隊(duì) 話術(shù) AI人工智能 電銷行業(yè) 電話外呼服務(wù) 太平洋壽險(xiǎn)電話營(yíng)銷

介紹

相信很多開(kāi)發(fā)者都默認(rèn)Docker這樣的容器是一種沙盒(sandbox)應(yīng)用,也就是說(shuō)他們可以用root權(quán)限在Docker中運(yùn)行隨便什么應(yīng)用,而Docker有安全機(jī)制能保護(hù)宿主系統(tǒng)。比如,有些人覺(jué)得Docker容器里面的進(jìn)程跟虛擬機(jī)里面的進(jìn)程一樣安全;還有的人隨便找個(gè)源就下載沒(méi)有驗(yàn)證過(guò)的Docker鏡像,看都不看內(nèi)容就在宿主機(jī)器上嘗試、學(xué)習(xí)和研究;還有一些提供PaaS服務(wù)的公司竟然允許用戶向多租戶系統(tǒng)中提交自己定制的Docker鏡像。請(qǐng)注意,上述行為均是不安全的。

 本文將介紹Docker的隔離性和安全性,以及為什么它在隔離和安全性上不如傳統(tǒng)的虛擬機(jī)。
何謂安全性?

單單就Docker來(lái)說(shuō),安全性可以概括為兩點(diǎn):

    不會(huì)對(duì)主機(jī)造成影響
    不會(huì)對(duì)其他容器造成影響

所以安全性問(wèn)題90%以上可以歸結(jié)為隔離性問(wèn)題。而Docker的安全問(wèn)題本質(zhì)上就是容器技術(shù)的安全性問(wèn)題,這包括共用內(nèi)核問(wèn)題以及Namespace還不夠完善的限制:

    /proc、/sys等未完全隔離
    Top, free, iostat等命令展示的信息未隔離
    Root用戶未隔離
    /dev設(shè)備未隔離
    內(nèi)核模塊未隔離
    SELinux、time、syslog等所有現(xiàn)有Namespace之外的信息都未隔離

當(dāng)然,鏡像本身不安全也會(huì)導(dǎo)致安全性問(wèn)題。
真的不如虛擬機(jī)安全?

其實(shí)傳統(tǒng)虛擬機(jī)系統(tǒng)也絕非100%安全,只需攻破Hypervisor便足以令整個(gè)虛擬機(jī)毀于一旦,問(wèn)題是有誰(shuí)能隨隨便便就攻破嗎?如上所述,Docker的隔離性主要運(yùn)用Namespace 技術(shù)。傳統(tǒng)上Linux中的PID是唯一且獨(dú)立的,在正常情況下,用戶不會(huì)看見(jiàn)重復(fù)的PID。然而在Docker采用了Namespace,從而令相同的PID可于不同的Namespace中獨(dú)立存在。舉個(gè)例子,A Container 之中PID=1是A程序,而B Container之中的PID=1同樣可以是A程序。雖然Docker可透過(guò)Namespace的方式分隔出看似是獨(dú)立的空間,然而Linux內(nèi)核(Kernel)卻不能Namespace,所以即使有多個(gè)Container,所有的system call其實(shí)都是通過(guò)主機(jī)的內(nèi)核處理,這便為Docker留下了不可否認(rèn)的安全問(wèn)題。

傳統(tǒng)的虛擬機(jī)同樣地很多操作都需要通過(guò)內(nèi)核處理,但這只是虛擬機(jī)的內(nèi)核,并非宿主主機(jī)內(nèi)核。因此萬(wàn)一出現(xiàn)問(wèn)題時(shí),最多只影響到虛擬系統(tǒng)本身。當(dāng)然你可以說(shuō)黑客可以先Hack虛擬機(jī)的內(nèi)核,然后再找尋Hypervisor的漏洞同時(shí)不能被發(fā)現(xiàn),之后再攻破SELinux,然后向主機(jī)內(nèi)核發(fā)動(dòng)攻擊。文字表達(dá)起來(lái)都嫌繁復(fù),更何況實(shí)際執(zhí)行?所以Docker是很好用,但在遷移業(yè)務(wù)系統(tǒng)至其上時(shí),請(qǐng)務(wù)必注意安全性!

如何解決?

在接納了“容器并不是全封閉”這種思想以后,開(kāi)源社區(qū)尤其是紅帽公司,連同Docker一起改進(jìn)Docker的安全性,改進(jìn)項(xiàng)主要包括保護(hù)宿主不受容器內(nèi)部運(yùn)行進(jìn)程的入侵、防止容器之間相互破壞。開(kāi)源社區(qū)在解決Docker安全性問(wèn)題上的努力包括:

    Audit namespace
        作用:隔離審計(jì)功能
        未合入原因:意義不大,而且會(huì)增加audit的復(fù)雜度,難以維護(hù)。
    Syslognamespace
         作用:隔離系統(tǒng)日志
        未合入原因:很難完美的區(qū)分哪些log應(yīng)該屬于某個(gè)container。
    Device namespace
        作用:隔離設(shè)備(支持設(shè)備同時(shí)在多個(gè)容器中使用)
        未合入原因:幾乎要修改所有驅(qū)動(dòng),改動(dòng)太大。
    Time namespace
        作用:使每個(gè)容器有自己的系統(tǒng)時(shí)間
        未合入原因:一些設(shè)計(jì)細(xì)節(jié)上未達(dá)成一致,而且感覺(jué)應(yīng)用場(chǎng)景不多。
    Task count cgroup
        作用:限制cgroup中的進(jìn)程數(shù),可以解決fork bomb的問(wèn)題
        未合入原因:不太必要,增加了復(fù)雜性,kmemlimit可以實(shí)現(xiàn)類似的效果。(最近可能會(huì)被合入)
    隔離/proc/meminfo的信息顯示
        作用:在容器中看到屬于自己的meminfo信息
        未合入原因:cgroupfs已經(jīng)導(dǎo)出了所有信息,/proc展現(xiàn)的工作可以由用戶態(tài)實(shí)現(xiàn),比如fuse。

不過(guò),從08年cgroup/ns基本成型后,至今還沒(méi)有新的namespace加入內(nèi)核,cgroup在子系統(tǒng)上做了簡(jiǎn)單的補(bǔ)充,多數(shù)工作都是對(duì)原有subsystem的完善。內(nèi)核社區(qū)對(duì)容器技術(shù)要求的隔離性,本的原則是夠用就好,不能把內(nèi)核搞的太復(fù)雜。

一些企業(yè)也做了很多工作,比如一些項(xiàng)目團(tuán)隊(duì)采用了層疊式的安全機(jī)制,這些可選的安全機(jī)制具體如下:

1、文件系統(tǒng)級(jí)防護(hù)

    文件系統(tǒng)只讀:有些Linux系統(tǒng)的內(nèi)核文件系統(tǒng)必須要mount到容器環(huán)境里,否則容器里的進(jìn)程就會(huì)罷工。這給惡意進(jìn)程非常大的便利,但是大部分運(yùn)行在容器里的App其實(shí)并不需要向文件系統(tǒng)寫入數(shù)據(jù)?;谶@種情況,開(kāi)發(fā)者可以在mount時(shí)使用只讀模式。比如下面幾個(gè): /sys 、/proc/sys 、/proc/sysrq-trigger 、 /proc/irq、/proc/bus
    寫入時(shí)復(fù)制(Copy-On-Write):Docker采用的就是這樣的文件系統(tǒng)。所有運(yùn)行的容器可以先共享一個(gè)基本文件系統(tǒng)鏡像,一旦需要向文件系統(tǒng)寫數(shù)據(jù),就引導(dǎo)它寫到與該容器相關(guān)的另一個(gè)特定文件系統(tǒng)中。這樣的機(jī)制避免了一個(gè)容器看到另一個(gè)容器的數(shù)據(jù),而且容器也無(wú)法通過(guò)修改文件系統(tǒng)的內(nèi)容來(lái)影響其他容器。

2、Capability機(jī)制

Linux對(duì)Capability機(jī)制闡述的還是比較清楚的,即為了進(jìn)行權(quán)限檢查,傳統(tǒng)的UNIX對(duì)進(jìn)程實(shí)現(xiàn)了兩種不同的歸類,高權(quán)限進(jìn)程(用戶ID為0,超級(jí)用戶或者root),以及低權(quán)限進(jìn)程(UID不為0的)。高權(quán)限進(jìn)程完全避免了各種權(quán)限檢查,而低權(quán)限進(jìn)程則要接受所有權(quán)限檢查,會(huì)被檢查如UID、GID和組清單是否有效。從2.2內(nèi)核開(kāi)始,Linux把原來(lái)和超級(jí)用戶相關(guān)的高級(jí)權(quán)限劃分成為不同的單元,稱為Capability,這樣就可以獨(dú)立對(duì)特定的Capability進(jìn)行使能或禁止。通常來(lái)講,不合理的禁止Capability,會(huì)導(dǎo)致應(yīng)用崩潰,因此對(duì)于Docker這樣的容器,既要安全,又要保證其可用性。開(kāi)發(fā)者需要從功能性、可用性以及安全性多方面綜合權(quán)衡Capability的設(shè)置。目前Docker安裝時(shí)默認(rèn)開(kāi)啟的Capability列表一直是開(kāi)發(fā)社區(qū)爭(zhēng)議的焦點(diǎn),作為普通開(kāi)發(fā)者,可以通過(guò)命令行來(lái)改變其默認(rèn)設(shè)置。

3、NameSpace機(jī)制

Docker提供的一些命名空間也從某種程度上提供了安全保護(hù),比如PID命名空間,它會(huì)將全部未運(yùn)行在開(kāi)發(fā)者當(dāng)前容器里的進(jìn)程隱藏。如果惡意程序看都看不見(jiàn)這些進(jìn)程,攻擊起來(lái)應(yīng)該也會(huì)麻煩一些。另外,如果開(kāi)發(fā)者終止pid是1的進(jìn)程命名空間,容器里面所有的進(jìn)程就會(huì)被全部自動(dòng)終止,這意味著管理員可以非常容易地關(guān)掉容器。此外還有網(wǎng)絡(luò)命名空間,方便管理員通過(guò)路由規(guī)則和iptable來(lái)構(gòu)建容器的網(wǎng)絡(luò)環(huán)境,這樣容器內(nèi)部的進(jìn)程就只能使用管理員許可的特定網(wǎng)絡(luò)。如只能訪問(wèn)公網(wǎng)的、只能訪問(wèn)本地的和兩個(gè)容器之間用于過(guò)濾內(nèi)容的容器。

4、Cgroups機(jī)制

主要是針對(duì)拒絕服務(wù)攻擊。惡意進(jìn)程會(huì)通過(guò)占有系統(tǒng)全部資源來(lái)進(jìn)行系統(tǒng)攻擊。Cgroups機(jī)制可以避免這種情況的發(fā)生,如CPU的cgroups可以在一個(gè)Docker容器試圖破壞CPU的時(shí)候登錄并制止惡意進(jìn)程。管理員需要設(shè)計(jì)更多的cgroups,用于控制那些打開(kāi)過(guò)多文件或者過(guò)多子進(jìn)程等資源的進(jìn)程。

5、SELinux

SELinux是一個(gè)標(biāo)簽系統(tǒng),進(jìn)程有標(biāo)簽,每個(gè)文件、目錄、系統(tǒng)對(duì)象都有標(biāo)簽。SELinux通過(guò)撰寫標(biāo)簽進(jìn)程和標(biāo)簽對(duì)象之間訪問(wèn)規(guī)則來(lái)進(jìn)行安全保護(hù)。它實(shí)現(xiàn)的是一種叫做MAC(Mandatory Access Control)的系統(tǒng),即對(duì)象的所有者不能控制別人訪問(wèn)對(duì)象。
安全建議

最簡(jiǎn)單的就是不要把Docker容器當(dāng)成可以完全替代虛擬機(jī)的東西。跑在Docker容器中的應(yīng)用在很長(zhǎng)一段時(shí)間內(nèi)都將會(huì)是選擇性的,通常只跑測(cè)試系統(tǒng)或可信業(yè)務(wù)。

門檻再高一點(diǎn),我們對(duì)系統(tǒng)做減法,通過(guò)各種限制來(lái)達(dá)到安全性。這也是最主流的、有效的安全加固方法,比如上一章節(jié)介紹的幾種安全機(jī)制。同時(shí)一定要保證內(nèi)核的安全和穩(wěn)定。外部工具的監(jiān)控、容錯(cuò)等系統(tǒng)也必不可少。

總之通過(guò)適配、加固的Docker容器方案,在安全性上完全可以達(dá)到商用標(biāo)準(zhǔn)。就是可能對(duì)實(shí)施人員的技術(shù)要求和門檻較高。

標(biāo)簽:南昌 寧夏 延安 普洱 漯河 云南 儋州 宿州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《對(duì)于Docker使用的一些安全配置建議》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266