國家保密局網(wǎng)站>>保密科技

Docker容器安全性分析與增強(qiáng)方案研究

呂彬徐國坤/中科院信息工程研究所

2021年09月29日    來源:國家保密科技測評中心【字體: 打印

【摘 要】 Docker的核心思想是利用擴(kuò)展的Linux容器方案實(shí)現(xiàn)一種輕量級的虛擬化解決方案。本文介紹了Docker容器技術(shù)的架構(gòu)和安全特性,在分析Docker容器安全風(fēng)險的基礎(chǔ)上,論述了Docker容器的安全增強(qiáng)方案。

【關(guān)鍵詞】 Docker 容器 微服務(wù) 云計(jì)算

【中圖分類號】 TP315 【文獻(xiàn)標(biāo)識碼】 A

1 引言

隨著互聯(lián)網(wǎng)的迅猛發(fā)展,云計(jì)算作為一種商業(yè)計(jì)算模式在搜索服務(wù)、移動商務(wù)、開放協(xié)作等多樣化需求的推動下迅速發(fā)展起來[1]。云計(jì)算以動態(tài)的、易擴(kuò)展等優(yōu)勢提供了虛擬化資源的計(jì)算和存儲方式,并受到谷歌、IBM、亞馬遜、微軟等IT廠商的大力推廣和應(yīng)用。虛擬化技術(shù)作為云技術(shù)的核心,逐漸受到人們的廣泛關(guān)注。傳統(tǒng)計(jì)算機(jī)運(yùn)行主要采用虛擬機(jī)技術(shù),它占用了大量系統(tǒng)資源,導(dǎo)致主機(jī)運(yùn)行緩慢。所以,急需一種輕量級的虛擬技術(shù),以提高信息隔離程度,減少資源消耗[2]。

Docker是一款適應(yīng)市場需求的輕量級操作系統(tǒng)級虛擬化產(chǎn)品,利用Linux內(nèi)核的資源分離機(jī)制以及Linux內(nèi)核的控制組(Cgroups)建立獨(dú)立運(yùn)行的容器。容器間互相隔離,除了內(nèi)核之外,每個容器可以有自己的庫文件、配置文件、工具等,并且提供了良好設(shè)計(jì)的容器間通信機(jī)制,Docker技術(shù)的出現(xiàn)推動了基于云計(jì)算平臺開發(fā)模式的變革和應(yīng)用部署方式的變革[3]。

2 Docker技術(shù)介紹

2.1 概述

Docker設(shè)想是交付運(yùn)行環(huán)境如同海運(yùn)(如圖1所示),操作系統(tǒng)如同一個貨輪,每一個運(yùn)行在操作系統(tǒng)基礎(chǔ)上的軟件都如同一個集裝箱,用戶可以通過標(biāo)準(zhǔn)化手段自由組裝運(yùn)行環(huán)境,同時集裝箱的內(nèi)容可以由用戶自定義,也可以由專業(yè)人員制造。這樣,交付一個軟件,就是一系列標(biāo)準(zhǔn)化組件的集合的交付,如同樂高積木,用戶只需要選擇合適的積木組合,并且在最頂端部署上自己的應(yīng)用。

2.2 Docker系統(tǒng)架構(gòu)

Docker容器采用客戶端與服務(wù)器的架構(gòu)模式,如圖2所示。服務(wù)端處理復(fù)雜的操作任務(wù),例如,創(chuàng)建(Create)、運(yùn)行(Run)、保存(Commit)容器等,Docker客戶端作為服務(wù)端的遠(yuǎn)程控制器,可以用來連接并控制Docker的服務(wù)端進(jìn)程。Docker守護(hù)進(jìn)程和Docker客戶端之間可以通過RESTful API或者套接字(Socket)進(jìn)行進(jìn)程間通信。

2.2.1 注冊中心

注冊中心是存儲容器鏡像的管理倉庫,容器在運(yùn)行過程中,守護(hù)進(jìn)程與注冊中心執(zhí)行進(jìn)程間通信。目前既有公有倉庫(如Docker Hub),也有私有倉庫(如Harbor)。與公有倉庫相比,私有倉庫可以保證容器鏡像在本地網(wǎng)絡(luò)獲得。

2.2.2 容器

容器是Docker服務(wù)交付的最終體現(xiàn)形式。通過Docker客戶端下發(fā)的命令,訂制相應(yīng)的服務(wù)并運(yùn)行容器,Docker容器可以計(jì)算資源的配額,確保容器只能使用指定范圍內(nèi)的資源。

2.2.3 守護(hù)進(jìn)程

Docker守護(hù)進(jìn)程是Docker架構(gòu)中一個常駐在后臺的系統(tǒng)進(jìn)程,用于接收和處理客戶端發(fā)送的請求。該守護(hù)進(jìn)程在后臺啟動一個服務(wù)端,負(fù)責(zé)接受客戶端發(fā)送的請求;接受請求后,服務(wù)端通過路由與分發(fā)調(diào)度,找到相應(yīng)的處理器(handler)來執(zhí)行請求。

引擎是Docker架構(gòu)中的運(yùn)行引擎,它扮演容器存儲倉庫的角色,并且通過執(zhí)行任務(wù)的方式對容器進(jìn)行操作和管理。

2.2.4 函數(shù)庫

函數(shù)庫通過Go語言設(shè)計(jì)實(shí)現(xiàn),可以直接訪問內(nèi)核中與容器相關(guān)的API,從而實(shí)現(xiàn)對容器命名空間、控制組、網(wǎng)絡(luò)設(shè)備以及防火墻規(guī)則等資源的操作。

2.3 Docker安全特性

2.3.1 安全隔離特性

隔離能力是Docker容器技術(shù)的核心安全能力之一,主要通過Linux命名空間實(shí)現(xiàn),用于隔離進(jìn)程樹、網(wǎng)絡(luò)接口、掛載點(diǎn)、進(jìn)程間通信以及用戶等資源的方法。雖然多個容器運(yùn)行在同一個平臺上,但是它們分別位于自己的命名空間中,無法訪問到命名空間外部的資源,這樣即使某個容器被攻擊或者存在某個惡意容器,入侵者也僅能訪問到當(dāng)前容器的所有內(nèi)容。目前,Docker常用的命名空間包括進(jìn)程命名空間(PID)、網(wǎng)絡(luò)命名空間(NET)、文件系統(tǒng)命名空間(MNT)、主機(jī)與域名命名空間(UTS)以及用戶與用戶組命名空間(USER)等。

(1)進(jìn)程命名空間

進(jìn)程命名空間用來隔離進(jìn)程空間,使得不同命名空間里的進(jìn)程編號可以重復(fù)且互不影響,同時無法感知到運(yùn)行在其他容器或者宿主機(jī)上的進(jìn)程[4]。

(2)網(wǎng)絡(luò)命名空間

網(wǎng)絡(luò)命名空間用于實(shí)現(xiàn)網(wǎng)絡(luò)資源隔離,每個命名空間有獨(dú)立的網(wǎng)絡(luò)設(shè)備、IP地址、IP路由表等。

(3)文件系統(tǒng)命名空間

文件系統(tǒng)命名空間實(shí)現(xiàn)對根文件系統(tǒng)的環(huán)境進(jìn)行隔離,不同的命名空間對應(yīng)不同的根文件系統(tǒng),組織不同的文件系統(tǒng)掛載樹,形成不同的文件系統(tǒng)目錄結(jié)構(gòu)。

(4)主機(jī)與域名命名空間

主機(jī)與域名命名空間允許每個容器擁有獨(dú)立的主機(jī)名和域名,使其在網(wǎng)絡(luò)上可以被視作一個獨(dú)立的節(jié)點(diǎn)而非宿主機(jī)上的一個進(jìn)程。

(5)用戶與用戶組命名空間

每個容器可以有不同的用戶和用戶組,也就是說可以在容器內(nèi)部用內(nèi)部的用戶而非宿主機(jī)上的用戶。

2.3.2資源管控特性

Docker通過Linux的控制組技術(shù)來實(shí)現(xiàn)容器的資源控制?刂平M是由Linux內(nèi)核提供的一種對各進(jìn)程組所使用的物理資源(如處理器時間片、IO時間片、內(nèi)存等)進(jìn)行記錄、限制和隔離的技術(shù),其主要有以下3個功能。

(1)資源限制:限制每個進(jìn)程組可以分配的資源數(shù)量。比如,內(nèi)存子系統(tǒng)可以為某一進(jìn)程組設(shè)定一個內(nèi)存分配上限。

(2)優(yōu)先級設(shè)定:為進(jìn)程組指定特定的優(yōu)先級,當(dāng)各容器進(jìn)程搶占資源時,宿主機(jī)依據(jù)優(yōu)先級算法和各進(jìn)程組設(shè)定的優(yōu)先級分配資源。

(3)進(jìn)程組控制:如某一應(yīng)用或者容器發(fā)生了死鎖,可以通過控制組技術(shù)中斷這一進(jìn)程。

3 Docker安全風(fēng)險

繼2017年容器安全被列入高德納(Gartner)年度十大安全項(xiàng)目,2019年Gartner年度安全與風(fēng)險管理峰會上,再一次將容器安全項(xiàng)目列入榜單,預(yù)示著容器技術(shù)得到了廣泛的研究和應(yīng)用,尤其是隨著微服務(wù)架構(gòu)和DevOps開發(fā)模式的盛行,越來越多的開發(fā)人員使用容器技術(shù)。但是容器技術(shù)是一種新型的技術(shù)革命,不僅僅存在傳統(tǒng)的主機(jī)安全問題,同時也帶來了新型的安全威脅,例如,容器使用的是共享的操作系統(tǒng)模式,對主機(jī)操作系統(tǒng)的漏洞攻擊可能導(dǎo)致所有容器都受到破壞[5]。

3.1 逃逸安全風(fēng)險

Docker容器的逃逸安全風(fēng)險主要來源于危險配置、危險掛載、相關(guān)程序漏洞、內(nèi)核漏洞等諸多方面[6]。

(1)危險配置威脅

用戶可以通過修改容器環(huán)境配置,或在運(yùn)行容器時指定參數(shù)來縮小或擴(kuò)大Docker容器所需的最小權(quán)限,如果用戶為存在安全風(fēng)險的容器配置了危險參數(shù),實(shí)際上是為攻擊者提供了一定程度的逃逸可能性。例如,特權(quán)(Privileged)參數(shù)使得容器能夠運(yùn)行在特權(quán)模式,此時Docker容器將可以訪問宿主機(jī)上的所有設(shè)備,同時能夠修改宿主機(jī)強(qiáng)制訪問控制策略,使容器具備與直接運(yùn)行在宿主機(jī)上的進(jìn)程幾乎相同的訪問權(quán)限,嚴(yán)重破壞了Docker容器的隔離機(jī)制。

(2)隔離不完善威脅

Linux內(nèi)核層面提供的隔離防護(hù)措施還不夠,仍有部分關(guān)鍵內(nèi)容沒有完全隔離,如系統(tǒng)運(yùn)行的關(guān)鍵目錄(如/proc、/sys等)、偽文件系統(tǒng)等,這些信息可以被惡意用戶利用,為攻擊創(chuàng)造有利條件。文獻(xiàn)[7]的作者利用/proc目錄中泄露的信息,創(chuàng)造最優(yōu)條件,以最小代價對數(shù)據(jù)中心發(fā)起攻擊[7]。

(3)內(nèi)核漏洞安全威脅

操作系統(tǒng)內(nèi)核的攻擊是非常具有誘惑力的,大量研究者致力于發(fā)現(xiàn)可被用來執(zhí)行任意代碼或能進(jìn)行本地提權(quán)攻擊的內(nèi)核漏洞,而此內(nèi)核漏洞對基于與宿主機(jī)共享內(nèi)核機(jī)制構(gòu)建的Docker容器也同樣適用,一旦宿主內(nèi)核存在可以橫向越權(quán)或者提權(quán)漏洞,那么盡管Docker使用普通用戶執(zhí)行,攻擊者還是可以利用內(nèi)核漏洞逃逸到宿主。例如,Linux內(nèi)核3.16以前的版本存在一個內(nèi)存溢出漏洞(CVE-2014-7822),由于splice系統(tǒng)調(diào)用在兩個文件間拷貝數(shù)據(jù)時未檢查拷貝大小,可溢出覆寫內(nèi)核數(shù)據(jù),本地未授權(quán)用戶可利用此漏洞越界寫內(nèi)存,導(dǎo)致系統(tǒng)崩潰。

3.2 鏡像安全風(fēng)險

鏡像是Docker容器的靜態(tài)表示形式,鏡像安全決定了容器的運(yùn)行時安全。Docker官方鏡像倉庫Docker Hub中的鏡像可能由個人開發(fā)者上傳,其數(shù)量豐富、版本多樣,但質(zhì)量參差不齊,甚至存在包含惡意漏洞的惡意鏡像,存在較大的安全風(fēng)險。具體而言,Docker鏡像的安全風(fēng)險分布在創(chuàng)建過程、獲取來源、獲取途徑等方方面面。2017年有團(tuán)隊(duì)對鏡像安全漏洞進(jìn)行調(diào)研[8],并在《Docker Hub安全漏洞分析》一文中給出了一份鏡像的統(tǒng)計(jì)數(shù)據(jù),如表1所示。

總的來說,鏡像安全主要表現(xiàn)在鏡像腳本文件(Dockerfile)安全、鏡像漏洞和倉庫安全等諸多方面。

(1)鏡像腳本安全威脅

鏡像腳本是創(chuàng)建鏡像的一種主要形式,主要考慮最小安裝原則,同時考慮容器的易維護(hù)性,一般由基礎(chǔ)鏡像信息(FROM)、維護(hù)者信息(MAINTAINER)、鏡像操作指令(RUN,ADD,COPY等)、容器啟動時執(zhí)行指令(CMD等)4個部分組成。

如果鏡像腳本存在漏洞或被插入惡意腳本,那么生成的容器也可能產(chǎn)生漏洞或被惡意利用。例如,如果在腳本文件中沒有指定用戶,Docker將默認(rèn)以root的身份運(yùn)行該容器,若該容器遭到攻擊,那么宿主機(jī)的root訪問權(quán)限也可能會被獲取;如果在腳本文件中存儲了固定密碼等敏感信息并對外進(jìn)行發(fā)布,則可能導(dǎo)致數(shù)據(jù)泄露。

(2)鏡像漏洞安全威脅

鏡像漏洞安全風(fēng)險具體包括鏡像中的軟件含有CVE漏洞、攻擊者上傳含有惡意漏洞的鏡像等情況。

①CVE漏洞

鏡像通常是通過官方鏡像倉庫Docker Hub或網(wǎng)易、阿里云等提供的第三方鏡像倉庫獲取。然而,根據(jù)對Docker Hub中鏡像安全漏洞的相關(guān)研究,無論是社區(qū)鏡像還是官方鏡像,其平均漏洞數(shù)均接近200個,包括nginx、mysql、redis在內(nèi)的常用鏡像都含有高危漏洞。

CVE-2019-5021報告指出,自Alpine Linux3.3版本開始的所有Docker鏡像中,root用戶包含一個空密碼,如果在Docker容器中安裝了shadow軟件包并以非root用戶身份運(yùn)行服務(wù),那么具有shell訪問權(quán)限的用戶可在容器內(nèi)對賬號進(jìn)行提權(quán)[9]。

②惡意漏洞

惡意用戶可能將含有后門、病毒等惡意漏洞的鏡像上傳至官方鏡像庫。2018年5月,F(xiàn)ortinet公司披露Docker賬戶(Docker123321)創(chuàng)建的17個包含用于數(shù)字貨幣挖礦惡意程序的Docker鏡像。2018年6月,Kromtech公司發(fā)布了一份完整的報告,對該事件進(jìn)行了復(fù)盤。該事件涉及的惡意鏡像如表2所示。

3.3 網(wǎng)絡(luò)安全風(fēng)險

Docker容器網(wǎng)絡(luò)默認(rèn)使用橋接方式進(jìn)行連接,通過在宿主機(jī)上創(chuàng)建一個虛擬的網(wǎng)橋Docker0扮演傳統(tǒng)交換機(jī)的角色,并在各個網(wǎng)絡(luò)接口間自動地進(jìn)行分組轉(zhuǎn)發(fā)。每創(chuàng)建一個新的容器,就為其增加一個虛擬網(wǎng)絡(luò)接口,并將該網(wǎng)絡(luò)接口連接到網(wǎng)橋Docker0。同一主機(jī)上的容器之間采用網(wǎng)橋模式,對轉(zhuǎn)發(fā)的數(shù)據(jù)分組未進(jìn)行任何過濾,容易遭受ARP欺騙和MAC泛洪攻擊。當(dāng)容器中的應(yīng)用程序?qū)?nèi)核資源惡意使用時,將會影響該主機(jī)上其他容器。例如,頻繁惡意訪問Linux系統(tǒng)的隨機(jī)生成函數(shù),將可能造成主機(jī)的其他業(yè)務(wù)無法正常運(yùn)行。

容器的創(chuàng)建和刪除頻率較高,IP地址會隨著容器的狀態(tài)隨機(jī)分配和綁定,新創(chuàng)建的容器使用的IP大多數(shù)情況下已被其他容器綁定過,因此,對IP原所屬容器的攻擊可能會重定向到新容器中。

4 Docker安全增強(qiáng)方案

4.1 增強(qiáng)容器之間的精準(zhǔn)安全隔離

隨著基于容器的微服務(wù)化技術(shù)的大規(guī)模落地使用,容器之間的東西向流量急劇增大,目前常見的解決方案是在硬件級進(jìn)行隔離,這樣所有的流量都不得不經(jīng)過硬件交換設(shè)備和安全防護(hù)設(shè)備,增加容器環(huán)境的網(wǎng)絡(luò)復(fù)雜度,并且會形成“發(fā)夾效應(yīng)”,降低了數(shù)據(jù)傳輸效率,增加了網(wǎng)絡(luò)流量和硬件設(shè)備的傳輸壓力。

CNCF的容器平臺的安全最佳實(shí)踐文檔中要求從容器級別實(shí)現(xiàn)隔離或者打通等安全管控,在不同業(yè)務(wù)的容器之間,按照既定規(guī)則—標(biāo)簽、地址、端口等限制,來實(shí)現(xiàn)網(wǎng)絡(luò)分段,實(shí)現(xiàn)策略化的安全隔離。

4.2 增強(qiáng)對IP地址假冒的安全防護(hù)

容器平臺的容器數(shù)量越來越多,對外暴露的風(fēng)險點(diǎn)也會成倍增加,一旦有一個容器被攻破,攻擊行為會嘗試假冒IP地址、嗅探內(nèi)部漏洞等動作,當(dāng)攻擊行為成功繞過南北防火墻之后,對內(nèi)部造成的破壞將會非常巨大而且危險。不僅是攻破一個容器,還可能通過攻破容器再獲取整個主機(jī)的管理權(quán)限,在整個網(wǎng)絡(luò)內(nèi)部做更深度的攻擊和破壞。

針對該安全威脅,業(yè)界經(jīng)常采用的方案是通過NSX-T的spoofguard功能,維護(hù)容器名和IP地址的引用表來防止IP地址欺騙,在容器啟動過程中,用檢索到的信息填充它與每個容器的IP地址,可以有效阻止未知容器發(fā)送或接受流量,提高容器環(huán)境的整體安全性。

4.3 增強(qiáng)對挖礦病毒的安全防護(hù)

容器挖礦病毒到處肆虐,能利用多個軟件不同版本的各種漏洞,滲透到內(nèi)部環(huán)境,來注入挖礦木馬,并且在內(nèi)部網(wǎng)到處嗅探、傳染。此前的解決方法往往是發(fā)生了一次后,升級解決某個軟件版本的漏洞,刪除被感染環(huán)境的木馬程序,但是各個軟件升級調(diào)整又有新的漏洞以及源源不斷的新木馬變種。

針對該類安全問題建議從以下4個方面進(jìn)行安全加固。

(1)在進(jìn)行安全策略配置時,屏蔽掉常見的挖礦網(wǎng)站的IP地址。

(2)減少挖礦軟件經(jīng)常使用的服務(wù)軟件,例如minerd挖礦程序利用Redis等中間件的漏洞發(fā)起攻擊,獲取root權(quán)限,植入挖礦木馬。針對該類情況可以限定Redis所在容器的可訪問地址范圍,同時修改Redis的默認(rèn)服務(wù)器端口。

(3)修改或者關(guān)閉容器集群的默認(rèn)服務(wù)器端口,例如2375和2376等。

(4)建立健全漏洞發(fā)現(xiàn)和修復(fù)機(jī)制,定期對問題鏡像進(jìn)行漏洞修復(fù)。

5 結(jié)語

以Docker為代表的容器化技術(shù)逐漸成熟,已經(jīng)在云計(jì)算、微服務(wù)、開發(fā)運(yùn)維一體化等各個領(lǐng)域得到了廣泛研究和應(yīng)用。但是由于容器存在天然的安全問題和缺陷,相關(guān)的安全問題也不斷出現(xiàn)。目前對容器安全的研究也是百家爭鳴,主要有容器自身安全性研究、容器攻擊威脅研究、容器安全加固方案研究、容器監(jiān)控技術(shù)方案研究等各個方面。相信隨著容器技術(shù)本身和配套安全解決方案研究的不斷深入,容器技術(shù)將迎來下一個春天。

參考文獻(xiàn)

[1] 浙江大學(xué)SEL實(shí)驗(yàn)室.Docker容器與容器云(第二版)[M].北京:北京郵電大學(xué)出版社,2016:28.

[2] 李明全.基于Docker的虛擬化技術(shù)分析與探究[J].信息與電腦(理論版),2020,32(01):21~22+25.

[3] 趙冠臣,王冬妮,劉至洋,孟振江.淺談Docker容器技術(shù)[J].有線電視技術(shù),2019(09):85~88.

[4] 李俊灝.Docker安全性分析及安全防護(hù)[J].科技視界,2019(20):240~241+201.

[5] Gartner's top 10 security projects for 2019[EB/OL].[2020-10-18].https://www.ciodive.com/news/gartners-top-10-security-projects-for-2019/549899/,2019.

[6] 江燕青.容器逃逸技術(shù)的探討[J].福建電腦,2020,36(08):59~61.

[7] Gao X, Gu Z, Kayaalp M, et al. ContainerLeaks:Emerging Security Threats of Information Leakages in Container Clouds[C]. Ieee/ifip International Conference on Dependable Systems and Networks. IEEE, 2017:237~248.

[8] Shu R, Gu X, Enck W. A Study of Security Vulnerabilities on Docker Hub[C].ACM on Conference on Data and Application Security and Privacy. ACM, 2017:269~280.

[9]CVE-2019-5021[EB/OL].[2020-10-18].https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5021,2019.