容器鏡像安全概述
微服務架構的興起,容器化部署已經成為時下最流行的生產方式,越來越多的公司將應用部署在基於容器的架構上。自然的,隨著容器的廣泛使用,容器的安全性就成為了業界關注的焦點,容器安全廠商如雨後春筍般相繼成立,如:CoreOSClair、AquaSecurity、Twistlock、Anchore等等。容器是基於鏡像構建的,如果鏡像本身就是一個惡意鏡像或是一個存在漏洞的鏡像,那麼基於它搭建的容器自然就是不安全的了,故鏡像安全直接決定了容器安全。
為什麼容器鏡像會產生安全問題?
在傳統的部署方式中,應用依賴於操作系統中的環境。在配置好環境後,應用可以穩定地運行。
圖1 傳統部署結構
但是隨著技術的發展,傳統部署帶來的問題越來越嚴重。因為多個應用對運行環境的不同要求,導致應用部署產生了很多出乎意料的麻煩,在瑣碎的環境問題上消耗了許多精力。
圖2 傳統部署帶來的問題
因此,容器化部署被引進以應對這種情景。容器安裝了運行時所需要的環境,並且要求開發人員將他們的應用程序及其所需的依賴關係打包到容器鏡像中。 無論其他開發人員和操作系統如何,每個開發人員都可以擁有自己的依賴版本。最終不論是用戶還是開發者都在這種部署方案中受益,開發者可以輕鬆地在不同環境中測試應用的運行情況,在發布新版本的時候也不必為環境的改變而定製升級教程;用戶在使用容器部署時也十分便利,並且不同的軟體之間也不會相互影響。
圖3 容器化部署結構
理想情況下,容器鏡像應該只包含應用程序的二進位文件及其依賴項。 然而實際上,容器鏡像往往是相當巨大的。像Ubuntu、Centos這樣被廣泛使用的基礎系統鏡像,它們包含了相當多的功能。儘管有些功能在調試部署的時候帶來了一定的便利,但是在增大的體積面前,收益極低。
圖4 容器化部署實際情況
容器實際上是不透明的,被封裝成一個個繁瑣的鏡像。
最終,當越來越多的容器被創建時,沒有人再確定容器到底裝載了什麼?實際運行著什麼?
圖5 容器部署現狀
正是因為如此,我們日常使用的鏡像面臨嚴峻的安全問題。隨著歷年來積累的CVE越來越多,很多應用都存在一些問題,在更新頻率低的鏡像中尤為嚴重。
因此,筆者做了一個測試,拉取了Docker Hub上公開熱門鏡像中的前十頁鏡像,對其使用Clair進行了CVE掃描統計。結果出乎預料。在一百多個鏡像中,沒有漏洞的只佔到24%,包含高危漏洞的佔到67%。很多我們經常使用的鏡像都包含在其中,如:Httpd,Nginx,Mysql等。
圖6 掃描示例
圖7 掃描結果統計
如何改善目前的處境?
在使用前確認鏡像的安全性,對鏡像進行分析檢測,不讓鏡像中的漏洞和惡意後門在運行的容器中給我們帶來風險。
目前Docker安全工具有很多,從多方面來維護容器的安全性,如運行時監控預警、取證、預生產分析、安裝配置校驗、信任管理等。本文主要關注於鏡像在使用之前的掃描和審計,即預生產分析類的工具。這類工具主要從CVE漏洞與惡意鏡像兩方面來對鏡像進行掃描。
接下類介紹三款有代表性的鏡像安全工具,分別針對CVE檢測,惡意鏡像產生,惡意鏡像檢測。
Clair
Clair的目標是能夠從一個更加透明的維度去看待基於容器化基礎框架的安全性、Clair是由CoreOS所推出的這樣一款針對容器鏡像的安全掃描工具。 Clair主要模塊分為Detector、Fetcher、Notifier和Webhook,Clair首先對鏡像進行特徵的提取,然後再將這些特徵匹配CVE漏洞庫,若發現漏洞則進行提示,其功能側重於掃描容器中的OS及APP的CVE漏洞。
Clair是掃描引擎,啟動後暴露API等待調用。在這裡筆者使用clairctl(一個第三方調用工具)來對Clair發出調用請求,從而完成掃描。
下圖為clairctl的基本命令介紹,基本命令如圖所示,詳情了解某一條的用法在命令後加上--help參數即可。
圖8 Clair示例
上圖使用Clair對本地(-l 參數)鏡像Centos進行了一次掃描,掃描結果為沒有漏洞,隨後生成報告,保存在/reports/html/analysis-centos-latest.heml,用瀏覽器打開即可查看詳情。
Dockerscan
Dockerscan是一個分析、攻擊工具。它可以在網路中找出鏡像倉庫所在的主機,可以在鏡像中插入木馬,可以查看鏡像中的敏感信息等等。
下圖為Dockerscan基本命令,以及一次對 223.****.210/28 這個小網段進行一次探測容器倉庫掃描。探測發現兩台網易的容器倉庫。
圖9 Dockerscan掃描示例
下圖為獲取mysql_origin鏡像的基本信息,可以看到該鏡像被植入一個反彈shell,接收shell的埠為2222,地址為10.****.8。
圖10 Dockerscan查看鏡像信息
下圖為利用Dockerscan攻擊受害者的流程,將木馬植入正常鏡像Nginx中,當用戶運行該鏡像時,攻擊者就會接收到反彈出的shell,從而達到控制伺服器的目的。
圖11 Dockescan攻擊鏈
下圖為使用實例,白窗為Dockerscan容器,黑窗為容器所在宿主機,宿主機/tmp目錄掛載在容器~/images 目錄。首先在宿主機/tmp目錄下將鏡像保存為文件(docker save -o filename imagename),然後再容器中可以看到該鏡像文件,然後使用dockerscan修改鏡像,將木馬植入該鏡像,接受地址設置為10.****.8(我的宿主機),埠為2222,保存為evil.tar(植入木馬的mysql鏡像文件),隨後在本地監聽2222埠(nc -v -k -l 2222),然後再宿主機導入注入木馬的鏡像(docker load -i evil.tar),隨後運行該鏡像,監聽埠隨即收到反彈出的shell,執行命令測試。
圖12 Dockerscan使用示例
Anchore
Clair能掃描出一個鏡像中的所有CVE漏洞,但現在有一種情況,黑客使用最新版無漏洞的OS鏡像,然後在其之上安裝後門木馬,或執行惡意命令,這樣Clair就不能檢測其安全性了。
這時就要介紹一個分析工具Anchorele,與Clair不同,Anchore側重於對鏡像的審計,其有強大的對鏡像的解析能力。在分析之後可以對鏡像進行多種操作,內置了許多腳本,用途廣泛。
下圖為Anchore使用命令截圖,初次使用要先使用feeds list和 feeds sync來同步漏洞庫。接下來有使用示例命令,在這裡不多做介紹了。在有想了解的命令時,加上--help參數即可查看詳細介紹。
圖13 Anchore使用命令
這裡介紹幾個常用的命令,query命令是調用已有模塊對鏡像進行相應的操作,調用不同的腳本需要不同的參數。接下來調用一個模塊做演示。
圖14 Anchore query功能
在這裡,我們想調用show-file-diffs模塊來對比兩個鏡像的差別,在之前,我們需要首先先分析兩個鏡像mysql:evil 和 origin:origin,這是上個環節使用dockerscan生成的惡意鏡像和原始鏡像。接下來調用該模塊,可以看到差別是在/usr/share/lib目錄下多了一個反彈shell的文件。
圖15 Anchore 示例
下圖是toolbox命令的詳情,裡面有一些使用的小工具,接下里我們嘗試幾個命令。show-familytree 、 show-taghistory、show-layers、show-dockerfile,來查看鏡像registry的鏡像關係,版本歷史,鏡像的層,還有鏡像構建文件。
圖16 Anchore功能示例
圖17 Anchore功能示例
小結
鏡像安全決定了容器安全,而目前Docker Hub上的鏡像76%都存在漏洞,所以我們使用鏡像運行容器前,一定要對鏡像鏡像進行掃描,從而提高安全性。
內容編輯:雲安全實驗室 吳銘鑫 責任編輯:肖晴
TAG:綠盟科技研究通訊 |