想要搞明白Checkmarx容器镜像扫描怎么开启,还有扫描失败了该怎么排查,不能只想着把代码仓库交给工具扫一遍就行,更重要的是先搞清楚扫描的对象到底是什么,是Dockerfile里的基础镜像,还是已经构建好的成品容器镜像。Checkmarx的Container Security模块可以扫描项目里的Dockerfile,找出里面用到的容器镜像,还有镜像存在的风险;如果用CLI命令运行,还能指定公共或者私有仓库里的具体镜像来扫描。
一、Checkmarx容器镜像扫描怎么启用
开启容器镜像扫描之前,要先分清楚不同的扫描入口;如果项目里只有Dockerfile文件,扫描的重点一般是基础镜像,还有镜像层里带的各类软件包;如果CI/CD流程已经构建出了成品镜像,就更适合直接扫描镜像的名称、标签,或者镜像包文件。
1、确认扫描对象
先判断清楚项目要扫描的是Dockerfile,还是构建完成后的镜像。扫描Dockerfile的方式,适合用来发现基础镜像和构建配置里的风险;扫描成品镜像的方式,更贴近最终要交付的产物,能看到构建完成后镜像里的软件包和漏洞情况。这两种方式不是完全重复的关系,版本发布之前,更建议把最终的成品镜像也纳入扫描范围。
2、选择Container Security扫描器
在Checkmarx One里发起扫描的时候,要把Container Security扫描器勾选上。
官方文档里说明,容器安全扫描可以通过网页端、CLI命令或者API来触发;如果从网页端发起扫描,通常会扫描项目里的Dockerfile;如果通过CLI命令运行,还可以额外指定具体的镜像地址。
3、通过CLI指定镜像
使用CLI命令扫描镜像的时候,可以通过容器镜像相关的参数,传入要扫描的镜像引用。
Checkmarx的文档提到,--container-images参数支持用逗号分隔多个镜像引用,既可以写成镜像名加标签的格式,也可以指定本地的tar包文件。这里建议使用明确的版本标签,不要长期用latest标签,不然不同时间扫描的可能不是同一个镜像,结果也不好追溯对比。
4、接入流水线
容器镜像扫描最好安排在镜像构建完成之后、推送仓库之前,或者推送到测试仓库之后再执行。这样就能在镜像进入部署环境之前,发现高危漏洞、过期组件和基础镜像的问题;如果等到上线之后再扫描,修复的成本会明显变高。
二、Checkmarx容器镜像扫描失败怎么排查
碰到扫描失败的情况,先别急着断定是工具出了问题;容器镜像扫描能不能正常运行,和镜像地址、认证状态、仓库访问权限、镜像标签、网络连接还有扫描器配置都有关系,任何一个环节不对,都可能导致扫描出不来结果,或者只返回一部分结果。
1、检查镜像名称和标签
镜像的引用地址要写完整,要包含仓库地址、命名空间、镜像名称和标签。比较常见的错误是本地环境能拉取到镜像,但CI环境里没有配置同样的仓库权限;或者开发的时候用了latest标签,流水线实际拉取到的是另一个版本。排查的时候可以先在扫描环境里手动拉取同一个镜像,确认镜像确实可以正常访问。
2、检查私有仓库认证
扫描私有仓库的镜像之前,要先确认本机或者流水线环境已经完成了仓库登录。
Checkmarx的文档说明,扫描私有仓库的时候,需要在运行Checkmarx One CLI之前就完成容器仓库的认证,认证可以通过Docker或者Podman完成;就算是公共Docker Hub上的镜像,也建议登录之后再扫描,避免匿名请求带来的访问限制。
3、检查Dockerfile和镜像来源
如果是走Dockerfile扫描的方式,要确认仓库里确实包含Dockerfile文件,而且FROM语句引用的基础镜像可以正常访问。Checkmarx的Container Security会扫描Dockerfile里识别到的镜像,同时提取公共基础镜像的层信息;如果Dockerfile的路径不在扫描范围内,或者基础镜像拉取失败,扫描结果就会不完整。
4、查看扫描日志
扫描失败的时候要查看日志里记录的失败阶段,是认证失败、镜像不存在、拉取超时、镜像格式不支持,还是解析软件包清单失败。不同的错误对应的处理方式不一样,不能只盯着平台页面上的失败状态就下判断。
三、容器镜像扫描结果怎么整理和复查
启用容器镜像扫描之后,还要做好结果的管理工作;不然今天扫描的是一个镜像,明天换了标签,后天基础镜像又升级了,历史的扫描结果就很难放在一起对比。
1、固定镜像版本
建议使用明确的版本号、构建号或者镜像摘要来记录扫描对象。这样后续复查漏洞的时候,就能清楚知道问题来自哪个镜像层、哪个基础镜像,或者哪个应用的构建版本。
2、区分基础镜像和应用层问题
整理结果的时候,要区分漏洞是来自基础镜像,还是应用构建过程中新增加的软件包。基础镜像的问题,通常要通过升级基础镜像来解决;应用层的问题,就可能需要调整依赖、构建脚本或者软件包的安装方式。Checkmarx的结果页面会展示识别到的镜像、相关的软件包和漏洞信息,适合用来做这类归类工作。
3、保留处理记录
针对高危漏洞,要记录下镜像名称、标签、漏洞编号、受影响的软件包、修复建议、负责人和复扫结果。对于暂时无法修复的漏洞,也要说明具体的原因,比如基础镜像暂时还没发布修复版本,或者业务依赖暂时不能升级,不能只写一句“接受风险”就完事。
总结
总的来说,关于Checkmarx容器镜像扫描怎么启用、扫描失败怎么排查,可以按照确认扫描对象、启用Container Security扫描器、通过CLI指定镜像、配置仓库认证、查看日志定位失败点的思路来处理。容器镜像扫描不是单纯的扫描代码,它还涉及镜像标签、仓库权限、基础镜像、软件包清单和CI/CD环境等多个方面;把这些信息都固定下来,扫描结果才方便后续复查、修复和版本追溯。