你可能不知道的容器鏡像安全實踐

53bbbb1e0071929985bed8a7f31a75a1.jpeg


大家好,我是Edison。

最近在公司搭建CI流水線,涉及到容器鏡像安全的話題,形成了一個筆記,分享與你,也希望我們都能夠提高對安全的重視。

時代背景

近年來應用程序逐步廣泛運行在容器內,容器的采用率也是逐年上升。

根據 Anchore 發布的《Anchore 2021年軟件供應鏈安全報告》顯示容器的采用成熟度已經非常高了,65% 的受訪者表示已經在重度使用容器了,而其他 35% 表示也已經開始了對容器的使用:

c65dc176a2600e3ee997121dc1d8f8d2.png

因此,基于軟件的交付變成了基于容器鏡像的交付。

業界已經達成共識:云原生時代已經到來,如果說容器是云原生時代的核心,那么鏡像應該就是云原生時代的靈魂。鏡像的安全對于應用程序安全、系統安全乃至供應鏈安全都有著深刻的影響。

但是,容器的安全問題卻是大多數IT開發團隊所忽視的:

根據 snyk 發布的 2020年開源安全報告 中指出,在 dockerhub 上常用的熱門鏡像幾乎都存在安全漏洞,多的有上百個,少的也有數十個。具體數據如下圖所示:

f1063daf3a8d0ae4d2acdabd4feead93.png

不幸的是,很多應用程序的鏡像是以上述熱門鏡像作為基礎鏡像,進而將這些漏洞帶到了各自的應用程序中,增加了安全風險。

解決方式

GitLab建議我們:預防為主,防治結合的方式來提高鏡像的安全性。

所謂防,就是要在編寫 Dockerfle 的時候,遵循最佳實踐來編寫安全的Dockerfile;還要采用安全的方式來構建容器鏡像;

所謂治,即要使用容器鏡像掃描,又要將掃描流程嵌入到 CI/CD 中,如果鏡像掃描出漏洞,則應該立即終止CI/CD Pipeline,并反饋至相關人員,進行修復后重新觸發 CI/CD Pipeline。

防的最佳實踐

(1)以安全的方式構建容器鏡像

常規構建容器鏡像的方式就是 docker build,這種情況需要客戶端要能和 docker守護進程進行通信。對于云原生時代,容器鏡像的構建是在 Kubernetes 集群內完成的,因此容器的構建也常用 dind(docker in docker)的方式來進行。

眾所周知,dind 需要以 privilege 模式來運行容器,需要將宿主機的?/var/run/docker.sock 文件掛載到容器內部才可以,否則會在 CI/CD Pipeline構建時收到錯誤。

為了解決這個問題,可以使用一種更安全的方式來構建容器鏡像,也就是使用 kaniko。

kaniko是谷歌發布的一款根據 Dockerfile 來構建容器鏡像的工具。kaniko 無須依賴 docker 守護進程即可完成鏡像的構建。其和GitLab CI/CD的集成也是非常方便的,只需要在GitLab CI/CD 中嵌入即可,下面是在我司CI Pipeline中的實踐:

variables:EXECUTOR_IMAGE_NAME: "gcr.io/kaniko-project/executor" EXECUTOR_IMAGE_VERSION: "debug"
docker-build-job:stage: docker-build-stageimage:name: "$EXECUTOR_IMAGE_NAME:$EXECUTOR_IMAGE_VERSION"entrypoint: [""]rules:- if: '$IMAGE_SOURCE_BUILD != "" &&$BUILD_DOCKER_IMAGE == "true" && $CI_PIPELINE_SOURCE !="merge_request_event"'script:- |- KANIKO_CONFIG="{\"auths\":{\"$CI_REGISTRY_IMAGE\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}"echo "${KANIKO_CONFIG}" >/kaniko/.docker/config.json- mkdir release- cp -r Build/* release/- |/kaniko/executor \--context "${CI_PROJECT_DIR}" \--dockerfile "Dockerfile" \--destination"${CI_REGISTRY_IMAGE}:${BUILD_TAG}"

(2)選擇合適且可靠的基礎鏡像

Dockerfile 的第一句通常都是 FROM some_image,也就是基于某一個基礎鏡像來構建自己所需的業務鏡像,基礎鏡像通常是應用程序運行所需的語言環境,比如.NET、Go、Java、PHP等,對于某一種語言環境,一般是有多個版本的。

我司主要使用的是.NET,而原生微軟的ASP.NET 6.0鏡像(mcr.microsoft.com/dotnet/aspnet:6.0)有5個Critical的安全漏洞,一般不建議采用。根據Global項目組的實踐,建議采用RedHat提供的.NET 6.0運行時鏡像,該鏡像由RedHat維護,定期在更新(最新更新是一周前),目前無Critical的安全漏洞。

972964141c1d7b69fc79808c837ac0ba.png

鏡像地址:https://catalog.redhat.com/software/containers/ubi8/dotnet-60-runtime/6182efaddd607bfc82e66343

docker pull registry.access.redhat.com/ubi8/dotnet-60-runtime:6.0-22

(3)不安裝非必要的安裝包

Dockerfile 中應該盡量避免安裝不必要的軟件包,除非是真的要用到。比如:我們習慣了直接寫?apt-get update && apt-get install xxxx。

因為,安裝非必要的軟件包除了會造成鏡像體積的增大 也會 增加受攻擊的風險程度。

72acd0c46b0080e2df92af37353e4e4b.png

(4)以非root用戶啟動容器

在 Linux 系統中,root用戶意味著超級權限,能夠很方便的管理很多事情,但是同時帶來的潛在威脅也是巨大的,用 root 身份執行的破壞行動,其后果是災難性的。在容器中也是一樣,需要以非root 的身份運行容器,通過限制用戶的操作權限來保證容器以及運行在其內的應用程序的安全性。在 sysdig 發布的《Sysdig 2021年容器安全和使用報告》中顯示,58% 的容器在以 root 用戶運行。足以看出,這一點并未得到廣泛的重視。

因此,建議在Dockerfile中添加命令來讓容器以非root用戶身份啟動,在我司的CI Pipeline中的實踐:

......USER 0
RUN chown -R 1001:0/opt/app-root && fix-permissions /opt/app-root
# No root should run
USER 1001ENV ASPNETCORE_URLS=http://+:8080
EXPOSE 8080CMD dotnet ${APPLICATION_DLL}

治的最佳實踐

在CI流水線中加入容器鏡像安全掃描任務

在 GitLab 中提供了容器鏡像分析器(Container-Scanning-Analyzer)來對生成的容器鏡像進行掃描,建議將其加入CI Pipeline中進行高頻率的檢查工作。

在我司的CI Pipeline中,集成了container-scanning-analyzer來掃描容器鏡像,如果掃描結果有Critical的漏洞,流水線會自動失敗,阻塞后續Job執行并發送Email提醒。下圖給出了一個簡單的示例(并非我司CI流水線完整流程):

1f0ec7819dc0b07a27db99fde6be3451.png

只有當掃描結果不包含Critical的漏洞時,流水線才會被視為成功,進而允許后續操作,包括Merge開發分支到主干等。

7534930fad351ea39604c07205117dcf.png

參考資料

極狐:《GitLab DevSecOps七劍下天山之容器鏡像安全掃描》https://mp.weixin.qq.com/s/pnP0bjFdXlay42OGghUWNw

極狐:《云原生時代,如何保證容器鏡像安全?》https://blog.csdn.net/weixin_44749269/article/details/123077566

2b9005ba82a17dc91c2aa0c306bf8be7.gif

年終總結:Edison的2021年終總結

數字化轉型:我在傳統企業做數字化轉型

C#刷題:C#刷劍指Offer算法題系列文章目錄

.NET面試:.NET開發面試知識體系

.NET大會:2020年中國.NET開發者大會PDF資料

933319c5f37864ac9e2da2f08f711877.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/279928.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279928.shtml
英文地址,請注明出處:http://en.pswp.cn/news/279928.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從零基礎到拿到網易Java實習offer,談談我的學習經驗

微信公眾號【程序員江湖】作者黃小斜,斜杠青年,某985碩士,阿里研發工程師,于2018 年秋招拿到 BAT 頭條、網易、滴滴等 8 個大廠 offer個人擅長領域 :自學編程、技術校園招聘、軟件工程考研(關注公眾號后回復…

【Win 10 應用開發】UI Composition 札記(二):基本構件

在上一篇中,老周用一個示例,演示了框架視圖的創建過程,在本篇中,老周將給大伙伴們說一下 Composition 構建 UI 的一些“零件”。 UI Composition 有一個核心類——對,就是 Compositor 類,它是總生產車間&am…

禁用內置鍵盤_如何禁用Windows 10的所有內置廣告

禁用內置鍵盤Windows 10 has a lot of built-in advertising. This isn’t just about the free upgrade offer: Even if you purchase a new PC that comes with a Windows 10 license or spend $200 for a copy of Windows 10 Professional, you’ll see ads in your operati…

zbb20180710 maven Failed to read artifact descriptor--maven

Failed to read artifact descriptor--maven2016年09月10日 13:30:46閱讀數:13036在開發的過程中,作為新手,經常遇到Maven下載依賴的時候,"Failed to read artifact descriptor for xxx:jar"的錯誤對于這種非業務相關的問題,耽誤時間非常不效率,看到網站很…

震驚!頂著 39.5℃高燒 ,我和這哥倆都聊了些啥?

這是頭哥侃碼的第271篇原創上周三,我邀請了兩位嘉賓進入直播間,即便自己頂著 39.5 度的高燒,還是強打精神與這哥倆聊了倆小時。相信關注我的朋友們都知道,我是頭哥侃碼的主理人,同時也是上海TGO上海分會董事會成員。趙…

CAS原理分析及ABA問題詳解

什么是CAS CAS即Compare And Swap的縮寫,翻譯成中文就是比較并交換,其作用是讓CPU比較內存中某個值是否和預期的值相同,如果相同則將這個值更新為新值,不相同則不做更新,也就是CAS是原子性的操作(讀和寫兩者同時具有原…

在Windows Mobile模擬器(Emulator)建立網絡連接

因為想使用Windows Mobile Emulator進行網絡通信程序的測試,所以找方法配置Emulator的網絡連接。在網上找了一些文章,很多都說需要安裝Virtual PC 2007. 例如下面的文章Enable Network Connection Windows Mobile 6 Emulator 如果需要 Virtual PC 2007 可…

api游戲編程鼠標選擇拖動_如何選擇合適的游戲鼠標

api游戲編程鼠標選擇拖動You don’t need a gaming mouse to play PC games—just about any mouse with two buttons and a wheel will play anything you want it to. But that’s no reason to deny yourself the wonderful variety of gaming mouse designs on the market.…

iOS - 上架的APP 生成二維碼下載

1.首先打開蘋果App Store商店進入到里面,找到需要打開鏈接地址的應用程序,例如:百度。2. 在App Store商店里面先點擊一下應用程序圖標,再按一下…分享按鈕。 3. 接著選擇分享APP,再點擊拷貝鏈接地址,將應用…

Rsa2加密報錯java.security.spec.InvalidKeySpecException的解決辦法

最近在和支付寶支付做個對接,Java項目中用到了RSA2進行加解密,在加密過程中遇到了錯誤: java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence 代碼執行到這句…

淺析領域驅動設計

1.概要DDD(Domain-driven design,模型驅動設計)是一種軟件設計的指導思想,而非固定的一套公式化開發模板(這樣就會導致網絡上出現各種基于自己或業務上的理解而產出的DDD落地的實現,會讓很想學習的開發者迷…

Delphi實現的透明陰影以及蒙版效果菜單

QQ2010的皮膚控件目前實現了一部分,看到有些軟件的菜單,都有陰影,透明等效果,于是開始重新實現菜單控件,QQ2009版的菜單控件,是自己從TComponent繼承了完全模擬實現的一個菜單,雖然實現了菜單控…

cortana搜索框_如何在Windows 10任務欄上隱藏Cortana搜索框

cortana搜索框One of the most talked about features in the latest version of Windows 10 was the Cortana personal assistant that is integrated directly into the taskbar. But what if you don’t want to waste all that taskbar space? 最新版本的Windows 10中最受…

Kotlin 基礎 - 數據類型

一、Boolean 類型 Boolean 值有兩個值,分別為 true 或 false。多數情況下,Kotlin 中的 Boolean 相當于 Java 中的基本類型 boolean,只有在必要的情況下才會裝箱成為 Java 中的裝箱類型 Boolean。這一切都是交由編譯器來完成,我們無…

全框眼鏡拆卸鏡片方法分享

全框眼鏡拆卸鏡片方法分享http://www.iqiyi.com/w_19ru97p1n9.html 很多直接用手掰就成(眼鏡布) 轉載于:https://www.cnblogs.com/OceanF/p/9288411.html

發送http請求

public static String httpGetSend(String url) {String responseMsg "";HttpClient httpClient new HttpClient();GetMethod getMethod new GetMethod(url);// GET請求try {// http超時5秒httpClient.getHttpConnectionManager().getParams().setConnectionTimeo…

微軟公布Entity Framework 8.0規劃

微軟.NET團隊在博客上公布了有關 Entity Framework Core 8.0(也稱為 EF Core 8 或 EF8)的未來規劃。EF Core 8 是 EF Core 7 之后的下一個版本,這將是一個長期支持版本;計劃于 2023 年 11 月與 .NET 8 同時發布。該公司表示&#…

roku能不能安裝軟件_如何阻止假期更改Roku主題

roku能不能安裝軟件Wondering why your Roku looks…different? Roku occasionally changes the background for its millions of users, something they call a “featured theme.” 想知道為什么您的Roku看起來...不同嗎? Roku偶爾會改變其數百萬用戶的背景&…

助力AIoT,雅觀科技發布空間智能化操作系統

雷鋒網(公眾號:雷鋒網)消息,3月14日,雅觀科技在上海舉辦了“「AI」悟及物 「柔」生萬屋”2019雅觀科技新品發布會,發布了空間智能化操作系統Akeeta、空間智能化柔性服務技術中臺Matrix,以及基于兩者開發的雅觀智慧社區…

HTTP與HTTPS區別(詳細)

轉:http://blog.sina.com.cn/s/blog_6eb3177a0102x66r.html 1、減少http請求(合并文件、合并圖片)2、優化圖片文件,減小其尺寸,特別是縮略圖,一定要按尺寸生成縮略圖然后調用,不要在網頁中用res…