<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          關(guān)于容器鏡像安全,你做對了嗎? | IDCF

          共 5710字,需瀏覽 12分鐘

           ·

          2021-05-11 15:58


          來源:CIO Talk

          作者:馬景賀 

          容器在近些年變得炙手可熱,提到容器就不能不提到鏡像,如果說容器是云計(jì)算時(shí)代的核心內(nèi)容之一,那么鏡像就是容器這個(gè)核心的靈魂。所以鏡像的安全也就顯得尤為重要。
          但是從下面的幾組數(shù)據(jù)可以看到:鏡像的安全問題卻不那么令人樂觀。
          1) Linux OS的漏洞呈逐年上漲趨勢
          從2008年的不到300+,上升至2018年的2000+。而且近兩年呈指數(shù)級(jí)上升趨勢。
          2) 高危漏洞數(shù)量呈逐年上漲趨勢
          從2014年的不到2000+,上升至2018年的4000+。
          3) Docker 鏡像普遍存在漏洞
          最受歡迎的鏡像比如nginx,ubuntu,java等普遍存在漏洞,且多達(dá)數(shù)十個(gè)。
          4) 40%的受訪者表示,沒有在CI階段采取任何安全手段。
          因此,保證鏡像安全,不僅是保障云平臺(tái)安全的重要一環(huán),更是DevSecOps治理體系中一個(gè)重要的話題。

          一、鏡像的特點(diǎn)



          鏡像的本質(zhì)、鏡像的來源以及鏡像的制作共同造就了鏡像的以下幾個(gè)特點(diǎn):
          • 復(fù)雜性
          鏡像內(nèi)容的復(fù)雜性(既包括一些OS的各種庫、包,又包含一些Python或者Ruby等文件)、來源的復(fù)雜性(官方的、個(gè)人的)、Dockerfile 命令的復(fù)雜性(ADD和COPY的區(qū)別使用,CMD和ENTRYPOINT的區(qū)別使用,命令順序不同造就不同的鏡像)使得鏡像本身就變得非常復(fù)雜,如果考慮安全因素,那就更加復(fù)雜了。
          • 便捷性
          鏡像的制作是非常方便的,只要會(huì)寫Dockerfile,就能制作出鏡像,或者也可將既有容器制作成一個(gè)鏡像。而且鏡像的使用也是非常方便的,一個(gè)命令(docker run)就能將一個(gè)靜態(tài)的鏡像轉(zhuǎn)變?yōu)橐粋€(gè)動(dòng)態(tài)的容器,恰恰是這種便捷性造成了鏡像的另外一個(gè)特點(diǎn),也就是下面的混亂性。
          • 混亂性
          人人可制作鏡像,人人可管理鏡像,也就使得鏡像的種類、數(shù)量都是異常龐大的,而且針對某個(gè)特定功能的鏡像可達(dá)幾十個(gè),甚至上百個(gè),既有官方的,又有個(gè)人的,既有共有倉庫的,又有私有倉庫的。沒有一個(gè)行之有效的標(biāo)準(zhǔn)去規(guī)范的管理這些鏡像,就使得鏡像良莠不齊,選用時(shí)較為困難。
          上述的特點(diǎn)也就使得鏡像的安全變成了一個(gè)復(fù)雜且容易被忽略的點(diǎn)。然而再復(fù)雜,也有手段去完成這個(gè)復(fù)雜的工作,也就是下面要講的鏡像掃描。

          二、鏡像掃描在SDLC中的位置



          鏡像掃描是保證鏡像安全的一個(gè)強(qiáng)有力手段,其通常發(fā)生在軟件開發(fā)生命周期(SDLC: Software Development Life Cycle)的構(gòu)建階段,如下所示:
          現(xiàn)有的鏡像掃描大都是依賴于鏡像倉庫提供的掃描功能(內(nèi)置鏡像掃描工具),一般流程如下:
          1. 開發(fā)人員提交代碼變更;
          2. 觸發(fā)一個(gè)構(gòu)建流程;
          3. 進(jìn)行鏡像構(gòu)建(docker build);
          4. 鏡像鏡像推送(docker push);
          5. 進(jìn)行鏡像掃描(利用鏡像倉庫內(nèi)置掃描工具進(jìn)行);
          6. 進(jìn)行鏡像部署(docker run)。
          這種流程有諸多弊端:
          • 掃描滯后
          鏡像的掃描依賴于鏡像倉庫自帶的鏡像掃描功能,只有鏡像推送至鏡像倉庫才會(huì)進(jìn)行鏡像掃描,這種滯后的掃描會(huì)導(dǎo)致倉庫中保存有漏洞的鏡像。在DevSecOps中,希望做到的是:鏡像倉庫中存儲(chǔ)的是安全的、可隨時(shí)部署的鏡像。
          • 不能有效的終止CI/CD流程
          成熟的DevSecOps CI/CD 應(yīng)該是:當(dāng)檢測到鏡像是不安全的,那么就應(yīng)該立即終止CI/CD流程,防止不安全的鏡像被部署到環(huán)境中。這種依賴于鏡像倉庫自帶掃描功能的滯后鏡像掃描,沒有辦法做到這一點(diǎn),因?yàn)殓R像推送之后的掃描,和鏡像的部署是同時(shí)進(jìn)行的。
          • 浪費(fèi)資源
          鏡像是要占據(jù)一定的磁盤空間的(有些鏡像大小上百M(fèi),甚至上G),在鏡像倉庫中保存有大量有漏洞的鏡像,就會(huì)占據(jù)大量的磁盤空間,使倉庫的使用成本上升。

          三、鏡像掃描前置



          基于掃描滯后的不足,鏡像掃描的前置就顯得尤為重要了,將鏡像掃描的操作前置(如下圖綠色虛線方框所示):
          讓其位于鏡像構(gòu)建之后,鏡像推送之前,這樣一旦一個(gè)鏡像掃描結(jié)束,如果其結(jié)果是安全的,那么就順利進(jìn)行后續(xù)的操作(推送至鏡像倉庫并進(jìn)行鏡像部署);如果掃描結(jié)果是不安全的,那么就立即終止該CI/CD流程,并通知相應(yīng)的人員。這樣就防止了不安全鏡像推送至鏡像倉庫。保證鏡像倉庫中存儲(chǔ)的鏡像都是安全的,而且節(jié)省了磁盤空間。同時(shí),前置掃描對鏡像的操作空間會(huì)變得更大,比如可以對鏡像做一些黑白名單、RBAC(Role Based Access Control)權(quán)限控制等。
          對于前置的鏡像掃描操作,就需要借助一些現(xiàn)有的鏡像掃描工具來幫助我們完成這個(gè)操作。這些工具既有大家耳熟能詳?shù)腃lair,也有一些新貴比如Anchore,Trivy等,關(guān)于這些工具的具體使用和對比,會(huì)在后期有有一篇專門的文章來分析。
          鏡像掃描只是幫助我們,發(fā)現(xiàn)鏡像問題,然后解決鏡像問題,這只是鏡像問題的治療手段,然而對于鏡像問題,最好是要做到防止問題發(fā)生,也就是在構(gòu)建鏡像的時(shí)候,盡可能的根據(jù)一些最佳實(shí)踐來構(gòu)建一些盡量安全的鏡像,這也就是我們接下來要講的鏡像安全的一些最佳實(shí)踐。這樣通過預(yù)防為主,防治結(jié)合(防:根據(jù)最佳實(shí)踐構(gòu)建安全鏡像;治:嵌入CI/CD中的前置鏡像掃描)的方法來確保鏡像的安全。

          四、容器鏡像安全最佳實(shí)踐



          4.1 盡量選擇輕量的基礎(chǔ)鏡像
          每個(gè)鏡像都有一個(gè)基礎(chǔ)鏡像,也就是在 Dockerfile中的 FROM 中指定的鏡像,一般這個(gè)基礎(chǔ)鏡像就是一個(gè)Linux發(fā)行版,比如alpine,ubuntu等。在為一個(gè)新項(xiàng)目選取基礎(chǔ)鏡像的時(shí)候,應(yīng)該考慮這個(gè)項(xiàng)目的運(yùn)行是否需要一個(gè)全量的操作系統(tǒng)(包含各種庫),如果說alpine就能能滿足要求,就不要選擇ubuntu這個(gè)相對龐大的操作系統(tǒng),作為新項(xiàng)目的基礎(chǔ)鏡像。不同量級(jí)的操作系統(tǒng),除了有鏡像大小的區(qū)別,更重要的是,操作系統(tǒng)包含的文件系統(tǒng)越多,攻擊面也就越大,包含的漏洞也就越多。 
          用Anchore對 openjdk:8-jdk-alpine和openjdk:8-jdk進(jìn)行掃描,結(jié)果顯示openjdk:8-jdk有128個(gè)漏洞,而openjdk:8-jdk-alpine卻只有48個(gè)。而且openjdk:8-jdk-alpine的鏡像大小僅為openjdk:8-jdk的三分之一不到。
          4.2 添加非root用戶,以最小授權(quán)用戶運(yùn)行容器
          容器是和宿主機(jī)共享內(nèi)核的,如果以root用戶啟動(dòng)容器,也就意味著容器是有root權(quán)限去操作宿主機(jī),這樣就使得宿主機(jī)的受攻擊面增大,潛在威脅系數(shù)提高。因此,應(yīng)該指定一個(gè)非root的特定用戶,然后以此特定用戶來啟動(dòng)容器。如果是通過Dockerfile的方式來構(gòu)建鏡像,可以在Dockerfile中添加如下代碼,來添加一個(gè)位于特定group的特定用戶,并以此特定用戶來啟動(dòng)容器:
          FROM your_base_image
          RUN groupadd -r devsecops && useradd -r -g devops devsecops
          USER devsecops
          ......(your other dockerfile steps)
          4.3 不要將敏感信息暴漏在鏡像中
          不要將token,密碼,ssh key等敏感信息,存儲(chǔ)在鏡像中,一旦鏡像被推送至公共鏡像倉庫,那么就會(huì)造成上述敏感信息的泄漏。結(jié)果將是災(zāi)難性的。如果在鏡像中必須要用到一些敏感信息,可以采用docker提供的secret功能,或者通過多階段構(gòu)建來完成。具體的使用可以參考docker官網(wǎng)。
          4.4 不要安裝不需要的包
          很多鏡像中都通過"apt-get update && apt-get install xxx" 或者"yum update && yum install xxx"的方式來安裝軟件包,但是切記:只安裝與應(yīng)用程序運(yùn)行有關(guān)的包,不要安裝非必須的包。比如在數(shù)據(jù)庫鏡像中安裝vim。安裝的包越多,鏡像的復(fù)雜性就越高,依賴也越多,不僅導(dǎo)致容器鏡像的體積變大,還使得鏡像的受攻擊面變大,安全性降低。
          當(dāng)以u(píng)buntu:16.04為基礎(chǔ)鏡像時(shí),執(zhí)行 "apt-get update && apt-get install vim telnet curl -y"命令和不執(zhí)行此命令的鏡像,其漏洞數(shù)量和鏡像體積都是不一樣的。詳細(xì)對比如下圖。
          4.5 對Dockerfile進(jìn)行掃描
          可以用Dockerfile掃描工具(比如Hadolint)來對Dockerfile來進(jìn)行掃描,以發(fā)現(xiàn)Dockerfile中的不規(guī)范寫法或者一些可能引起安全問題的構(gòu)建命令。比如用Hadolint掃描如下的Dockerfile:
          FROM alpine
          RUN apk add busybox-extras

          可以看到如下輸出結(jié)果:

          /dev/stdin:1 DL3006 Always tag the version of an image explicitly
          /dev/stdin:2 DL3018 Pin versions in apk add. Instead of `apk add <package>` use `apk add <package>=<version>`
          /dev/stdin:2 DL3019 Use the `--no-cache` switch to avoid the need to use `--update` and remove `/var/cache/apk/*` when done installing packages

          結(jié)果提示,基礎(chǔ)鏡像(alpine)應(yīng)該要指定tag(DL3006提示所示),安裝包時(shí)(apk add) 要指定包(busybox-extras)的版本(DL3018提示所示)。

          4.6 不要選取未知來源且沒有維護(hù)的鏡像

          當(dāng)選取基礎(chǔ)鏡像時(shí),不要選取來源未知(不知道這個(gè)鏡像的作者是何方神圣,不知道Dockerfile的內(nèi)容,不知道基礎(chǔ)鏡像的內(nèi)容)、停止維護(hù)(最后一次更新是幾個(gè)月甚至幾年前,這段時(shí)間積累了多少問題,天知道)的鏡像。因?yàn)椴荒艽_定鏡像中包含的內(nèi)容是否是安全的。更不要僅以鏡像被拉取的次數(shù)、Star數(shù)量作為指標(biāo)來決定是否使用鏡像,因?yàn)檫@個(gè)次數(shù)是可以被刷上去的。一定要盡量選取官方的、Dockerfile內(nèi)容明確的,更新頻繁的鏡像,如果沒有符合條件的鏡像,可以嘗試自己制作鏡像。

          上述幾點(diǎn)只是構(gòu)建安全、規(guī)范鏡像的一部分手段,本文只是列出來一些重要,而且常見的。其他還有諸如使用鏡像簽名來防止鏡像被篡改、構(gòu)建受信的鏡像倉庫并通過RBAC和黑名單等機(jī)制來對鏡像的拉取和推送等做權(quán)限控制等手段來進(jìn)一步保證鏡像的安全。限于篇幅,本文不再進(jìn)一步深入探討,感興趣的,可以深入進(jìn)行研究。


          五、總結(jié)



          沒有絕對的安全,也沒有一勞永逸的安全,只有永不止步的行動(dòng)。鏡像掃描只是通過工具幫助我們來發(fā)現(xiàn)安全問題,然后去有目標(biāo)的解決問題,屬于一種治療手段;能夠未雨綢繆,預(yù)防問題的發(fā)生才是最重要的,所以,應(yīng)該養(yǎng)成良好的習(xí)慣:從安全的角度出發(fā),結(jié)合上述的最佳實(shí)踐,來構(gòu)建安全,規(guī)范的鏡像。以"預(yù)防為主,防治結(jié)合"的方式來進(jìn)一步確保鏡像的安全。

          作者:馬景賀

          馬景賀,人稱小馬哥,曾做過LTE 4G網(wǎng)絡(luò)協(xié)議開發(fā),后轉(zhuǎn)向DevOps,對于Cloud Native DevSecOps進(jìn)行布道,喜歡研究docker,kubernetes,istio等Cloud Native相關(guān)技術(shù),樂于分享,運(yùn)營著DevOps SIG公眾號(hào)。在大連DevOps社區(qū)活動(dòng)上,舉辦DevOps Workshop活動(dòng)。

          參考資料

          • https://snyk.io/blog/10-docker-image-security-best-practices/

          • https://boxboat.com/2020/04/24/image-scanning-tech-compared/

          • https://github.com/aquasecurity/trivy

          • https://anchore.com/blog/difference-anchore-clair-coreos/

          • https://malikashish8.github.io/Docker-Scan-with-Clair/#cicd-integration

          • https://github.com/arminc/clair-scanner

          • https://livingwithagility.org.uk/security-scanning-in-our-ci-pipeline-with-clair

          • https://medium.com/better-programming/scan-your-docker-images-for-vulnerabilities-81d37ae32cb3

          • https://github.com/anchore/anchore-cli

          • https://0x1.gitlab.io/security/Trivy/

          • https://github.com/anchore/

          • https://github.com/chaitin/xray

          • https://www.stackrox.com/post/2019/09/docker-security-101/

          • https://github.com/hadolint/hadolint


          2021 IDCF 公開課招生ing
          2021年《IDCF DevOps黑客馬拉松》北京、深圳、上海站開啟,還有《端到端DevOps持續(xù)交付(5P)工作坊》、《基于Boat House的DevOps實(shí)踐》、《“創(chuàng)新設(shè)計(jì)思維/Design Thinking”工作坊》、《敏捷項(xiàng)目管理實(shí)戰(zhàn)沙盤演練》等眾多公開課可以參加,快快報(bào)名吧~

          瀏覽 62
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  美女骚逼丝袜野战视频 | 日本内射网站在线观看 | 人妻无码免费视频 | 香蕉色色网站 | 亚洲成a人片77777精品 |