Docker中用到的主要Linux安全技術有哪些?

異步社區 發佈 2020-05-22T09:36:56+00:00

每個優秀的容器平台都應該使用命名空間和控制組技術來構建容器。最佳的容器平台還會集成其他容器安全技術,例如系統權限、強制訪問控制系統(如SELinux和AppArmor)以及安全計算。正如用戶所期望的,Docker中集成了上述全部安全技術!

每個優秀的容器平台都應該使用命名空間和控制組技術來構建容器。最佳的容器平台還會集成其他容器安全技術,例如系統權限、強制訪問控制系統(如SELinux和AppArmor)以及安全計算。正如用戶所期望的,Docker中集成了上述全部安全技術!

在本節中會對Docker中用到的主要Linux技術進行簡要介紹。之所以不進行深入介紹,是因為在本書中希望將重點放在Docker平台技術上。

1.Namespace

內核命名空間屬於容器中非常核心的一部分! 該技術能夠將作業系統(OS)進行拆分,使一個作業系統看起來像多個互相獨立的作業系統一樣。這種技術可以用來做一些非常酷的事情,比如在相同的OS上運行多個Web服務,同時還不存在埠衝突的問題。該技術還允許多個應用運行在相同OS上並且不存在競爭,同時還能共享配置文件以及類庫。

舉兩個簡單的例子。

  • 用戶可以在相同的OS上運行多個Web服務,每個埠都是443。為了實現該目的,可以將兩個Web服務應用分別運行在自己的網絡命名空間中。這樣可以生效的原因是每個網絡命名空間都擁有自己的IP位址以及對應的全部埠。也可能需要將每個IP映射到Docker主機的不同埠之上,但是使用IP上的哪個埠則無須其他額外配置。
  • 用戶還可以運行多個應用,應用間共享類庫和配置文件,但是版本可能不同。為了實現該目標,需要在自己的掛載命名空間中運用每個應用程式。這樣做能生效的原因,是每個掛載命名空間內都有系統上任意目錄的獨立副本。

圖15.2展示了一個抽象的例子,兩個應用運行在相同的主機上,並且同時使用443埠。每個Web服務應用都運行在自己的網絡命名空間之內。

Linux Docker現在利用了下列內核命名空間。

  • 進程ID(PID)。
  • 網絡(NET)。
  • 文件系統/掛載(MNT)。
  • 進程內通信(IPC)。
  • 用戶(USER)。
  • UTS。

下面會簡要介紹每種技術都做了些什麼。但重要的是要理解,Docker容器是由各種命名空間組合而成的

。再次強調一遍,Docker容器本質就是命名空間的有組織集合

例如,每個容器都由自己的PID、NET、MNT、IPC、UTS構成,還可能包括USER命名空間。這些命名空間有機的組合就是所謂的容器。圖15.3展示了兩個運行在相同Linux主機上的容器。

接下來簡要介紹一下Docker是如何使用每個命名空間的。

  • 進程ID命名空間:Docker使用PID命名空間為每個容器提供互相獨立的容器樹。每個容器都擁有自己的進程樹,意味著每個容器都有自己的PID為1的進程。PID命名空間也意味著容器不能看到其他容器的進程樹,或者其所在主機的進程樹。
  • 網絡命名空間:Docker使用NET命名空間為每個容器提供互相隔離的網絡棧。網絡棧中包括接口、ID地址、埠地址以及路由表。例如,每個容器都有自己的eth0網絡接口,並且有自己獨立的IP和埠地址。
  • 掛載點命名空間:每個容器都有互相隔離的根目錄/。這意味著每個容器都有自己的/etc、/var、/dev等目錄。容器內的進程不能訪問Linux主機上的目錄,或者其他容器的目錄,只能訪問自己容器的獨立掛載命名空間。
  • 進程內通信命名空間:Docker使用IPC命名空間在容器內提供共享內存。IPC提供的共享內存在不同容器間也是互相獨立的。
  • 用戶命名空間:Docker允許用戶使用USER命名空間將容器內用戶映射到Linux主機不同的用戶上。常見的例子就是將容器內的root用戶映射到Linux主機的非root用戶上。用戶命名空間對於Docker來說還屬於新生事物且非必選項。該部分內容在未來可能出現改變。
  • UTS命名空間:Docker使用UTS命名空間為每個容器提供自己的主機名稱。

如圖15.4所示,容器本質就是命名空間的有機組合!

2.Control Group

如果說命名空間用於隔離,那麼控制組就是用於限額。

假設容器就是酒店中的房間。每個容器間都是互相獨立的,但是每個房間都共享一部分公共資源,比如供應水電、共享游泳池、共享健身、共享早餐餐吧等。CGroup允許用戶設置一些限制(以酒店作為類比)來保證不會存在單一容器占用全部的公共資源,如用光全部水或者吃光早餐餐吧的全部食物。

拋開酒店的例子,在Docker的世界中,容器之間是互相隔離的,但卻共享OS資源,比如CPU、RAM以及硬碟I/O。CGroup允許用戶設置限制,這樣單個容器就不能占用主機全部的CPU、RAM或者存儲I/O資源了。

3.Capability

以root身份運行容器不是什麼好主意,root擁有全部的權限,因此很危險。但是,如果以非root身份在後台運行容器的話,非root用戶缺少權限,處處受限。所以用戶需要一種技術,能選擇容器運行所需的root用戶權限。了解一下Capability!

在底層,Linux root用戶是由許多能力組成的。其中一部分包括以下幾點。

  • CAP_CHOWN:允許用戶修改文件所有權。
  • CAP_NET_BIND_SERVICE:允許用戶將socket綁定到系統埠號。
  • CAP_SETUID:允許用戶提升進程優先級。
  • CAP_SYS_BOOT:允許用戶重啟系統。

Docker採用Capability機制來實現用戶在以root身份運行容器的同時,還能移除非必須的root能力。如果容器運行只需要root的綁定系統網絡埠號的能力,則用戶可以在啟動容器的同時移除全部root能力,然後再將CAP_NET_BIND_SERVICE能力添加回來。

4.MAC

Docker採用主流Linux MAC技術,例如AppArmor以及SELinux。

基於用戶的Linux發行版本,Docker對新容器增加了默認的AppArmor配置文件。根據Docker文檔的描述,默認配置文件提供了「適度的保護,同時還能兼容大部分應用」。

Docker允許用戶在啟動容器的時候不設置相應策略,還允許用戶根據需求自己配置合適的策略。

5.Seccomp

Docker使用過濾模式下的Seccomp來限制容器對宿主機內核發起的系統調用。

按照Docker的安全理念,每個新容器都會設置默認的Seccomp配置,文件中設置了合理的默認值。這樣做是為了在不影響應用兼容性的前提下,提供適度的安全保障。

用戶同樣可以自定義Seccomp配置,同時也可以通過向Docker傳遞指定參數,使Docker啟動時不設置任何Seccomp配置。

6.Linux安全技術總結

Docker基本支持所有的Linux重要安全技術,同時對其進行封裝並賦予合理的默認值,這在保證了安全的同時也避免了過多的限制,如圖15.5所示。

自定義設置某些安全技術會非常複雜,因為這需要用戶深入理解安全技術的運作原理,同時還要了解Linux內核的工作機制。希望這些技術在未來能夠簡化配置的過程,但就現階段而言,使用Docker在對安全技術的封裝中提供的默認值是很不錯的選擇。


本文摘自《深入淺出Docker》

《深入淺出Docker》由Docker概覽和Docker技術兩部分組成,遵循簡介—詳解—命令的章節布局,全面系統地剖析Docker的基本原理與實踐應用。清晰詳細的操作步驟結合大量的實際代碼,為讀者切實入門Docker保駕護航。


關鍵字: