干貨 | Docker中用到的主要Linux安全技術有哪些?
每個優秀的容器平臺都應該使用命名空間和控制組技術來構建容器。最佳的容器平臺還會集成其他容器安全技術,例如系統權限、強制訪問控制系統(如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容器本質就是命名空間的有組織集合
。
圖15.2 兩個應用運行在相同主機并同時使用443端口
例如,每個容器都由自己的PID、NET、MNT、IPC、UTS構成,還可能包括USER命名空間。這些命名空間有機的組合就是所謂的容器。圖15.3展示了兩個運行在相同Linux主機上的容器。
圖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所示,容器本質就是命名空間的有機組合!
圖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所示。
圖15.5 Docker支持Linux重要安全技術
自定義設置某些安全技術會非常復雜,因為這需要用戶深入理解安全技術的運作原理,同時還要了解Linux內核的工作機制。希望這些技術在未來能夠簡化配置的過程,但就現階段而言,使用Docker在對安全技術的封裝中提供的默認值是很不錯的選擇。
本文摘自正在熱銷的技術書[《深入淺出Docker》](https://item.jd.com/12564378.html?dist=jd "《深入淺出Docker》")
Nigel,Poulton(奈吉爾·波爾頓) 著,李瑞豐,劉康
Docker技術入門與實踐指南教程
容器與容器云解析,幫助您快速建立Docker技術知識體系
Docker認證工程師實用指南
《深入淺出Docker》由Docker概覽和Docker技術兩部分組成,遵循簡介—詳解—命令的章節布局,全面系統地剖析Docker的基本原理與實踐應用。清晰詳細的操作步驟結合大量的實際代碼,為讀者切實入門Docker保駕護航。
本文轉載自異步社區
架構設計
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。