实践「容器镜像扫描」,Get 云原生应用的正确打开方式


🌟 容器技术的兴起,让应用程序更加轻量化和可移植,大大提高了应用交付效率。但容器中的应用也面临各种安全威胁,容器及其镜像安全不可小觑

 

近日,在「DevSecOps 软件安全开发实践」课程上,极狐(GitLab) 高级专业服务交付工程师唐恩、极狐(GitLab) 研发经理张頫,分享了容器镜像扫描的原理及代码实现,并演示了极狐GitLab 容器镜像扫描功能,帮助大家进一步把握容器安全。

 

以下内容整理自本次直播:

 

什么是容器镜像扫描?

 

首先,回顾 2 个基本概念:

 

  • 容器:一种打包方式,用于封装应用程序的代码和依赖项,使应用程序与底层基础架构分离,使其可以在不同环境中运行。容器技术大大提高了应用交付与迁移效率,尤其在云原生场景下,其价值更加凸显。Docker 是目前最为流行的容器方案。

  • 容器镜像:用于创建容器的文件模板,存储了运行环境和应用所需的文件系统及软件。通过使用不同的容器镜像,可以创建出运行不同应用或操作系统环境的容器实例。

 

容器镜像扫描则是指对容器镜像进行安全检测的过程,属于 DevSecOps 中 Sec 的一环。通过检测和评估已知威胁与漏洞,最大限度降低风险,确保镜像安全性与健康性。

 

为什么要进行容器镜像扫描?

 

容器技术给软件交付带来前所未有的灵活性与效率,但也不可避免地增加了安全面临的不确定性。

 

近年来,各种报告和统计数据显示,容器安全正受到越来越多的关注,这也推动容器镜像扫描等安全防护措施的广泛应用。

 

例如,Datadog 发布的报告显示,目前已有 25% 的公司采用了 Docker 技术,相较前一年提升 6%,表明 Docker 使用率快速增长,渗透到了越来越多企业中

 

容器镜像扫描

 

 

同时,Sysdig 发布的容器漏洞报告显示,目前有 75% 的容器存在严重或危急级别的漏洞。这表明容器安全成为严峻问题,需要企业高度重视

 

容器镜像扫描

 

 

容器技术带来的便利,与容器安全,两者如何兼得?容器镜像扫描等安全工具和机制成为解题关键

 

极狐GitLab 容器镜像扫描 4 大优势

 

 一站式平台,无需额外工具

极狐GitLab 本身是一站式 DevSecOps 平台,内置集容器镜像扫描,无需安装和维护额外工具

 

 简单易用,一行配置高度自动化

容器镜像扫描属于极狐GitLab 流水线模板之一。用户在流水线配置文件中,通过 include 字段即可引用,容器镜像扫描整个流程就会自动完成,包括拉取镜像、启动扫描器、生成报告等步骤。

 

 灵活控制,高效和安全齐备

容器镜像扫描可以应用于开发、构建、测试、生产等各环境,实现容器镜像全生命周期的安全管理。

 

得益于极狐GitLab 强大的流水线功能,用户可以通过配置将把容器镜像扫描控制到某一阶段中。例如在开发环节,不进行容器镜像扫描;在发布环节自动触发容器镜像扫描,灵活控制,达到既高效又安全的目的。

 

 报告可视化,清晰详尽便于处理

容器镜像扫描完成后,通过 CI/CD 流水线中的 artifacts  关键词指定将报告输出为 JSON 文本,并自动解析为可视化报告(如下图),报告中包含镜像概述、检测到的漏洞清单、风险等级等信息,清晰详尽,方便用户分析与处理。

 

容器镜像扫描

 

 

除了在极狐GitLab 流水线界面可以查看漏洞报告,在「安全与合规 → 漏洞报告」也可查看最新漏洞情况(如下图)。

 

容器镜像扫描

 

由 Merge Request 所触发的容器镜像安全扫描,可直接在 Merge Request 页面中查看报告(如下图),方便用户更好地审查代码。

 

容器镜像扫描

 

 

如何启用极狐GitLab 容器镜像扫描 ?

1

总体流程

极狐GitLab 容器镜像扫描的总体流程如图所示:

 

容器镜像扫描

 

 

  1. 用户使用 container-scanning.yml 定义作业;

  2. 极狐GitLab 计算变量值,生成如下 Key-value;

  3. 极狐GitLab 选择 Runner 来执行此作业,拉取镜像并启动容器;

  4. 根据不同的 Linux 发行版和 CPU 架构生成对应的容器镜像。

2

前提条件

启用极狐GitLab 容器镜像扫描,需要满足以下前提条件:

 

  • 流水线中需包含 Test Stage(模板中定义的 Stage 名为 Test);

  • 具有 Docker 或 Kubernetes 执行器的 Runner,用于拉取和扫描镜像;

  • Docker Engine 版本高于 18.09.03;

  • 有一个镜像仓库,用于存放打包好的镜像,让扫描器能够到指定目标拉取镜像进行扫描。

3

在流水线中引用容器镜像扫描

include:
  - template: Jobs/Build.gitlab-ci.yml
  - template: Security/Container-Scanning.gitlab-ci.yml

 

此处建议使用极狐GitLab 的 Container Registry 做镜像仓库,非常便于使用容器镜像扫描,几乎不需要额外配置,就可以自动推送到镜像仓库,拉取扫描。

 

注意:如果是使用外部镜像仓库,需要自定义CS_REGISTRY_USER 和 CS_REGISTRY_PASSWORD。

 

 Include YAML 

 

容器镜像扫描

 

 

Container-scanning 基于 Ruby,第 1 个作用就是编译 container-scanning 所需的所有镜像。

 

极狐GitLab 将预编译打包好的镜像,汇总浓缩为 container-scanning :5 ,其中包含了非常丰富的内容(详情访问:https://gitlab.com/gitlab-org/security-products/analyzers/container-scanning)。其背后的技术是 Docker manifest——manifest 作为元数据的具体表达形式,包含了描述一个镜像所需的全部信息,这使得 Docker 能够处理各种镜像,包括单架构、多架构以及带有多个 Tag 的复杂镜像。

 

变量解析

 

在所有极狐GitLab CI 模板中,最重要的就是变量。

 

那么极狐GitLab 中变量的工作方式是什么?答案如下:

 

  • 当用户在 .gitlab-ci.yml 文件中定义变量时,极狐GitLab 会将所有变量解析为键值对

  • 将这些键值对作为环境变量,传递给 Runner;

  • Runner可在执行 Job 时,查找和使用这些环境变量。

 

这种变量机制使得 .gitlab-ci.yml 文件具有很大灵活性。用户可以在文件中定义任意变量,这些变量值会在运行 Job时被 Runner 识别和使用,简化了 Job 之间以及 Job 与运行环境之间的交互,用户无需硬编码值,即可使用变量达到解耦效果。

 

同时,这也使得 .gitlab-ci.yml 文件可作为模板,其中变量值可以根据执行 Job 环境进行动态替换。一个模板文件即可在不同环境中重复使用,提高文件复用性

 

最终报告

 

Container-scanning 通过调用 trivy 和 grype 等扫描工具,检测容器镜像中的漏洞与风险。而这些工具各自具有自己的报告格式,container-scanning 的第 2 个作用就是将 trivy 和 grype 的检测结果转换为统一的 极狐GitLab 自定义安全报告模式(详情访问:https://gitlab.com/gitlab-org/security-products/security-report-schemas)

 

这实现了检测的灵活性与结果的标准化,为用户都带来更佳体验;也体现了极狐GitLab 在安全检测与管理方面的重要价值,使得极狐GitLab 能够成为 DevOps 过程中安全保障的关键环节。 

 

总结

 

容器镜像扫描使得研发团队可以在早期发现容器镜像中的潜在漏洞与风险,及时进行修复与更新,确保最后交付到生产环境的镜像达到符合标准的安全等级,提高软件交付的整体安全性与可靠性。

 

事实上,容器镜像的漏洞与风险并非 Docker 或 Kubernetes 等技术本身的问题,而是我们在使用这些技术构建镜像与微服务时带入的缺陷与错误。唯有对整个交付流程的每个环节进行安全检查与审核,持续检测存在的漏洞与错误,及时予以修复,软件交付的安全性才能得以系统性的提高。这也呼应了 DevSecOps 理念——把安全特性和控制措施深度嵌入到 DevOps 的每一个过程与实践中,使得研发团队可以在保持高效的同时,兼顾软件产品的安全与质量,真正实现精英研发效能。