你可能不知道的容器镜像安全实践

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.mzph.cn/news/279928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【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…

震惊!顶着 39.5℃高烧 ,我和这哥俩都聊了些啥?

这是头哥侃码的第271篇原创上周三,我邀请了两位嘉宾进入直播间,即便自己顶着 39.5 度的高烧,还是强打精神与这哥俩聊了俩小时。相信关注我的朋友们都知道,我是头哥侃码的主理人,同时也是上海TGO上海分会董事会成员。赵…

在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。这一切都是交由编译器来完成,我们无…

微软公布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,以及基于两者开发的雅观智慧社区…

如何在Windows 10的地图应用程序中获取离线地图

If you know you’re going to be using your PC in a location without an Internet connection, and you need access to maps, you can download maps for specific areas in the “Maps” app in Windows 10 and use them offline. 如果您知道要在没有Internet连接的地方使…

XenApp_XenDesktop_7.6实战篇之八:申请及导入许可证

1. 申请许可证 Citrix XenApp_XenDesktop7.6和XenServer 6.5申请许可证的步骤是一致的,由于之前我已经申请过XenApp_XenDesktop的许可证,本次以XenServer6.5的许可证申请为例。 1.1 在申请试用或购买Citrix产品时,收到相应的邮件&#xff0…

Windows 11的记事本将获得类似浏览器的标签功能

Windows 11已经向全世界的客户推出,自从它问世以来已经收到各种有趣的更新。例如,Windows 11的22H2版本(操作系统的第一个大更新)为文件资源管理器添加了标签,启用了任务栏的拖放支持,以及更多。Windows-11…

译⽂:Top Three Use Cases for Dapr and Kubernetes

有关译者:陈东海(seachen),⽬前就职于腾讯,同时在社区也是⼀名Dapr Member.导语:在SDLC(Software Development Lifecycle软件开发⽣命周期中),绝⼤多数CNCF项⽬都是专注于软件开发的中后期阶段,特别是运维和…

平视相机svo开源项目_什么是平视显示器(HUD),我应该得到一个吗?

平视相机svo开源项目In a world full of augmented reality snowboard goggles and Google Glass, it seems only fair that our cars get to enjoy some of the same treatment. Heads-up displays, or “HUDs” as they’re better known, are a new type of add-on for cons…

react项目打包后路径找不到,项目打开后页面空白的问题

使用 npm install -g create-react-app快速生成项目脚手架打包后出现资源找不到的路径问题: 解决办法:在package.json设置homepage 转载于:https://www.cnblogs.com/lan-cheng/p/10541606.html