Docker數(shù)據(jù)安全隱患分析
Docker容器為應(yīng)用的編寫、分發(fā)和部署帶來真正翻天覆地的變化。容器的目的是靈活性,讓應(yīng)用可按需啟用,無論何時(shí)以及何地。當(dāng)然無論我們?cè)谀睦锸褂脩?yīng)用,我們都需要數(shù)據(jù)。
對(duì)于數(shù)據(jù)應(yīng)該如何映射到容器主要有兩個(gè)流派。***個(gè)流派稱我們將數(shù)據(jù)保留在容器中;第二個(gè)稱我們?cè)谌萜魍獗4?**性數(shù)據(jù),這些數(shù)據(jù)可超越任何單個(gè)容器的使用壽命。在這兩種情況下,安全問題給數(shù)據(jù)和容器管理帶來大問題。
▲Image: Pexels/Pixabay
管理數(shù)據(jù)訪問
現(xiàn)在有很多技術(shù)可用于分配存儲(chǔ)到Docker容器。臨時(shí)存儲(chǔ)容量,本地到運(yùn)行容器的主機(jī),可在運(yùn)行時(shí)分配到容器。存儲(chǔ)卷存儲(chǔ)在映射到應(yīng)用的特定子目錄的主機(jī)內(nèi)。卷可在容器實(shí)例化時(shí)創(chuàng)建,或者使用“docker volume”命令提前創(chuàng)建。
另外,本地存儲(chǔ)可作為安裝點(diǎn)映射到容器。在這種情況下,“docker run”命令可指定本地目錄作為容器內(nèi)的安裝點(diǎn)。第三種選擇是使用存儲(chǔ)插件直接關(guān)聯(lián)外部存儲(chǔ)與容器。
開放訪問
在每種方法中,Docker框架都沒有提供針對(duì)數(shù)據(jù)的內(nèi)在安全模型。例如,任何主機(jī)目錄可安裝到容器,包括敏感系統(tǒng)文件夾,例如/etc。這意味著容器可能修改這些文件,因?yàn)槭褂脴?biāo)準(zhǔn)簡(jiǎn)單的Unix權(quán)限設(shè)置來授予權(quán)限。對(duì)此,另一種更好的做法是使用非根容器,這涉及在不同的Linux用戶ID(UID)下運(yùn)行容器。這比較容易做,但這意味著構(gòu)建一種方法來保護(hù)每個(gè)容器,使用組ID(GID)或者UID作為權(quán)限檢查。
在這里我們遇到另一個(gè)問題:使用非根容器,而本地卷無法正常工作,除非用于運(yùn)行容器的UID有權(quán)限訪問/var/lib/docker/volumes 目錄。如果不這樣做,數(shù)據(jù)無法訪問或創(chuàng)建。打開這個(gè)目錄會(huì)有安全風(fēng)險(xiǎn);然而,并沒有固有方法來按卷設(shè)置單獨(dú)的權(quán)限。
如果我們看看外部存儲(chǔ)如何安裝到容器,很多解決方案只需向運(yùn)行容器的主機(jī)展示塊設(shè)備(LUN)以及格式化文件系統(tǒng)。這隨后展示到容器作為安裝點(diǎn)。在這一點(diǎn)上,目錄和文件的安全性可在容器內(nèi)設(shè)置,減少我們已經(jīng)討論的問題。然而,如果這個(gè)LUN/volume在其他地方重復(fù)使用,則對(duì)其如何安裝和使用沒有安全控制,因?yàn)闆]有安全模型直接構(gòu)建到容器/卷映射關(guān)系。一切都取決于信任主機(jī)上運(yùn)行的命令。
這里還有一個(gè)問題:缺乏多租戶性。當(dāng)我們運(yùn)行容器時(shí),每個(gè)容器實(shí)例可能為單獨(dú)的應(yīng)用運(yùn)行。在傳統(tǒng)存儲(chǔ)部署中,分配到容器的存儲(chǔ)應(yīng)該有一定程度的分離,以確保數(shù)據(jù)不會(huì)被無意或惡意訪問。目前沒有簡(jiǎn)單的方法在主機(jī)級(jí)別做到這一點(diǎn),只有信任編排工具來運(yùn)行容器以及映射到數(shù)據(jù)。
尋找解決方案
這里有些問題是特定于Linux/Unix。例如,安裝命名空間的抽象化為我們的數(shù)據(jù)提供了不同的入口點(diǎn),然而,并沒有權(quán)限的抽象化--我無法映射用戶1000到用戶1001-如果沒有物理升級(jí)與每個(gè)文件及目錄相關(guān)的ACL(訪問控制列表)數(shù)據(jù)。大規(guī)模ACL變更可能會(huì)影響性能。對(duì)于本地卷來說,Docker可簡(jiǎn)單地設(shè)置主機(jī)目錄的權(quán)限,新卷匹配正在啟動(dòng)容器的UID。
外部卷提供了很好的機(jī)會(huì),讓我們可以從運(yùn)行容器主機(jī)中的權(quán)限結(jié)構(gòu)轉(zhuǎn)移。然而,這意味著我們需要一種機(jī)制來映射卷數(shù)據(jù)到特定容器實(shí)例中已知可信應(yīng)用。請(qǐng)記住,容器并沒有固有的“身份”,可根據(jù)意愿開始和停止。這使得它很難確定任何單個(gè)容器是否是數(shù)據(jù)卷的所有者。
目前主要解決方案是依靠編排平臺(tái)來管理容器的運(yùn)行。我們信任這些系統(tǒng)來映射卷和容器,在很多方面,這并不像傳統(tǒng)SAN存儲(chǔ)或者虛擬磁盤映射到虛擬機(jī)那樣。但容器的區(qū)別在于其可便攜性,以及需要安全機(jī)制延伸到公共云。
我們?nèi)匀挥泻芏喙ぷ饕?。?duì)于Docker,對(duì)存儲(chǔ)初創(chuàng)公司Infinit的收購(gòu)可能啟發(fā)他們?nèi)绾伪Wo(hù)持久性數(shù)據(jù)。這應(yīng)該可能意味著開發(fā)接口讓所有供應(yīng)商可致力于此。