Docker 镜像安全
鏡像安全的最佳實(shí)踐
在開發(fā)的時(shí)候,應(yīng)用要去保障安全,普通的非加密的HTTP協(xié)議就不安全,因?yàn)閿?shù)據(jù)傳輸是明文的,可以被別人看見的,沒(méi)有認(rèn)證鑒權(quán)的服務(wù)就是不安全的。
我有應(yīng)用裝到容器里面來(lái)了,那么為了保證容器鏡像的安全,我就要去看除了應(yīng)用本身是否安全,我還要看應(yīng)用所依賴的中間件是否安全,我還要看它基礎(chǔ)鏡像,比如一個(gè)操作系統(tǒng)的話,我還要知道這個(gè)操作系統(tǒng)安裝的這些包是不是安全的。
構(gòu)建指令問(wèn)題
密鑰和token:容器鏡像是到處分發(fā)的,大家可以直接將容器鏡像拉取下來(lái),一解壓就知道容器里面包含了哪些信息,因?yàn)樗褪且粋€(gè)tar包,解開來(lái)之后就可以看到里面所有的內(nèi)容,這個(gè)文件其實(shí)就是相當(dāng)于明文送給大家了,這就相當(dāng)于將用戶名和密碼給所有人了。
應(yīng)用依賴
容器運(yùn)行的時(shí)候需要的所有依賴包,都應(yīng)該在容器鏡像里面同時(shí)構(gòu)建進(jìn)來(lái)。如果是依賴的基礎(chǔ)服務(wù)本身有安全問(wèn)題,那么這個(gè)容器鏡像也是不安全的。
比如是一個(gè)java應(yīng)用,引用了log4j的library,那么其實(shí)你的應(yīng)用本身就有非常大的漏洞。
或者你的應(yīng)用長(zhǎng)時(shí)間不去更新,之前有些安全的保障手段,隨著時(shí)間的推移就變的不安全了,那么這個(gè)時(shí)候容器鏡像也會(huì)面臨風(fēng)險(xiǎn),比如openssl 1.0,隨著時(shí)間的推移都被證明不安全,其實(shí)都是有安全漏洞和版本問(wèn)題才會(huì)向前演進(jìn)。
如果應(yīng)用長(zhǎng)時(shí)間不更新還是基于老的版本這些協(xié)議,它也會(huì)有一定的安全風(fēng)險(xiǎn)。
文件問(wèn)題
當(dāng)我們將文件加載到容器鏡像里面的時(shí)候,如果這個(gè)文件自身有安全漏洞,那么本身也是有問(wèn)題的。
容器鏡像都是分層的,一旦一個(gè)文件的層級(jí)確定好之后,你在上面做任何的修改,也只是在上面增加新的層。
如果文件里面放了用戶名和密碼,一旦image鏡像推出去,那么用戶名密碼就公之于眾了,再去rm是沒(méi)有意義的。
鏡像掃描(Vulnerability Scanning)
鏡像策略準(zhǔn)入控制
在kubernetes集群里面,如何和鏡像掃描結(jié)果產(chǎn)生一個(gè)相關(guān)性,這就涉及到準(zhǔn)入控制策略了。
在準(zhǔn)入的階段分為了mutating和validating對(duì)吧,區(qū)別是一個(gè)變形和一個(gè)校驗(yàn),在validing其中有很多的plugin,其中有一個(gè)叫imagepolicyadmit的plugin,這個(gè)plugin就是用來(lái)校驗(yàn)image策略結(jié)果的這樣一個(gè)plugin,它本身會(huì)支持一個(gè)webhook,所以要將鏡像掃描結(jié)果和kubernets的準(zhǔn)入策略做好整合之后,那么就可以在用戶建立pod的時(shí)候來(lái)決定pod鏡像是否安全,是不是應(yīng)該放它過(guò)去。
上面圖在鏡像準(zhǔn)入,就有各種各樣的準(zhǔn)入的plugin,其中有個(gè)是鏡像策略就是imagepolicy,它會(huì)先收集所有的pod的鏡像,然后讓這個(gè)準(zhǔn)入控制器去查詢鏡像安全的狀態(tài),如果安全就準(zhǔn)入,不安全就攔截。
?
?
?
掃描鏡像
?首先從鏡像倉(cāng)庫(kù)將文件拉取下來(lái),然后解析鏡像的原數(shù)據(jù),然后解壓鏡像的每一個(gè)文件層,因?yàn)樗衷瓟?shù)據(jù)和blob,所以會(huì)去對(duì)兩個(gè)部分分別去做校驗(yàn),它會(huì)怎么去做校驗(yàn)?zāi)?#xff1f;它會(huì)去提取這個(gè)文件,文件解壓了之后每一層所依賴的包,可運(yùn)行程序,文件列表,這些文件內(nèi)容全部進(jìn)行掃描,然后它會(huì)將掃描結(jié)果和CVE的字典,以及我們自定義的安全策略字典做匹配,來(lái)確定這個(gè)鏡像是否是安全的。
?
鏡像掃描服務(wù)
anchore的能力是比較全的,Clair是針對(duì)harbor的做了有個(gè)很好的支撐,在harbor里面,所以在harbor里面可以在安裝的時(shí)候就直接選擇安裝Clair,在鏡像倉(cāng)庫(kù)里面就直接可以enable Clair,這樣的話所有上傳到harbor的鏡像就可以被這個(gè)鏡像倉(cāng)庫(kù)掃描到。
?
Clair架構(gòu)
前端也是HTTP interface,就類似于比如說(shuō)嵌入在harbor里面的一個(gè)界面,它也會(huì)有個(gè)通知機(jī)制,鏡像的掃描結(jié)果要告訴你,通過(guò)select channel或者發(fā)郵件告訴你,這個(gè)鏡像掃描沒(méi)過(guò)等等。這些地方的通知要有地方存儲(chǔ)。
下面就是Clair的核心組件,我們這里也維護(hù)了一些違規(guī)的漏洞表,它存儲(chǔ)在這里面,然后有image下下來(lái)之后,它會(huì)去分析每一個(gè)層級(jí),然后和自己的library去做對(duì)比,說(shuō)發(fā)現(xiàn)有沒(méi)有漏洞,如果有漏洞的話就通知用戶。
總結(jié)
以上是生活随笔為你收集整理的Docker 镜像安全的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: access前端连接mysql_用jav
- 下一篇: IDEA如何上传java项目到githu
