sudo apt install镜像_将Docker镜像安全扫描步骤添加到CI/CD管道
使用GitlabCI和Trivy
介紹
如今,鏡像安全掃描變得越來(lái)越流行。這個(gè)想法是分析一個(gè)Docker鏡像并基于CVE數(shù)據(jù)庫(kù)尋找漏洞。這樣,我們可以在使用鏡像之前知道其包含哪些漏洞,因此我們只能在生產(chǎn)中使用“安全”鏡像。
有多種分析Docker鏡像的方法(取決于您使用的工具)。可以從CLI執(zhí)行安全掃描,也可以將其直接集成到Container Registry中,或者更好(在我看來(lái)),您可以將安全掃描集成到CI/CD管道中。最后一種方法很酷,因?yàn)樗刮覀兡軌蜃詣?dòng)化流程并不斷分析所生成的圖像,從而符合DevOps的理念。
這是一個(gè)簡(jiǎn)單的例子:
因此,今天我將向您展示如何設(shè)置集成到CI/CD管道中的鏡像安全掃描。
工具類(lèi)
有多種工具可以執(zhí)行鏡像安全掃描:
- Trivy:由AquaSecurity開(kāi)發(fā)。
- Anchore:由Anchore Inc.開(kāi)發(fā)。
- Clair:由Quay開(kāi)發(fā)。
- Docker Trusted Registry:如果您使用Docker Enterprise,尤其是Docker Trusted Registry,則可以使用直接集成在注冊(cè)表中的即用型安全掃描程序。
- Azure/AWS/GCP:如果您使用這些云提供程序之一,則可以輕松設(shè)置安全掃描。實(shí)際上,您不需要進(jìn)行任何設(shè)置,只需要您的信用卡即可。:)
當(dāng)然,還有更多開(kāi)放源代碼或?qū)S泄ぞ呖梢詫?shí)現(xiàn)該目標(biāo)。對(duì)于本教程,我將在GitlabCI管道上使用Trivy。
Trivy快速概述
Trivy是一種易于使用但準(zhǔn)確的圖像安全掃描儀。安裝非常簡(jiǎn)單:
$?curl?-sfL?https://raw.githubusercontent.com/aquasecurity/trivy/master/contrib/install.sh?|?sh?-s--b?/?usr?/?local?/?bin?$?sudo?mv?./bin/trivy?/?usr?/?local?/?bin?/?trivy?$?trivy?--version?及其用法:
$?trivy?image?nginx:alpine給我們這樣的輸出:
就如此容易。
有關(guān)更多信息:Trivy的Github
添加一個(gè)簡(jiǎn)單的Docker鏡像
為了說(shuō)明將安全掃描包含在CI/CD管道中,我們需要一個(gè)Docker鏡像作為示例。我將使用該簡(jiǎn)單的Dockerfile:
FROM?debian:busterRUN?apt-get?update?&&?apt-get?install?nginx?-y
這個(gè)Dockerfile非常簡(jiǎn)單。它從正式的debian buster映像開(kāi)始,并添加了nginx的安裝。
我們稍后將在CI/CD管道中構(gòu)建該映像,但是我們可以如下構(gòu)建它:
$ docker build -t security_scan_example:latest。現(xiàn)在,我們只需要?jiǎng)?chuàng)建一個(gè)Gitlab項(xiàng)目并將Dockerfile推送到該項(xiàng)目中即可。
創(chuàng)建一個(gè)簡(jiǎn)單的CI/CD管道
現(xiàn)在,我們已經(jīng)為示例鏡像創(chuàng)建了Dockerfile,我們可以創(chuàng)建CI/CD管道來(lái)構(gòu)建鏡像并使用Trivy對(duì)其進(jìn)行掃描。
毫不奇怪,由于我們正在使用Gitlab,因此我們將在我們的CI/CD管道中使用GitlabCI。首先,讓我們添加構(gòu)建部分:
build:??stage:?build
??image:?docker:stable
??services:
????-?docker:dind
??tags:
????-?docker
??before_script:
????-?docker?login?-u?"$CI_REGISTRY_USER"?-p?"$CI_REGISTRY_PASSWORD"?$CI_REGISTRY
??script:
????-?docker?build?-t?$CI_REGISTRY_IMAGE:latest??.
????-?docker?push?$CI_REGISTRY_IMAGE:latest
該作業(yè)在基于docker:stable映像的容器上運(yùn)行。它基于我們之前推送的Dockerfile構(gòu)建項(xiàng)目的映像,然后將映像推送到Gitlab容器注冊(cè)表中。
現(xiàn)在讓我們添加有趣的部分:
security_scan:??stage:?test
??image:?
????name:?aquasec/trivy:latest
????entrypoint:?[""]
??services:
????-?docker:dind
??tags:
????-?docker
??script:
????-?trivy?--no-progress?--output?scanning-report.txt??$CI_REGISTRY_IMAGE:latest
??artifacts:
????reports:
??????container_scanning:?scanning-report.txt
這項(xiàng)工作是我們的安全掃描工作。這次,它在基于Trivy官方圖像的容器上運(yùn)行。它基于trivy命令掃描鏡像,并將報(bào)告輸出到名為scanning-report.txt的文件中
太好了!讓我們看一下我們的GitlabCI管道,該管道應(yīng)該在推送后自動(dòng)運(yùn)行。我們可以看到我們的兩個(gè)作業(yè)都成功運(yùn)行了:
讓我們看一下安全掃描作業(yè):
images報(bào)告在哪里?
如您在掃描作業(yè)的結(jié)果中看到的,我們有多個(gè)漏洞,更確切地說(shuō)是114個(gè)“低”和8個(gè)“中”,24個(gè)“高”和1個(gè)“嚴(yán)重”漏洞。
我們希望獲得有關(guān)這些漏洞的更多詳細(xì)信息。默認(rèn)情況下,Trivy在標(biāo)準(zhǔn)輸出中打印報(bào)告。在此示例中,我們告訴trivy將報(bào)告輸出到文件中,并根據(jù)該文件創(chuàng)建了作業(yè)工件。因此,該報(bào)告可按以下方式下載:
images下載后,我們可以查看報(bào)告以獲取更多詳細(xì)信息:
images我們可以看到我們有更多有關(guān)掃描程序發(fā)現(xiàn)的漏洞的信息,例如受影響的庫(kù)/二進(jìn)制文件,CVE ID,嚴(yán)重性,可能的修復(fù)程序等。
現(xiàn)在怎么辦 ?
好的,現(xiàn)在我們已經(jīng)將鏡像掃描集成到CI / CD管道中,現(xiàn)在的問(wèn)題是如何處理這些信息?
當(dāng)前,安全掃描作業(yè)永遠(yuǎn)不會(huì)失敗,因?yàn)閠rivy命令默認(rèn)情況下返回0。如果鏡像“不安全”,則使工作失敗,否則,則可以使工作成功,從而改善這種情況。
問(wèn)題是,什么時(shí)候失敗?顯然,我們不能簡(jiǎn)單地說(shuō)“每當(dāng)發(fā)現(xiàn)一個(gè)漏洞時(shí)就會(huì)失敗”,因?yàn)槲覀兊挠诚窈芸赡苤辽贂?huì)存在一些漏洞。答案很難說(shuō),因?yàn)樗Q于您要實(shí)現(xiàn)的安全級(jí)別。通常,我們希望盡可能避免嚴(yán)重漏洞。答案還取決于您獲得的漏洞。您能忽略其中一些嗎?這取決于您。這就是為什么與安全團(tuán)隊(duì)持續(xù)合作可以從這些掃描中受益匪淺的原因。
對(duì)于此示例,如果我們只有一個(gè)嚴(yán)重漏洞,我們將使我們的CI/CD管道失敗,否則將成功。
幸運(yùn)的是,trivy允許我們使用“嚴(yán)重性”選項(xiàng)僅查找特定嚴(yán)重性的漏洞。我們還可以借助“退出代碼”選項(xiàng)來(lái)處理退出代碼,告訴trivy如果發(fā)現(xiàn)一個(gè)漏洞,則返回1,否則返回0。
因此,如果發(fā)現(xiàn)一個(gè)或多個(gè)“關(guān)鍵”漏洞,我們將更改掃描作業(yè)以使其失敗,例如:
script:??-?trivy?--no-progress?--output?scanning-report.json?$CI_REGISTRY_IMAGE:latest
??-?trivy?--exit-code?1?--no-progress?--severity?CRITICAL?$CI_REGISTR_IMAGE:latest
因此,當(dāng)執(zhí)行我們的作業(yè)時(shí),我們?nèi)匀豢梢韵螺d完整的報(bào)告,但是這次,CI/CD作業(yè)將成功還是失敗,這取決于trivy是否發(fā)現(xiàn)了嚴(yán)重漏洞:
最后一步……
好的,我們的CI/CD管道看起來(lái)很棒!我們需要處理最后一件事……
目前,僅在構(gòu)建/推送圖像時(shí)才對(duì)其進(jìn)行分析。這很酷,但不足。確實(shí),我們的掃描工具使用的CVE數(shù)據(jù)庫(kù)每天都有新的漏洞在發(fā)展。今天的“安全”鏡像明天可能(而且很可能)不安全。因此,我們需要在第一次推送圖像后繼續(xù)對(duì)其進(jìn)行掃描。
好吧,讓我們添加一個(gè)計(jì)劃的管道,比如說(shuō)每晚2AM掃描鏡像。我們需要進(jìn)入CI/CD->時(shí)間表->新時(shí)間表:
注意:我們使用“ security_scan”值定義了一個(gè)名為SCHEDULED_PIPELINE的變量。稍后我們將看到此變量的目的。
這樣做,我們的管道將被完全執(zhí)行,包括構(gòu)建部分。這不是我們真正想要的。因此,我們將修改gitlabCI文件,以使計(jì)劃的管道僅執(zhí)行掃描作業(yè)。
我們將添加一個(gè)額外的掃描作業(yè),其中包含與上一個(gè)作業(yè)完全相同的定義,并帶有一個(gè)額外的“only”選項(xiàng),使其僅在變量SCHEDULED_PIPELINE(我們先前在計(jì)劃的管道中定義)等于“ scanning_scan”時(shí)才可執(zhí)行。為了避免代碼冗余,我們將使用作業(yè)模板。
因此,我們最終的gitlabCI文件如下所示:
.scanning-template:?&scanning-template??stage:?test
??image:
????name:?aquasec/trivy:latest
????entrypoint:?[""]
??services:
????-?docker:dind
??tags:
????-?docker
??script:
????-?trivy?--no-progress?--output?scanning-report.json??$CI_REGISTRY_IMAGE:latest
????-?trivy?--exit-code?1?--no-progress?--severity?CRITICAL?$CI_REGISTR_IMAGE:latest
??artifacts:
????reports:
??????container_scanning:?scanning-report.json
build:
??stage:?build
??image:?docker:stable
??services:
????-?docker:dind
??tags:
????-?docker
??before_script:
????-?docker?login?-u?"$CI_REGISTRY_USER"?-p?"$CI_REGISTRY_PASSWORD"?$CI_REGISTRY
??script:
????-?docker?build?-t?$CI_REGISTRY_IMAGE:latest??.
????-?docker?push?$CI_REGISTRY_IMAGE:latest
??except:
????variables:
??????-?$SCHEDULED_PIPELINE
security_scan:
??<<:>??except:
????variables:
??????-?$SCHEDULED_PIPELINE
security_scan:on-schedule:
??<<:>??only:
????variables:
??????-?$SCHEDULED_PIPELINE?==?"security_scan"
這樣,當(dāng)我們推送一些代碼時(shí),我們的標(biāo)準(zhǔn)管道(構(gòu)建+掃描)將正常執(zhí)行,而調(diào)度的管道將每天凌晨2點(diǎn)執(zhí)行安全掃描作業(yè)。
我們?nèi)绾谓鉀Q這些漏洞?
通常,通過(guò)升級(jí)映像。在我們的情況下,我們可能會(huì)升級(jí)基礎(chǔ)映像(或者可能使用另一個(gè)鏡像,例如Alpine)或升級(jí)我們安裝的nginx。
另一個(gè)答案可能是通過(guò)刪除映像中不必要的內(nèi)容,無(wú)論如何構(gòu)建docker映像都是一個(gè)好習(xí)慣。安全掃描可以幫助您檢測(cè)實(shí)際未使用的組件。
在我們的情況下,讓我們更改基本圖像并改為使用Alpine:
FROM?alpine:3.12RUN?apk?update?&&?apk?add?nginx?-y這次,我們的管道成功了……:
……沒(méi)有一個(gè)漏洞。
結(jié)論
因此,我們已經(jīng)看到了如何將安全掃描作業(yè)集成到GitlabCI管道中,這非常簡(jiǎn)單(至少使用Trivy)。當(dāng)然,在我的示例中,我在單個(gè)master分支中完成了所有操作。在現(xiàn)實(shí)世界中,我們將進(jìn)行多分支項(xiàng)目,這需要進(jìn)行一些調(diào)整。
關(guān)于我們
澤陽(yáng),DevOps領(lǐng)域?qū)嵺`者。專(zhuān)注于企業(yè)級(jí)DevOps運(yùn)維開(kāi)發(fā)技術(shù)實(shí)踐分享,主要以新Linux運(yùn)維技術(shù)、DevOps技術(shù)課程為主。豐富的一線(xiàn)實(shí)戰(zhàn)經(jīng)驗(yàn),課程追求實(shí)用性獲得多數(shù)學(xué)員認(rèn)可。課程內(nèi)容均來(lái)源于企業(yè)應(yīng)用,在這里既學(xué)習(xí)技術(shù)又能獲取熱門(mén)技能,歡迎您的到來(lái)!(微信ID: devopsvip)DevOps流水線(xiàn)實(shí)踐課程
?戳閱讀原文,進(jìn)入課堂
總結(jié)
以上是生活随笔為你收集整理的sudo apt install镜像_将Docker镜像安全扫描步骤添加到CI/CD管道的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 快手上一个穿云箭多少人民币
- 下一篇: 十二月份找工作好找吗_注会过两门好找工作