docker容器為應用的編寫、分發和部署帶來真正翻天覆地的變化。容器的目的是靈活性,讓應用可按需啟用,無論何時以及何地。當然無論我們在**使用應用,我們都需要資料。
對於資料應該如何對映到容器主要有兩個流派。第乙個流派稱我們將資料保留在容器中;第二個稱我們在容器外儲存永久性資料,這些資料可超越任何單個容器的使用壽命。在這兩種情況下,安全問題給資料和容器管理帶來大問題。
管理資料訪問
現在有很多技術可用於分配儲存到docker容器。臨時儲存容量,本地到執行容器的主機,可在執行時分配到容器。儲存卷儲存在對映到應用的特定子目錄的主機內。卷可在容器例項化時建立,或者使用「docker volume」命令提前建立。
另外,本地儲存可作為安裝點對映到容器。在這種情況下,「docker run」命令可指定本地目錄作為容器內的安裝點。第三種選擇是使用儲存外掛程式直接關聯外部儲存與容器。
開放訪問
在每種方法中,docker框架都沒有提供針對資料的內在安全模型。例如,任何主機目錄可安裝到容器,包括敏感系統資料夾,例如/etc。這意味著容器可能修改這些檔案,因為使用標準簡單的unix許可權設定來授予許可權。對此,另一種更好的做法是使用非根容器,這涉及在不同的linux使用者id(uid)下執行容器。這比較容易做,但這意味著構建一種方法來保護每個容器,使用組id(gid)或者uid作為許可權檢查。
在這裡我們遇到另乙個問題:使用非根容器,而本地卷無法正常工作,除非用於執行容器的uid有許可權訪問/var/lib/docker/volumes 目錄。如果不這樣做,資料無法訪問或建立。開啟這個目錄會有安全風險;然而,並沒有固有方法來按卷設定單獨的許可權。
如果我們看看外部儲存如何安裝到容器,很多解決方案只需向執行容器的主機展示塊裝置(lun)以及格式化檔案系統。這隨後展示到容器作為安裝點。在這一點上,目錄和檔案的安全性可在容器內設定,減少我們已經討論的問題。然而,如果這個lun/volume在其他地方重複使用,則對其如何安裝和使用沒有安全控制,因為沒有安全模型直接構建到容器/卷對映關係。一切都取決於信任主機上執行的命令。
這裡還有乙個問題:缺乏多租戶性。當我們執行容器時,每個容器例項可能為單獨的應用執行。在傳統儲存部署中,分配到容器的儲存應該有一定程度的分離,以確保資料不會被無意或惡意訪問。目前沒有簡單的方法在主機級別做到這一點,只有信任編排工具來執行容器以及對映到資料。
尋找解決方案
這裡有些問題是特定於linux/unix。例如,安裝命名空間的抽象化為我們的資料提供了不同的入口點,然而,並沒有許可權的抽象化--我無法對映使用者1000到使用者1001-如果沒有物理公升級與每個檔案及目錄相關的acl(訪問控制列表)資料。大規模acl變更可能會影響效能。對於本地卷來說,docker可簡單地設定主機目錄的許可權,新卷匹配正在啟動容器的uid。
外部卷提供了很好的機會,讓我們可以從執行容器主機中的許可權結構轉移。然而,這意味著我們需要一種機制來對映卷資料到特定容器例項中已知可信應用。請記住,容器並沒有固有的「身份」,可根據意願開始和停止。這使得它很難確定任何單個容器是否是資料卷的所有者。
目前主要解決方案是依靠編排平台來管理容器的執行。我們信任這些系統來對映卷和容器,在很多方面,這並不像傳統san儲存或者虛擬磁碟對映到虛擬機器那樣。但容器的區別在於其可便攜性,以及需要安全機制延伸到公共雲。
我們仍然有很多任務作要做。對於docker,對儲存初創公司infinit的收購可能啟發他們如何保護永續性資料。這應該可能意味著開發介面讓所有**商可致力於此。
WEB安全隱患
org.apache.commons.lang.stringescapeutils 進行輸入框內容處理 stringescapeutils.escapesql str stringescapeutils.escapehtml str 1 跨站指令碼攻擊 cross site scripting 解決...
docker remote api 的安全隱患
開啟docker的api,首先要知道docker的守護程序daemon,在下認為daemon作為client和service連線的乙個橋梁,負責代替將client的請求傳遞給service端。預設情況daemon只由root控制,但我們可以通過 h繫結到埠上,這樣通過埠訪問的方式執行命令。我用的是u...
多執行緒的安全隱患
資源共享 1塊資源可能會被多個執行緒共享,也就是多個執行緒可能會訪問同一塊資源 比如多個執行緒訪問同乙個物件 同乙個變數 同乙個檔案 當多個執行緒訪問同一塊資源時,很容易引發資料錯亂和資料安全問題 解決方法是互斥鎖 互斥鎖使用格式 synchronized 鎖物件 注意 鎖定1份 只用1把鎖,用多把...