网安加·百家讲坛 | 肖文棣:Java加壳,脱壳与实践

作者简介:肖文棣,OWASP中国广东分会负责人、网安加社区特聘专家,现任某外企安全架构师,负责应用安全设计、管理和评审等工作。

容器安全一般包括镜像的安全以及运行时安全,这次我们重点研究一下镜像的安全。最近我一直在研究这个问题,并且针对一些工具进行了一些测试。容器镜像作为容器化技术的核心组成部分,其安全性直接关系到整个系统的稳定运行。本文将深入探讨容器镜像的分层原理,并介绍使用各种开源工具对容器镜像进行扫描的实践。

容器镜像介绍和分层

Docke镜像是一个轻量级、独立的、可执行的软件包,用于打包软件运行环境和基于该环境开发的软件。Docker镜像包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。镜像一旦构建完成,就是只读的,任何对镜像的更改都会创建一个新的镜像。

图片

在Docker中,镜像扮演着非常重要的角色,是容器运行的基础。用户可以从Docker Hub或其他镜像仓库中拉取所需的镜像,也可以自己制作镜像并推送到仓库中共享。用户可以通过Docker Build命令根据Dockerfile编译出来容器镜像,同时可以使用Docker Save命令导出为Tar文件。

图片

Docker镜像在设计之初就考虑了分层了。Docker镜像的分层原理是其实现高效的关键之一。这种机制将一个完整的镜像分割成多个较小的、可复用的层。每个层都包含着构成整个镜像所需的文件和配置信息,这些层按照一定的顺序堆叠在一起,形成一个完整的镜像。

具体来说,一个Docker镜像由多个只读的文件系统层组成,每个层都是一个差异层,每个层基于前一个层进行修改和扩展。最底层的是一个基础镜像,该镜像提供了一个基本的操作系统环境。在基础镜像之上,可以叠加多个层,每个层都会修改或添加一些文件或配置。最后,所有这些层组合在一起,形成一个完整的镜像。

图片

这种分层的机制使得镜像的创建、传输和管理变得更加高效。同时,由于每个层都是只读的,所以可以保证镜像的一致性和安全性。此外,通过分层,还可以实现镜像的共享和复用,避免重复构建相同的镜像层,从而提高开发效率。

在刚开始接触Docker的时候,有些专家说Docker镜像的层级越少越好,层级越少,镜像的大小也会越小,甚至建议将所有的命令合并成一句执行。现在看来觉得有点可笑,所以对于专家的建议要客观地评价,不要盲从。

在制作Docker镜像时,关于层数的优化确实是一个需要考虑的问题。但是,是否将所有命令合并为一条命令或保持每条命令一个层,并没有绝对的“越少越好”或“越多越好”的答案,这取决于你的具体需求和场景。

  1. 镜像大小:每层都会增加镜像的大小,如果某些层的改变很小,但它们创建了新的层,那么镜像可能会变得比实际需要的大。因此,合并一些小的改变可以减少层数,从而减小镜像大小。

  2. 构建缓存:Docker使用层缓存来加速构建过程。如果Dockerfile中的某条命令没有改变,那么Docker可以重用这个命令创建的层,而不是重新构建它。这可以大大

  3. 减少构建时间:如果将所有命令合并为一个,那么任何小的更改都会导致整个命令重新执行,从而失去缓存的优势。

  4. 可读性和维护性:将每条命令保持为一个层可以使Dockerfile更易于阅读和理解,也有助于调试和维护。如果一个复杂的命令失败了,你可以更容易地确定是哪部分出了问题。

  5. 安全性:保持每条命令一个层也可以帮助识别哪些更改可能引入了安全问题。例如,如果你发现某个特定的层被篡改了,你可以更容易地跟踪和修复这个问题。

因此,最佳的做法可能是找到一个平衡点,既要尽量减少不必要的层以减少镜像大小,又要保持足够的层以便于利用缓存、提高可读性和维护性,以及确保安全性。

容器镜像安全与实践

容器镜像安全主要关注的是保护容器镜像的完整性和安全性,防止其被篡改或注入恶意代码。镜像安全直接决定了容器安全,因为容器是基于镜像构建的,如果镜像本身存在问题,那么基于此镜像搭建的容器自然也会存在安全隐患。

容器镜像是由按层封装好的文件系统和描述镜像的元数据构成的文件系统包,包含应用所需要的系统、环境、配置和应用本身等。在构建容器镜像时,需要确保每一层的内容都是安全、可靠的,以避免潜在的安全风险。

为了检查镜像的安全性,需要使用一些的工具,可以是开源的、免费的,也可以是商业的。这些工具可以通过分析镜像各层中的内容,并根据已有的漏洞数据库进行对比,从而判断镜像是否存在安全问题。

下面我们讨论一下几个常用的工具。

Trivy

Trivy是一个全面且多功能的安全扫描工具,主要用于检测容器镜像、文件系统、Git存储库(远程)以及虚拟机镜像中的安全漏洞和配置错误。Trivy可以扫描最流行的编程语言、操作系统和平台中的漏洞,如操作系统包(如Alpine、Red Hat Universal Base Image、Debian等)和应用程序依赖项(如Bundler、Composer、npm等)的已知漏洞。

Trivy的GitHub仓库是https://github.com/aquasecurity/trivy,我们可以从release页面(https://github.com/aquasecurity/trivy/releases/tag/v0.50.1)中下载合适的平台的版本。

Trivy的使用相当简单。下面是一个扫描Python:3.4-alpine的例子。

图片

返回的结果简明扼要,但是Trivy不能将CVE漏洞定位到层的级别,并且分析出这个漏洞是如何引入的,这就有点遗憾。

Clair

Clair是CoreOS在2016年发布的一款开源容器漏洞扫描工具。其主要功能在于交叉检查Docker镜像的操作系统以及上面安装的任何包是否与任何已知不安全的包版本相匹配。

Clair的官方Github地址是https://github.com/arminc/clair-scanner,Clair采用的是Client-Server模式,该官方地址只是Clair-Scanner这个客户端,我们需要先运行服务器端,这个可以通过Docker来运行。

图片

然后我们可以从Release页面(https://github.com/arminc/clair-scanner/releases/tag/v12)下载合适的Clair-Scanner客户端,运行命令也是非常简单。我们也是使用Python:3.4-alpine镜像的扫描作为例子。

图片

这里也是只列出各个CVE的结果,而没有定位到哪个层引入这个CVE漏洞。对比Trivy,Clair的安装稍显复杂,而且结果没有Clair详尽。

Docker Scout

Docker Scout是Docker推出的一款工具,集成在Docker Desktop上。通过分析Docker镜像,Docker Scout能够主动识别潜在的安全漏洞,并帮助用户构建安全的软件环境。

Docker Scout不仅仅是可以显示完成的结果,而且可以清晰地定位出究竟是哪个层,Dockerfile里面的哪句命令引入该漏洞,这弥补了Trivy和Clair的遗憾,非常有用。对比Trivy和Clair,Docker Scout在易用性,结果实用性上都是完胜。

Python:3.4-alpine镜像的安全概览:

图片

可以看到ADD命令引入了2个High的安全漏洞,并且可以展开看漏洞的详情。

图片

Docker Scout简单实用并且能够定位到引入漏洞的源头,方便开发人员去修复漏洞;而且这个工具与Docker Desktop集成,方便开发人员在本地完成测试后立刻就可以看到当前镜像的安全情况,所以强烈推荐大家使用。根据我的测试,比一些商业工具还好用,比如BlackDuck,AWS ECR集成的容器漏洞扫描(Clair)等,这点也值得商业工具反思和改进。

总结

容器镜像的安全性是容器化技术发展的重要保障。通过深入了解容器镜像的分层原理和使用各种开源工具进行扫描实践,我们可以有效地提高镜像的安全性,降低潜在的安全风险。

容器镜像合理分层,可以提升我们的效率和帮助我们快速定位问题。

选择扫描工具时,我们需要根据实际需求综合考虑工具的优缺点,选择最适合自己的工具进行使用。同时,我们也需要关注这些开源工具的发展动态,以便及时获取最新的安全漏洞信息和修复方案。比如Docker Scout,刚开始Docker Desktop是没有的集成Docker容器镜像扫描的,最近我研究容器镜像安全的时候,突然就发现这个功能了,特别是Docker Scout把漏洞定位到层和命令的特点,在实际工作中非常有用。

未来,随着容器技术的不断发展和普及,容器镜像的安全性将越来越受到重视。我们需要持续关注新的安全技术和方法,不断学习,才能满足业务的需要和市场的需要。

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值