隨著容器技術的發展,它的安全、隔離和資源控制的功能也在不斷進步。本文中,我們將回顧Docker容器如何僅僅使用linux的原始功能來實現安全與隔離,比如namespaces, cgroups, capabilities等。
虛擬化和隔離
操作系統級的虛擬化、容器、空間以及「chroot with steroids」,其實都定義了同一個概念:用戶空間隔離。類似Docker的產品都使用了操作系統級的虛擬化,通過用戶空間隔離可以提供額外的安全性。
0.9版本起,Docker包含了libcontainer庫作為它直接虛擬化的方法,這個功能由Linux內核提供。 此外,它還通過 LXC[1],systemd-nspawn[2],和libvert[3]使用了抽象虛擬介面。 這些虛擬化庫全部利用了Linux的原始容器(參見上圖)
- namespaces
- cgroups
- capabilities等等。
Docker在一個包裝中聯合了以上功能,並稱之為容器格式。
libcontainer
默認的容器格式被稱為libcontainer。
Docker也支持使用LXC的傳統Linux容器。在將來,Docker可能會支持其他的容器格式,比如結合BSD jails或者Solaris Zones。
執行驅動程序是一種特殊容器格式的實現,用來運行docker容器。在最新的版本中,libcontainer有以下特性:
- 是運行docker容器的默認執行驅動程序。
- 和LXC同時裝載。
- 使用沒有任何其他依賴關係的Go語言設計的庫,來直接訪問內核容器的API。
- 目前的Docker涵蓋的功能有:命名空間使用,cgroups管理,capabilities許可權集,進程運行的環境變數配置以及網路介面防火牆設置——所有功能是固定可預測的,不依賴LXC或者其它任何用戶區軟體包。
- 只需提供一個根文件系統,和libcontainer對容器的操作配置,它會幫你完成剩下的事情。
- 支持新建容器或者添加到現有的容器。
- 事實上,對libcontainer最迫切的需求是穩定,開發團隊也將其設為了默認。
- 在Docker 0.9中,LXC現在可以選擇關閉。
- 注意:LXC在將來會繼續被支持。
- 如果想要重新使用LXC驅動,只需輸入指令
docker -d –e lxc,然後重啟Docker。
用戶命名空間
Docker不是虛擬化,相反的,它是一個支持命名空間抽象的內核,提供了獨立工作空間(或容器)。當你運行一個容器的時候,Docker為容器新建了一系列的namespace。
一些Docker使用的linux命名空間:
- pid namespace
- 用作區分進程(PID: Process ID)。
- 容器中運行的進程就如同在普通的Linux系統運行一樣,儘管它們和其他進程共享一個底層內核。
- net namespace
- 用作管理網路介面。
- DNAT允許你單獨配置主機中每個用戶的的網路,並且有一個方便的介面傳輸它們之間的數據。
- 當然,你也可以通過使用網橋用物理介面替換它。
- ipc namespace
- 用作管理對IPC (IPC: InterProcess Communication)資源的訪問。
- mnt namespace
- 用作管理mount-points (MNT: Mount)。
- uts namespace
- 用作區分內核和版本標識符(UTS: Unix Timesharing System)。
Linux上的Docker使用了被稱為cgroups的技術。因為每個虛擬機都是一個進程,所有普通Linux的資源管理應用可以被應用到虛擬機。此外,資源分配和調度只有一個等級,因為一個容器化的Linux系統只有一個內核並且這個內核對容器完全可見。
總之,cgroups可以讓Docker:
- 實現組進程並且管理它們的資源總消耗。
- 分享可用的硬體資源到容器。
- 限制容器的內存和CPU使用。
- 可以通過更改相應的cgroup來調整容器的大小。
- 通過檢查Linux中的/sys/fs/cgroup對照組來獲取容器中的資源使用信息。
- 提供了一種可靠的結束容器內所有進程的方法。
Capabilities
Linux使用的是「POSIX capabilities」。這些許可權是所有強大的root許可權分割而成的一系列許可權。在Linux manpages上可以找到所有可用許可權的清單。Docker丟棄了除了所需許可權外的所有許可權,使用了白名單而不是黑名單。
一般伺服器(裸機或者虛擬機)需要以root許可權運行一系列進程。包括:
- SSH
- cron
- syslogd
- 硬體管理工具 (比如負載模塊)
- 網路配置工具 (比如處理DHCP, WPA, or VPNs)等。
每個容器都是不同的,因為幾乎所有這些任務都由圍繞容器的基礎設施進行處理。默認的,Docker啟用一個嚴格限制許可權的容器。大多數案例中,容器不需要真正的root許可權。舉個例子,進程(比如說網路服務)只需要綁定一個小於1024的埠而不需要root許可權:他們可以被授予CAPNETBIND_SERVICE來代替。因此,容器可以被降權運行:意味著容器中的root許可權比真正的root許可權擁有更少的特權。 Capabilities只是現代Linux內核提供的眾多安全功能中的一個。為了加固一個Docker主機,你可以使用現有知名的系統:
如果你的發行版本附帶了Docker容器的安全模塊,你現在就可以使用它們。比如,裝載了AppArmor模板的Docker和Red Hat自帶SELinux策略的Docker。(責編/魏偉)
本文由希雲工程師提供
第九屆中國大數據技術大會將於2015年12月10-12日在北京隆重舉辦。在主會之外,會議還設立了16大分論壇,包含資料庫、深度學習、推薦系統、安全等6大技術論壇,金融、製造業、交通旅遊、互聯網、醫療健康、教育等7大應用論壇和3大熱點議題論壇,票價折扣中預購從速。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/252786.html
微信掃一掃
支付寶掃一掃