在Docker容器中實(shí)現(xiàn)安全與隔離

在云計(jì)算中,多租戶技術(shù)被認(rèn)為是一個(gè)非常重要的功能。如果我們將容器中運(yùn)行的應(yīng)用看作一個(gè)租戶,那么優(yōu)秀的安全隔離技術(shù)設(shè)計(jì)可以確保租戶只能使用它們可用的資源。

隨著容器技術(shù)的發(fā)展,它的安全、隔離和資源控制的功能也在不斷進(jìn)步。本文中,我們將回顧Docker容器如何僅僅使用linux的原始功能來(lái)實(shí)現(xiàn)安全與隔離,比如namespaces, cgroups, capabilities等。

虛擬化和隔離

操作系統(tǒng)級(jí)的虛擬化,容器,空間,以及“chroot with steroids”,其實(shí)都定義了同一個(gè)概念:用戶空間隔離。類似Docker的產(chǎn)品都使用了操作系統(tǒng)級(jí)的虛擬化,通過(guò)用戶空間隔離可以提供額外的安全性。

0.9版本起,Docker包含了libcontainer庫(kù)作為它直接虛擬化的方法,這個(gè)功能由Linux內(nèi)核提供。 此外,它還通過(guò) LXC[1],systemd-nspawn[2],和libvert[3]使用了抽象虛擬接口。

這些虛擬化庫(kù)全部利用了Linux的原始容器(參見(jiàn)上圖)

#namespaces

#cgroups

#capabilities等等。

Docker在一個(gè)包裝中聯(lián)合了以上功能,并稱之為容器格式。

Libcontainer

默認(rèn)的容器格式被稱為libcontainer。

Docker也支持使用LXC的傳統(tǒng)Linux容器。在將來(lái),Docker可能會(huì)支持其他的容器格式,比如結(jié)合BSD jails或者Solaris Zones。

執(zhí)行驅(qū)動(dòng)程序是一種特殊容器格式的實(shí)現(xiàn),用來(lái)運(yùn)行docker容器。在最新的版本中,libcontainer有以下特性:

是運(yùn)行docker容器的默認(rèn)執(zhí)行驅(qū)動(dòng)程序。

和LXC同時(shí)裝載。

使用沒(méi)有任何其他依賴關(guān)系的Go語(yǔ)言設(shè)計(jì)的庫(kù),來(lái)直接訪問(wèn)內(nèi)核容器的API。

在Docker 0.9中,LXC現(xiàn)在可以選擇關(guān)閉。

注意:LXC在將來(lái)會(huì)繼續(xù)被支持。

如果想要重新使用LXC驅(qū)動(dòng),只需輸入指令docker -d –e lxc,然后重啟Docker。

目前的Docker涵蓋的功能有:命名空間使用,cgroups管理,capabilities權(quán)限集,進(jìn)程運(yùn)行的環(huán)境變量配置以及網(wǎng)絡(luò)接口防火墻設(shè)置——所有功能是固定可預(yù)測(cè)的,不依賴LXC或者其它任何用戶區(qū)軟件包。

只需提供一個(gè)根文件系統(tǒng),和libcontainer對(duì)容器的操作配置,它會(huì)幫你完成剩下的事情。

支持新建容器或者添加到現(xiàn)有的容器。

事實(shí)上,對(duì)libcontainer最迫切的需求是穩(wěn)定,開發(fā)團(tuán)隊(duì)也將其設(shè)為了默認(rèn)。\

用戶命名空間

Docker不是虛擬化,相反的,它是一個(gè)支持命名空間抽象的內(nèi)核,提供了獨(dú)立工作空間(或容器)。當(dāng)你運(yùn)行一個(gè)容器的時(shí)候,Docker為容器新建了一系列的namespace。

一些Docker使用的linux命名空間:

pid namespace

用作區(qū)分進(jìn)程(PID: Process ID)。

容器中運(yùn)行的進(jìn)程就如同在普通的Linux系統(tǒng)運(yùn)行一樣,盡管它們和其他進(jìn)程共享一個(gè)底層內(nèi)核。

net namespace

用作管理網(wǎng)絡(luò)接口。

DNAT允許你單獨(dú)配置主機(jī)中每個(gè)用戶的的網(wǎng)絡(luò),并且有一個(gè)方便的接口傳輸它們之間的數(shù)據(jù)。

當(dāng)然,你也可以通過(guò)使用網(wǎng)橋用物理接口替換它。

ipc namespace

用作管理對(duì)IPC (IPC: InterProcess Communication)資源的訪問(wèn)。

mnt namespace

用作管理mount-points (MNT: Mount)。

uts namespace

用作區(qū)分內(nèi)核和版本標(biāo)識(shí)符(UTS: Unix Timesharing System)。

cgroups

Linux上的Docker使用了被稱為cgroups的技術(shù)。因?yàn)槊總€(gè)虛擬機(jī)都是一個(gè)進(jìn)程,所有普通Linux的資源管理應(yīng)用可以被應(yīng)用到虛擬機(jī)。此外,資源分配和調(diào)度只有一個(gè)等級(jí),因?yàn)橐粋€(gè)容器化的Linux系統(tǒng)只有一個(gè)內(nèi)核并且這個(gè)內(nèi)核對(duì)容器完全可見(jiàn)。

總之,cgroups可以讓Docker:

#實(shí)現(xiàn)組進(jìn)程并且管理它們的資源總消耗。

#分享可用的硬件資源到容器。

#限制容器的內(nèi)存和CPU使用。

##可以通過(guò)更改相應(yīng)的cgroup來(lái)調(diào)整容器的大小。

##通過(guò)檢查L(zhǎng)inux中的/sys/fs/cgroup對(duì)照組來(lái)獲取容器中的資源使用信息。

#提供了一種可靠的結(jié)束容器內(nèi)所有進(jìn)程的方法。

Capabilities

Linux使用的是“POSIX capabilities”。這些權(quán)限是所有強(qiáng)大的root權(quán)限分割而成的一系列權(quán)限。在Linux manpages上可以找到所有可用權(quán)限的清單。Docker丟棄了除了所需權(quán)限外的所有權(quán)限,使用了白名單而不是黑名單。

一般服務(wù)器(裸機(jī)或者虛擬機(jī))需要以root權(quán)限運(yùn)行一系列進(jìn)程。包括:

SSH

cron

syslogd

硬件管理工具 (比如負(fù)載模塊)

網(wǎng)絡(luò)配置工具 (比如處理DHCP, WPA, or VPNs)等。

每個(gè)容器都是不同的,因?yàn)閹缀跛羞@些任務(wù)都由圍繞容器的基礎(chǔ)設(shè)施進(jìn)行處理。默認(rèn)的,Docker啟用一個(gè)嚴(yán)格限制權(quán)限的容器。大多數(shù)案例中,容器不需要真正的root權(quán)限。舉個(gè)例子,進(jìn)程(比如說(shuō)網(wǎng)絡(luò)服務(wù))只需要綁定一個(gè)小于1024的端口而不需要root權(quán)限:他們可以被授予CAP_NET_BIND_SERVICE來(lái)代替。因此,容器可以被降權(quán)運(yùn)行:意味著容器中的root權(quán)限比真正的root權(quán)限擁有更少的特權(quán)。

Capabilities只是現(xiàn)代Linux內(nèi)核提供的眾多安全功能中的一個(gè)。為了加固一個(gè)Docker主機(jī),你可以使用現(xiàn)有知名的系統(tǒng):

TOMOYO

AppArmor

SELinux

GRSEC, etc.

如果你的發(fā)行版本附帶了Docker容器的安全模塊,你現(xiàn)在就可以使用它們。比如,裝載了AppArmor模板的Docker和Red Hat自帶SELinux策略的Docker。希云(http://csphere.cn)以后會(huì)為大家推薦更多精美文章,請(qǐng)大家繼續(xù)關(guān)注!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Docker — 云時(shí)代的程序分發(fā)方式 要說(shuō)最近一年云計(jì)算業(yè)界有什么大事件?Google Compute Engi...
    ahohoho閱讀 15,850評(píng)論 15 147
  • 寫這篇文章主要是為了今后畢業(yè)論文素材上的整理,同時(shí)對(duì)docker進(jìn)行鞏固溫習(xí)。大綱: docker簡(jiǎn)介docker...
    胡圖仙人閱讀 7,768評(píng)論 2 96
  • 寫這個(gè)系列文章主要是對(duì)之前做項(xiàng)目用到的docker相關(guān)技術(shù)做一些總結(jié),包括docker基礎(chǔ)技術(shù)Linux命名空間,...
    __七把刀__閱讀 5,924評(píng)論 0 16
  • 一、Docker 簡(jiǎn)介 Docker 兩個(gè)主要部件:Docker: 開源的容器虛擬化平臺(tái)Docker Hub: 用...
    R_X閱讀 4,521評(píng)論 0 27
  • 對(duì)于夏天,我能接受的就只有晚上的涼風(fēng),綠豆湯以及雷陣雨。 小時(shí)候?qū)χ^(qū)的健身器材都可以玩一下午絲毫不知疲倦,口干...
    契衍閱讀 258評(píng)論 0 0

友情鏈接更多精彩內(nèi)容