邵思思,李 奎,堯海昌,楊衛(wèi)東,尤 帥,劉 強(qiáng),2,3,4,劉尚東,2,3,4,季一木,2,3,4
(1.南京郵電大學(xué)計(jì)算機(jī)學(xué)院,江蘇 南京 210023 2.南京郵電大學(xué)江蘇省無(wú)線傳感網(wǎng)高技術(shù)研究重點(diǎn)實(shí)驗(yàn)室,江蘇 南京 210023 3.南京郵電大學(xué)高性能計(jì)算與大數(shù)據(jù)處理研究所,江蘇 南京 210023 4.南京郵電大學(xué)高性能計(jì)算與智能處理工程研究中心,江蘇 南京 210023)
近幾年,云計(jì)算作為一種新型的計(jì)算形式快速地發(fā)展起來(lái),它是以虛擬化機(jī)制為核心,以Internet為載體,以規(guī)模的計(jì)算、存儲(chǔ)和數(shù)據(jù)資源組成的信息資源池為支撐,按照用戶需求動(dòng)態(tài)地提供虛擬化、可伸縮的信息服務(wù)[1]。 在早期計(jì)算領(lǐng)域中[2],虛擬機(jī)(VM)是云計(jì)算環(huán)境中的常用資源。對(duì)于云服務(wù)提供商,虛擬機(jī)有助于提高硬件資源的利用率。對(duì)于云客戶,它支持提供彈性資源并提供一系列服務(wù)集合。 但隨著Docker技術(shù)[3-4]的發(fā)展,傳統(tǒng)部署帶來(lái)的問(wèn)題越來(lái)越嚴(yán)重,因?yàn)槎鄠€(gè)應(yīng)用對(duì)運(yùn)行環(huán)境的要求不同,導(dǎo)致應(yīng)用部署產(chǎn)生了很多麻煩[5-7]。 由傳統(tǒng)虛擬機(jī)集群為基礎(chǔ)的云計(jì)算集群逐漸轉(zhuǎn)變?yōu)橐訢ocker物理節(jié)點(diǎn)為集群的方式。Docker是一種輕量級(jí)、可移植、自包含的軟件打包技術(shù),使應(yīng)用程序可以幾乎在任何地方以相同的方式運(yùn)行[8]。Docker采用客戶端/服務(wù)器(C/S)的架構(gòu)模式,客戶端向服務(wù)器發(fā)送請(qǐng)求,服務(wù)器負(fù)責(zé)構(gòu)建、運(yùn)行和分發(fā)容器。
隨著Docker應(yīng)用的規(guī)模越來(lái)越大,領(lǐng)域越來(lái)越廣泛,人們?cè)絹?lái)越關(guān)注容器安全方面的問(wèn)題[9-12]。這不僅僅是一個(gè)技術(shù)性問(wèn)題,更是一種意識(shí)性問(wèn)題。Docker目前已經(jīng)在安全方面做了一定的工作,包括Docker daemon在以TCP形式提供服務(wù)的同時(shí)使用傳輸層安全協(xié)議;在構(gòu)建和使用鏡像時(shí)驗(yàn)證鏡像的簽名證書;通過(guò)cgroups及namespaces對(duì)容器進(jìn)行資源限制隔離;提供自定義容器能力(capability)的接口等。如果合理地應(yīng)用上述方法,可以有效提高Docker容器的安全性。國(guó)內(nèi)已經(jīng)有很多關(guān)于容器安全方面的工作,但主要還是分布在如何從底層提升Docker安全性而忽略了 Docker鏡像這一環(huán)節(jié)[13]。惡意用戶可以嘗試在Dockerfile文件中添加惡意命令,如反彈shell或引入存在漏洞的應(yīng)用等造成Dockerfile攻擊。文獻(xiàn)[14]系統(tǒng)分析了 Docker Hub上的30萬(wàn)個(gè)鏡像,發(fā)現(xiàn)平均每個(gè)鏡像有180個(gè)漏洞,大多數(shù)鏡像不會(huì)修復(fù)這些漏洞并且父鏡像會(huì)向子鏡像傳播這些漏洞。文獻(xiàn)[15]分析了全球133個(gè)公開Docker倉(cāng)庫(kù)中最大的91個(gè)倉(cāng)庫(kù),用Clair掃描倉(cāng)庫(kù)中的鏡像,其中存在明顯漏洞的占24%,高風(fēng)險(xiǎn)等級(jí)的漏洞占11%。Clair是目前最流行的鏡像掃描工具,主要模塊分為Detector、Fetcher、Notifier和Webhook,Clair首先對(duì)鏡像進(jìn)行掃描,然后再將這些特征匹配CVE漏洞庫(kù),若發(fā)現(xiàn)漏洞則進(jìn)行提示及修補(bǔ)。但是Clair只能對(duì)Docker鏡像進(jìn)行檢測(cè),無(wú)法檢測(cè)Dockerfile文件,從源頭控制風(fēng)險(xiǎn)也無(wú)法提前檢測(cè)可能存在的安全風(fēng)險(xiǎn)。
因此,針對(duì)如何有效提高Docker鏡像的安全,從源頭控制風(fēng)險(xiǎn),提前檢測(cè)Docker鏡像可能存在的漏洞,從而進(jìn)一步提高Docker容器的安全問(wèn)題,本文提出了一種基于深度學(xué)習(xí)的Docker風(fēng)險(xiǎn)預(yù)測(cè)框架和算法,本文主要有以下兩方面貢獻(xiàn):
(1)提出了一種基于深度學(xué)習(xí)的Docker特征提取風(fēng)險(xiǎn)預(yù)測(cè)框架。該框架從鏡像的源頭對(duì)Docker進(jìn)行風(fēng)險(xiǎn)控制??梢詼?zhǔn)確預(yù)測(cè)Dockerfile的風(fēng)險(xiǎn)性,減少Docker鏡像的漏洞。
(2)提出了一種基于深度學(xué)習(xí)的Docker風(fēng)險(xiǎn)預(yù)測(cè)(DRPA)算法,該算法利用深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)對(duì)訓(xùn)練數(shù)據(jù)集中的Dockerfile文件進(jìn)行語(yǔ)義和結(jié)構(gòu)特征的提取以及概率預(yù)測(cè),將待檢測(cè)的Dockerfile文件輸入到訓(xùn)練好的網(wǎng)絡(luò)模型中進(jìn)行預(yù)測(cè),判斷其是否具備風(fēng)險(xiǎn),并返回其風(fēng)險(xiǎn)概率。結(jié)合容器集群放置方法,從而進(jìn)一步保證了容器的安全。
目前Docker安全的保證主要依賴于3種Linux內(nèi)核安全機(jī)制:namespace負(fù)責(zé)構(gòu)建資源隔離環(huán)境,確保Docker容器有更嚴(yán)格的安全性機(jī)制;cgroups主要確保每個(gè)容器可以獲得公平的系統(tǒng)資源;capability用于增強(qiáng)容器控件內(nèi)的權(quán)限,從而隔離容器內(nèi)外之間的根權(quán)限。加強(qiáng)Linux容器安全性的最有效方法是在內(nèi)核級(jí)強(qiáng)制執(zhí)行強(qiáng)制訪問(wèn)控制(MAC),以防止在主機(jī)和容器端進(jìn)行不必要的操作,使用的工具包括 AppArmor[16]或 SELinux[17]。文獻(xiàn)[18]針對(duì)Docker平臺(tái)上的Dos攻擊,提出了一種安全策略和實(shí)驗(yàn)方法,加強(qiáng)訪問(wèn)控制、身份驗(yàn)證和授權(quán)解決以應(yīng)對(duì)Dos攻擊。文獻(xiàn)[19]提出了一種為不同的容器化進(jìn)程引入特定SELinux類型且對(duì)用戶透明的方式,在主機(jī)中安裝DockerPolicyModules(DPM)模塊,避免Docker鏡像在主機(jī)系統(tǒng)中安裝SELinux模塊時(shí)出現(xiàn)威脅,從而提高Docker的安全性。文獻(xiàn)[20]提出了一種通過(guò)執(zhí)行訪問(wèn)策略來(lái)保護(hù)Docker容器的整個(gè)生命周期的用戶友好機(jī)制,該機(jī)制為每個(gè)容器自動(dòng)創(chuàng)建AppArmor配置文件,在Docker的安全默認(rèn)值之上增加了一個(gè)額外的安全層;此外,給定應(yīng)用程序工作負(fù)載,通過(guò)生成動(dòng)態(tài)安全配置文件來(lái)增強(qiáng)Docker容器安全性。文獻(xiàn)[21]認(rèn)為內(nèi)核漏洞是操作系統(tǒng)安全面臨的最大威脅之一,因此提出了一種基于名稱空間狀態(tài)檢測(cè)的防御方法,該方法能夠檢測(cè)異常過(guò)程并防止逃逸行為,確保容器在運(yùn)行期間受到保護(hù)和監(jiān)視。以上研究工作都是集中于如何從底層提升Docker安全性,在一定方面有效地提高了Docker容器的安全性,但這些研究工作都忽略了Docker鏡像在Docker安全中的重要性。為了保證鏡像安全,Docker Hub在最近發(fā)布的Docker數(shù)據(jù)中心中提出了一個(gè)簽名機(jī)制,他們構(gòu)建了一個(gè)基于更新框架(TUF)和Docker內(nèi)容信任(DCT)的簽名基礎(chǔ)結(jié)構(gòu),允許管理員設(shè)置簽名策略,防止使用不受信任的內(nèi)容。文獻(xiàn)[13]針對(duì)Docker存在的容器及鏡像被篡改問(wèn)題,構(gòu)造了一條利用可信計(jì)算相關(guān)技術(shù)的信任鏈,設(shè)計(jì)了一種分層式數(shù)據(jù)安全防護(hù)系統(tǒng),以提高對(duì)Docker鏡像的全方面安全防護(hù)。雖然這些方法在一定程度上有效地提高了Docker鏡像運(yùn)行的安全性,但卻沒(méi)有對(duì)Docker鏡像本身進(jìn)行安全加固,也無(wú)法提前檢測(cè)Docker鏡像可能存在的安全風(fēng)險(xiǎn)。
目前已經(jīng)有很多機(jī)器學(xué)習(xí)算法被用于文本特征提取,利用深度學(xué)習(xí)對(duì)文本進(jìn)行特征提取也得到越來(lái)越多的應(yīng)用,常用于自然語(yǔ)言處理的問(wèn)題。文獻(xiàn)[22-23]分別提出了一種基于深度信任網(wǎng)絡(luò)(DBN)進(jìn)行軟件缺陷預(yù)測(cè)的方法和一種通過(guò)卷積神經(jīng)網(wǎng)絡(luò)(CNN)進(jìn)行軟件缺陷預(yù)測(cè)的框架,通過(guò)對(duì)程序源碼提取特征與傳統(tǒng)方式相結(jié)合的方式來(lái)預(yù)測(cè)程序是否存在錯(cuò)誤,大大降低了軟件缺陷中的錯(cuò)誤率。因而利用深度學(xué)習(xí)算法從Dockerfile文件中提取特征并預(yù)測(cè)概率成為可能。
綜上所述,已有的Docker安全加固方法雖然在一定程度上保證了Docker容器的安全可靠運(yùn)行,但卻無(wú)法從源頭控制風(fēng)險(xiǎn),降低Docker鏡像的漏洞,從而進(jìn)一步確保Docker容器的安全。
基于深度學(xué)習(xí)的Docker風(fēng)險(xiǎn)預(yù)測(cè)框架如圖1所示。
圖1 基于深度學(xué)習(xí)的Docker風(fēng)險(xiǎn)預(yù)測(cè)框架
該框架主要包括4個(gè)模塊:數(shù)據(jù)預(yù)處理模塊、文件檢測(cè)模塊、鏡像放置模塊和容器集群模塊。數(shù)據(jù)預(yù)處理模塊根據(jù)訓(xùn)練集對(duì)Dockerfile文件進(jìn)行語(yǔ)義和結(jié)構(gòu)的特征提取并預(yù)測(cè)其風(fēng)險(xiǎn)概率;文件檢測(cè)模塊利用訓(xùn)練好的網(wǎng)絡(luò)模型對(duì)待檢測(cè)的Dockerfile文件進(jìn)行預(yù)測(cè)是否具有風(fēng)險(xiǎn)并評(píng)估風(fēng)險(xiǎn)等級(jí),然后由用戶決定是否放置到容器集群中;容器集群模塊根據(jù)文件檢測(cè)模塊的結(jié)果決定放置方式,對(duì)Docker鏡像進(jìn)行放置。
基于深度學(xué)習(xí)的Docker風(fēng)險(xiǎn)預(yù)測(cè)框架各模塊的具體步驟如下:(1)數(shù)據(jù)預(yù)處理模塊。首先對(duì)Dockerfile文件進(jìn)行解析,生成抽象語(yǔ)義樹,并從中生成Token向量,進(jìn)一步對(duì)向量標(biāo)準(zhǔn)化,將結(jié)果輸入深度學(xué)習(xí)網(wǎng)絡(luò)中,從而得到Dockerfile文件的語(yǔ)義特征和結(jié)構(gòu)特征,并得到Dockerfile文件風(fēng)險(xiǎn)特征概率。(2)文件檢測(cè)模塊。當(dāng)待檢測(cè)的Dockerfile文件進(jìn)入后,首先通過(guò)步驟(1)訓(xùn)練好的網(wǎng)絡(luò)模型,提取到Dockerfile文件語(yǔ)義和結(jié)構(gòu)特征,然后通過(guò)模型進(jìn)行預(yù)測(cè)其是否具備風(fēng)險(xiǎn),并返回其風(fēng)險(xiǎn)概率。(3)如果該Dockerfile文件被標(biāo)記為具有風(fēng)險(xiǎn),則進(jìn)行提示并決定是否放置,如果不放置則進(jìn)行風(fēng)險(xiǎn)處理,否則使用風(fēng)險(xiǎn)控制放置算法將由Dockerfile文件生成的鏡像放置到集群中,如果Dockerfile文件被標(biāo)記為無(wú)風(fēng)險(xiǎn),則通過(guò)容器集群進(jìn)行負(fù)載均衡放置。(4)容器集群。容器集群負(fù)責(zé)鏡像的接收和處理,決定使用基于風(fēng)險(xiǎn)控制的放置算法或者負(fù)載均衡對(duì)鏡像進(jìn)行放置,容器集群為容器安全檢測(cè)的處理對(duì)象。
本節(jié)主要分為風(fēng)險(xiǎn)預(yù)測(cè)算法的模型構(gòu)建和Dockerfile文件的風(fēng)險(xiǎn)預(yù)測(cè)兩個(gè)部分,其中風(fēng)險(xiǎn)預(yù)測(cè)的模型訓(xùn)練是利用CNN?FPN深度學(xué)習(xí)模型提取Dockerfile文件的語(yǔ)義和結(jié)構(gòu)特征并進(jìn)行風(fēng)險(xiǎn)概率預(yù)測(cè);Dockerfile文件的風(fēng)險(xiǎn)預(yù)測(cè)是利用訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)模型對(duì)Dockerfile文件進(jìn)行分類預(yù)測(cè),然后結(jié)合容器集群放置方法將Docker鏡像放置到集群中。
抽象語(yǔ)法樹(AST)是一種以樹的形式充分體現(xiàn)代碼語(yǔ)法和語(yǔ)義結(jié)構(gòu)的抽象表示[22]。樹上的每個(gè)節(jié)點(diǎn)都是代碼中的一種結(jié)構(gòu)。在Dockerfile文件中,局部的微小差別就可能導(dǎo)致巨大差異,甚至存在巨大漏洞。深度學(xué)習(xí)架構(gòu)可以有效地捕獲復(fù)雜性高的非線性特征。利用深度神經(jīng)網(wǎng)絡(luò)可以從Dockerfile文件的AST中提取Token向量并從中學(xué)習(xí)語(yǔ)義和結(jié)構(gòu)特征。卷積神經(jīng)網(wǎng)絡(luò)(CNN)可以更好地捕獲局部的差異,因此 CNN能夠更好地檢測(cè)局部模式[23]。CNN已經(jīng)被充分地證明適應(yīng)于圖像分類、自然語(yǔ)言處理等領(lǐng)域,近些年常被用于文本的分類,對(duì)于英語(yǔ)文本數(shù)據(jù)的分類有很好的效果,在大部分的數(shù)據(jù)集上的分類準(zhǔn)確性都超過(guò)了傳統(tǒng)的SVM等模型。CNN的稀疏連通性和共享權(quán)重兩個(gè)關(guān)鍵特征可以幫助更好地從Dockerfile文件中獲取到其語(yǔ)義和結(jié)構(gòu)特征。但通常情況下CNN網(wǎng)絡(luò)結(jié)構(gòu)中對(duì)應(yīng)的stride一般比較大,會(huì)忽略待檢測(cè)文件中小物體的檢測(cè),導(dǎo)致小物體檢測(cè)性能急劇下降。因此引入特征金字塔網(wǎng)絡(luò)(FPN),解決檢測(cè)中的多尺度問(wèn)題,通過(guò)對(duì)CNN網(wǎng)絡(luò)進(jìn)行簡(jiǎn)單的網(wǎng)絡(luò)連接改變,在不增加原有模型計(jì)算量的情況下,通過(guò)對(duì)高層網(wǎng)絡(luò)特征進(jìn)行上采樣和低層網(wǎng)絡(luò)特征進(jìn)行自頂向下的連接及每一層都進(jìn)行預(yù)測(cè)的方法,提升小物體的檢測(cè)性能。由此可見(jiàn),F(xiàn)PN可以在CNN網(wǎng)絡(luò)結(jié)構(gòu)的基礎(chǔ)上進(jìn)一步獲取更加準(zhǔn)確的Dockerfile文件語(yǔ)義和結(jié)構(gòu)特征,從而提升檢測(cè)的準(zhǔn)確率。
基于CNN?FPN網(wǎng)絡(luò)的Dockerfile文件風(fēng)險(xiǎn)預(yù)測(cè)算法首先需要將Dockerfile文件解析為AST,然后選擇AST上關(guān)鍵節(jié)點(diǎn)形成Token向量,由于CNN?FPN的輸入形式是整數(shù)向量,進(jìn)一步對(duì)Token向量進(jìn)行統(tǒng)一標(biāo)準(zhǔn)化,將其轉(zhuǎn)化為整數(shù)向量,最后將整數(shù)向量輸入到CNN?FPN中。CNN?FPN會(huì)根據(jù)輸入的向量自動(dòng)生成Dockerfile文件的語(yǔ)義和結(jié)構(gòu)特征?;贑NN?FPN網(wǎng)絡(luò)的Dockerfile文件風(fēng)險(xiǎn)預(yù)測(cè)工作流程如圖2所示。
圖2 基于CNN?FPN網(wǎng)絡(luò)的Dockerfile文件風(fēng)險(xiǎn)預(yù)測(cè)工作流程
解析Dockerfile文件:為了CNN?FPN網(wǎng)絡(luò)結(jié)構(gòu)能夠有效地捕獲復(fù)雜性高的非線性特征,首先對(duì)Dockerfile文件中的信息進(jìn)行篩選,以區(qū)別重要的語(yǔ)義和結(jié)構(gòu)信息。為了將每個(gè)Dockerfile文件表示為向量,只有AST上的節(jié)點(diǎn)才是構(gòu)建Dockerfile文件表示的合適粒度,既保留了語(yǔ)法信息又保留了結(jié)構(gòu)信息。選擇 Dockerfile文件中重要指令集包括FROM、RUN、CMD、apt?get等和控制流節(jié)點(diǎn)如 if、for等作為Token向量。排除不屬于以上類別的AST節(jié)點(diǎn),因?yàn)樘砑铀鼈兛赡軙?huì)減弱其他節(jié)點(diǎn)的重要性。通過(guò)上述操作,將每個(gè)Dockerfile文件轉(zhuǎn)換為Token向量。如圖3所示,是一個(gè)簡(jiǎn)單的Dockerfile文件。其 Token向量為{[FROM][MAINTAINER][RUN][echo][RUN][apt?get][RUN][echo][CMD]}。
圖3 Dockerfile文件
Token向量標(biāo)準(zhǔn)化:由于CNN需要數(shù)值向量形式作為輸入,并且輸入向量長(zhǎng)度必須相同。所以提取的Token向量無(wú)法直接作為CNN的輸入。為了解決此問(wèn)題,首先在Token向量和整數(shù)之間進(jìn)行映射,對(duì)Token向量進(jìn)行標(biāo)準(zhǔn)化,將Token向量編碼為整數(shù)向量。每個(gè)Token向量對(duì)應(yīng)唯一的整數(shù)標(biāo)識(shí)符,即不同的指令或控制流節(jié)點(diǎn)對(duì)應(yīng)不同的整數(shù)標(biāo)識(shí)符,整數(shù)標(biāo)識(shí)符從1開始至Token向量類型的總數(shù)結(jié)束。由于不同的Dockerfile文件內(nèi)容不同,所以提取到的Token向量長(zhǎng)度不同,向量進(jìn)一步標(biāo)準(zhǔn)化后得到的整數(shù)向量長(zhǎng)度不同,因此在每個(gè)整數(shù)向量后添加0作為補(bǔ)充,使它們的長(zhǎng)度與最長(zhǎng)向量一致。圖3的Dockerfile文件對(duì)應(yīng)的整數(shù)向量為{[1][2][3][4][3][5][3][4][6]}。 通過(guò)此方法得到的整數(shù)向量可以輸入CNN模型并且保持了原有Token向量順序不變,保留了原本的結(jié)構(gòu)信息。
建立 CNN?FPN網(wǎng)絡(luò)模型:要區(qū)分安全的Dockerfile文件和存在安全漏洞的Dockerfile文件的語(yǔ)義和結(jié)構(gòu)特征,首先需要訓(xùn)練數(shù)據(jù)來(lái)構(gòu)建CNN?FPN模型輸出其特征,即訓(xùn)練CNN?FPN中的權(quán)重和偏差。CNN?FPN訓(xùn)練分為“自底向上”過(guò)程和“自上而下”過(guò)程,其中“自底向上”過(guò)程是指神經(jīng)網(wǎng)絡(luò)普通的正向傳播,特征圖經(jīng)過(guò)卷積核和最大池化操作不斷縮??;“自上而下”過(guò)程是對(duì)高層網(wǎng)絡(luò)的特征圖進(jìn)行上采樣操作,然后將上采樣得到的特征橫向連接上一層空間大小相同的特征圖并進(jìn)行預(yù)測(cè),這樣一方面加強(qiáng)了高層特征,另一方面每一層的預(yù)測(cè)都融合了不同分辨率,可以完成不同大小分辨率的檢測(cè),保證每一層都有合適的強(qiáng)語(yǔ)義和結(jié)構(gòu)特征。
網(wǎng)絡(luò)模型使用Inception Net網(wǎng)絡(luò)結(jié)構(gòu),一層可能會(huì)有多個(gè)尺寸的卷積核,在同一個(gè)位置但在不同通道的卷積核輸出結(jié)果相關(guān)性極高。在同一個(gè)空間位置,不同通道的特征結(jié)合起來(lái)。而不同尺寸的卷積核可以保證特征的多樣性。使用Word2vec詞嵌入作為第一層,它將整數(shù)轉(zhuǎn)換為固定大小的實(shí)值向量。簡(jiǎn)單索引不會(huì)攜帶太多有關(guān)從AST中提取的Token向量的上下文信息。詞嵌入根據(jù)每個(gè)Token向量的上下文進(jìn)行訓(xùn)練,每個(gè)Token都要學(xué)習(xí)一個(gè)特征向量,并且出現(xiàn)在相似上下文中的令牌往往由相似的向量表示,這些向量表示在特征空間中的距離很近。CNN?FPN特征提取過(guò)程如圖4所示。
圖4 CNN?FPN網(wǎng)絡(luò)風(fēng)險(xiǎn)預(yù)測(cè)過(guò)程
假設(shè)CNN?FPN網(wǎng)絡(luò)輸入的是矩陣A,經(jīng)過(guò)F1個(gè)卷積核(i=1,2,…,F(xiàn)1)的卷積生成F1個(gè)特征圖,其中 conv2(A,B′,valid′)被稱作窄卷積,為該層的激活函數(shù)。
接著,進(jìn)入最大池層進(jìn)行池化操作,由于池化又稱下采樣,所以用S=βdown(C)+b表示。
然后,對(duì)特征圖進(jìn)行上采樣操作,此處使用最鄰近元法,將距離待求點(diǎn)最近的臨像素灰度賦予待求點(diǎn)。將上采樣得到的特征圖與上一層空間大小相同的特征圖進(jìn)行橫向連接。
重復(fù)上述操作,直到進(jìn)入全連接層,將最后得到的順序展開成向量,有序連接成一個(gè)長(zhǎng)向量,作為全連接層的輸入。
為了讓神經(jīng)網(wǎng)絡(luò)具有非線性的擬合能力,在每一層的輸出后面都添加一個(gè)激活函數(shù),其中輸出層使用Sigmoid激活函數(shù),見(jiàn)式(5),其余層使用ReLU激活函數(shù),見(jiàn)式(6)。使用反向傳播與梯度下降優(yōu)化調(diào)整CNN?FPN網(wǎng)絡(luò)中的參數(shù)。通過(guò)Keras快速地構(gòu)建神經(jīng)網(wǎng)絡(luò)。得到CNN?FPN網(wǎng)絡(luò)后,將測(cè)試數(shù)據(jù)向量化后的整數(shù)向量輸入到CNN?FPN網(wǎng)絡(luò)中,然后CNN?FPN的輸出層獲得測(cè)試文件的存在安全風(fēng)險(xiǎn)概率。
預(yù)測(cè)主要分為兩部分:待檢測(cè)Dockerfile文件輸入到訓(xùn)練好的網(wǎng)絡(luò)模型中預(yù)測(cè)的風(fēng)險(xiǎn)概率;根據(jù)風(fēng)險(xiǎn)概率將Dockerfile文件通過(guò)不同的方式放置到集群中。具體來(lái)說(shuō),首先將測(cè)試數(shù)據(jù)集中的Dockerfile文件輸入到訓(xùn)練好的CNN?FPN網(wǎng)絡(luò)模型中進(jìn)行風(fēng)險(xiǎn)預(yù)測(cè)并返回風(fēng)險(xiǎn)概率,如果該Dockerfile文件不存在風(fēng)險(xiǎn)或風(fēng)險(xiǎn)概率極低,生成Docker鏡像后可以通過(guò)負(fù)載均衡放置到集群中,如果該Dockerfile文件風(fēng)險(xiǎn)概率較高,會(huì)進(jìn)行風(fēng)險(xiǎn)提示。如果用戶決定不放置,則進(jìn)行風(fēng)險(xiǎn)處理,否則通過(guò)一定的風(fēng)險(xiǎn)控制放置算法改進(jìn)Docker集群分配策略,從而使具有風(fēng)險(xiǎn)的容器難以與安全容器共同定位,提高容器集群整體的安全性。
Dockerfile文件風(fēng)險(xiǎn)預(yù)測(cè):首先通過(guò)上述的特征提取方法對(duì)待檢測(cè)的Dockerfile文件進(jìn)行處理,將其解析為AST樹,提取其Token向量并進(jìn)行向量標(biāo)準(zhǔn)化;然后將處理后的向量輸入到構(gòu)建好的CNN?FPN網(wǎng)絡(luò),CNN?FPN網(wǎng)絡(luò)經(jīng)過(guò)內(nèi)部計(jì)算會(huì)返回用戶該Dockerfile文件是否存在風(fēng)險(xiǎn)及其概率,并提示用戶進(jìn)行風(fēng)險(xiǎn)處理。
風(fēng)險(xiǎn)控制放置:當(dāng)待檢測(cè)的Dockerfile文件通過(guò)CNN?FPN網(wǎng)絡(luò),判斷其是否具備風(fēng)險(xiǎn)并輸出其風(fēng)險(xiǎn)概率后,如果Dockertfile文件不存在風(fēng)險(xiǎn)或風(fēng)險(xiǎn)較小,集群會(huì)通過(guò)負(fù)載均衡將容器放入。如果Dockerfile文件風(fēng)險(xiǎn)較大,會(huì)進(jìn)行風(fēng)險(xiǎn)提示,并且如果決定對(duì)鏡像進(jìn)行放置,則會(huì)通過(guò)一定風(fēng)險(xiǎn)控制放置(PSSF)算法放入到集群中,該風(fēng)險(xiǎn)控制放置算法[24-25]定量描述了集群安全性、工作負(fù)載、能耗之間的關(guān)系,如式(7)所示,不僅大大降低了存在風(fēng)險(xiǎn)的容器與其他安全容器共存的可能性,而且可以滿足工作負(fù)載平衡和能耗方面的限制。
其中,S表示安全性,W′表示工作負(fù)載,P表示能耗。在K個(gè)主機(jī)H={h1,h2,…,hK}的云計(jì)算系統(tǒng)中,M個(gè)用戶U={u1,u2,…,uM},啟動(dòng)N個(gè)容器D={d1,d2,…,dN}。如果將每個(gè)用戶的容器分配到特定的主機(jī)上,XD×H×U-{xd,h,u|xd,h,u-1,if Dockerdof useruis allocated to hosth}。N?和K?為預(yù)先確定的閾值。
1臺(tái)基于x86平臺(tái)的物理服務(wù)器,配置參數(shù)為Intel Core i7 CPU 3.7 GHz、32 GB內(nèi)存以及千兆網(wǎng)卡;在該物理服務(wù)器上采用VMware Workstation Pro進(jìn)行虛擬化,共虛擬出3臺(tái)主機(jī),具體配置和功能如表1所示。
表1 虛擬機(jī)配置和功能
為了保證數(shù)據(jù)的客觀性,本實(shí)驗(yàn)用爬蟲從GitHub上采集了3 183個(gè)Dockerfile文件,經(jīng)過(guò)初步排重,共計(jì)有效Dockerfile文件2 706個(gè),包含不同類型和版本的Dockerfile文件。本實(shí)驗(yàn)采用手動(dòng)標(biāo)注數(shù)據(jù)的方式,將數(shù)據(jù)集分為存在風(fēng)險(xiǎn)和不存在風(fēng)險(xiǎn)兩類,其中存在風(fēng)險(xiǎn)的Dockerfile文件有902個(gè),不存在風(fēng)險(xiǎn)的Dockerfile文件有1 804個(gè)。在此基礎(chǔ)上,隨機(jī)抽取80%的數(shù)據(jù)作為訓(xùn)練集,剩余的20%作為測(cè)試集。
為了評(píng)價(jià)預(yù)測(cè)的準(zhǔn)確率,使用了在分類問(wèn)題中采用的重要評(píng)價(jià)指標(biāo):精準(zhǔn)率(Precision,P)、召回率(Recall,R)、F 值(F?measure,F(xiàn))。 首先定義有關(guān)精準(zhǔn)率、召回率和F值的相關(guān)參數(shù)。Nr→r代表將存在風(fēng)險(xiǎn)的Dockerfile文件正確預(yù)測(cè)為存在風(fēng)險(xiǎn)的數(shù)量;Nr→s代表將存在風(fēng)險(xiǎn)的Dockerfile文件錯(cuò)誤預(yù)測(cè)為安全的數(shù)量;Ns→r代表將安全的Dockerfile文件錯(cuò)誤預(yù)測(cè)為存在風(fēng)險(xiǎn)的數(shù)量。
精準(zhǔn)率:正確分類為存在風(fēng)險(xiǎn)的Dockerfile文件數(shù)量與分類為存在風(fēng)險(xiǎn)的Dockerfile文件數(shù)量的比。
召回率:正確分類為存在風(fēng)險(xiǎn)的Dockerfile文件數(shù)量與真正存在風(fēng)險(xiǎn)的Dockerfile文件數(shù)量的比。
F值:F值是精確率和召回率的調(diào)和平均值。
主要從兩個(gè)方面來(lái)驗(yàn)證實(shí)驗(yàn),一方面驗(yàn)證本文中所使用算法的可行性和有效性。另一方面通過(guò)在不同的特征提取方法下比較本文所使用的算法與傳統(tǒng)機(jī)器學(xué)習(xí)算法的優(yōu)劣情況,通過(guò)精確率、召回率和F值的變化來(lái)驗(yàn)證本文使用算法的優(yōu)越性。
4.3.1 DRPA算法可行性和有效性實(shí)驗(yàn)
本實(shí)驗(yàn)的目的是驗(yàn)證DRPA算法中對(duì)Dockerfile文件風(fēng)險(xiǎn)預(yù)測(cè)的可行性和有效性。實(shí)驗(yàn)結(jié)果分別如圖5、圖6所示。通過(guò)計(jì)算量FLOPs和參數(shù)量params來(lái)衡量本文給出方法的時(shí)間效率和空間復(fù)雜度。一般情況下,更深的網(wǎng)絡(luò)有更大的計(jì)算量,并且數(shù)據(jù)越多,計(jì)算時(shí)間越長(zhǎng)。Inception Net相比于其他的一些網(wǎng)絡(luò)結(jié)構(gòu)來(lái)說(shuō),在同樣參數(shù)量的情況下更有效率。不同組之間的特征不進(jìn)行交叉計(jì)算,減少了計(jì)算量。通常卷積層的參數(shù)數(shù)目為:KW?Kh?Ci?CO,其中,KW和Kh分別為卷積核的長(zhǎng)寬,Ci和CO分別為輸入和輸出通道數(shù);全連接層的參數(shù)數(shù)目為Ci?CO。根據(jù)本文中使用的CNN?FPN網(wǎng)絡(luò)結(jié)構(gòu),對(duì)參數(shù)量進(jìn)行計(jì)算結(jié)果為:1 653.7×103。對(duì)比相同深度的普通結(jié)構(gòu)的參數(shù)量減少30%左右。在Inception Net網(wǎng)絡(luò)中卷積層的計(jì)算量為((KW?Kh)?Ci)?((Ow?Oh)?CO),其中Ow和Oh分別為輸出的長(zhǎng)和寬。根據(jù)對(duì)本文中使用的CNN?FPN網(wǎng)絡(luò)結(jié)構(gòu),對(duì)計(jì)算量進(jìn)行計(jì)算結(jié)果為:827×106。最后,針對(duì)本文所提出的DRPA算法進(jìn)行多次測(cè)量并取平均,預(yù)測(cè)時(shí)間為0.174 s。
根據(jù)Dockerfile文件的大小,本算法中使用L2損失函數(shù),其對(duì)較大誤差的懲罰力度更大,對(duì)較小誤差更為容忍。圖5描述了隨著DRPA算法迭代次數(shù)的增加,損失函數(shù)呈下降趨勢(shì),最后降至0.8左右;從圖6中可以看出,隨著迭代次數(shù)的不斷增加,DRPA算法的準(zhǔn)確度呈上升趨勢(shì),達(dá)到0.82左右。可以看出,隨著DRPA算法不斷地訓(xùn)練,模型在不斷地優(yōu)化,輸出結(jié)果與真實(shí)結(jié)果之間的差異越小,預(yù)測(cè)準(zhǔn)確率也越高。
圖5 DRPA算法的損失函數(shù)圖
圖6 DRPA算法的預(yù)測(cè)準(zhǔn)確度圖
4.3.2 不同特征提取方法下不同算法的對(duì)比實(shí)驗(yàn)
將本文所使用的算法與傳統(tǒng)機(jī)器學(xué)習(xí)算法支持向量機(jī)(SVM)和傳統(tǒng)CNN網(wǎng)絡(luò)進(jìn)行比較。并在不同的特征提取方法下對(duì)比精準(zhǔn)率、召回率和F值的變化,其中本文所使用算法的特征提取工具為Word2vec,即方案 A為對(duì)比的基準(zhǔn)算法,如表 2所示。
表2 不同特征提取方法下不同算法的對(duì)比
在特征提取方法方面,通過(guò)比較方案A、方案D或方案B、方案E或方案C、方案F可以看出,無(wú)論使用何種分類器,Word2vec方法都要優(yōu)于TF?IDF方法。在分類器方面,通過(guò)前3組的數(shù)據(jù)或后3組的數(shù)據(jù)可知在特征提取方法相同的情況下,本文所使用的 CNN+FPN算法要優(yōu)于傳統(tǒng)的CNN算法和SVM算法。
文中提供了提高Dokcer安全性的新視角。提出了一種基于深度學(xué)習(xí)的Docker特征提取風(fēng)險(xiǎn)預(yù)測(cè)框架,針對(duì)Dockerfile文件的安全性這一問(wèn)題,從源頭進(jìn)一步控制風(fēng)險(xiǎn),減少了Docker鏡像的漏洞,保證了容器和容器集群的安全。同時(shí),本文提出一種基于深度學(xué)習(xí)的Docker風(fēng)險(xiǎn)特征提?。―RPA)算法,該算法利用CNN?FPN網(wǎng)絡(luò)提取Dockerfile文件的語(yǔ)義和結(jié)構(gòu)特征,并判斷其是否存在風(fēng)險(xiǎn)及風(fēng)險(xiǎn)概率,得到風(fēng)險(xiǎn)概率后根據(jù)用戶需求進(jìn)行下一步工作。通過(guò)實(shí)驗(yàn)可以看出,該算法針對(duì)Dockerfile文件是否存在風(fēng)險(xiǎn)的預(yù)測(cè)正確率達(dá)82%。但是還有一些工作可以在后續(xù)繼續(xù)展開,具體如下:
(1)本文使用的數(shù)據(jù)集將Dockerfile文件分為存在風(fēng)險(xiǎn)和不存在風(fēng)險(xiǎn)兩種標(biāo)記,在后續(xù)工作中,可以繼續(xù)細(xì)分存在風(fēng)險(xiǎn)的Dockerfile文件的類型,標(biāo)記為多分類。
(2)目前使用的數(shù)據(jù)集為手工標(biāo)記,還存在雜亂等問(wèn)題,在后續(xù)工作中,對(duì)數(shù)據(jù)集進(jìn)行進(jìn)一步地清洗。
(3)在本文提出的框架上進(jìn)一步完善,將預(yù)測(cè)式和響應(yīng)式相結(jié)合。