四款免费、易用的Docker漏洞扫描工具

本文向您介绍四种既可以扫描Docker镜像中的漏洞,又能够被轻松地集成到CI/CD中的四种免费实用工具。

基本原理

所有这些工具的工作原理都比较类似。它们使用的是如下两步流程:

  1. 生成软件物料清单(Software Bill of Materials,SBOM)。
  2. 将SBOM与不同的漏洞数据库进行比较。

此处的SBOM是针对那些Docker镜像中运行的系统和应用而安装的、所有软件依赖包列表。由于系统级软件包经常被忽略,因此在管道中进行Docker扫描是非常重要的。这就引出了第二步,即:根据多个漏洞数据库,对SBOM中的每个软件包进行检查,以发现其中是否存在漏洞。而且在搜寻和匹配时,软件包的版本也应被考虑在内。

1. Docker Scout

该工具由Docker公司开发并已内置到了Docker Desktop应用中。遗憾的是,它并没有与Docker的CLI捆绑,所以您需要手动进行安装。即,在Docker的CLI环境中,您需要使用如下单行命令来完成安装:

curl -sSfL https://raw.githubusercontent.com/docker/scout-cli/main/install.sh | sh -s --

当然,您也可以从其官方的GitHub库处进行复制。一旦您具备了运行docker scout的条件,便可以运行docker scout quickview了。顾名思义,它主要适合于只想获悉Docker中存在着多少漏洞及其严重程度,而无需深究具体漏洞的需求。

顾名思义,它主要适合于只想获悉Docker中存在着多少漏洞及其严重程度,而无需深究具体漏洞的需求。

~❯ docker scout quickview ubuntu:20.04
 ✓ Image stored for indexing
 ✓ Indexed 127 packages

 Target │ ubuntu:20.04 │ 0C 0H 3M 10L 
digest │ bf40b7bc7a11 │

如上所示,该Ubuntu 20.04镜像并不存在严重或高危的漏洞,不过有着几个中等严重程度的漏洞。若要获取每个漏洞的详细信息,请运行docker scout cves。它将显示与漏洞相关的CVE列表,并提供相应的链接,以便您了解更多信息。此外,Docker Scout还会告诉你是否有更新版本的受影响软件包修复了该漏洞。例如:

~❯ docker scout cves ubuntu:20.04
...
pkg:deb/ubuntu/gnutls28@3.6.13-2ubuntu1.8?os_distro=focal&os_name=ubuntu&os_version=20.04

 ✗ MEDIUM CVE-2023-5981
 https://scout.docker.com/v/CVE-2023-5981
 Affected range : <3.6.13-2ubuntu1.9 
 Fixed version : 3.6.13-2ubuntu1.9 
 CVSS Score : 5.9 
 CVSS Vector : CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N
...

在上述例子中,其中的一个中型漏洞来自版本为3.6.13-2ubuntu1.8的gnutls软件包。该漏洞已在3.6.13-2ubuntu1.9版本中被修复,但该Ubuntu Docker镜像的维护者显然还没有及时更新镜像。

同时,Docker Scout还被内置在了DockerHub中,DockerHub是由Docker公司托管的镜像注册中心。它可以免费为您的3个镜像执行扫描。若要扫描更多的镜像,则需升级到付费计划版本。DockerHub会在每次推送新标签时,都执行一次漏洞扫描。要启用该服务,请打开镜像的repo(存储库),进入“设置”,然后启用Docker Scout镜像分析。

DockerHub上的Docker Scout扫描报告

DockerHub上的Docker Scout扫描报告

Docker Scout对于CI/CD服务的支持相当不错。他们为GitHub Actions、GitLab CI/CD、CircleCI、Azure DevOps、Jenkins甚至是BitBucket Pipelines都提供了各种模板。请参见链接--https://github.com/docker/scout-cli?tab=readme-ov-file#ci-integration。

2. Trivy

Trivy是由Aqua Security开发的一款开源工具。相比Docker Scout,它除了能够扫描Docker镜像外,也提供隐蔽检测和对IaC(基础设施即代码)配置错误的扫描。您既可以用多种软件包管理器(如:apt、yum、brew、pacman、port、以及nix)来安装Trivy,也可以通过链接--Installation - Trivy,直接下载其二进制文件。在首次运行时,它会将所有漏洞数据库都下载到本地环境中。您可以通过运行trivy image来扫描目标镜像。下面,我们将从Dockerfile中创建一个自定义的镜像:

FROM alpine:3.18

RUN mkdir /app
COPY <<EOF /app/aws-creds
[default]
aws_access_key_id = AKIA5432112345XXXXPP
aws_secret_access_key = P9YXdfASASDfdsfdldFdfdfs4sldkfksfsdle3vg
EOF

Dockerfile会使用alpine作为基础镜像,以创建带有硬编码AWS密钥的aws-creds文件。我们可以通过如下命令来构建镜像并运行扫描。

~❯ docker build -t test-image -f Dockerfile .
~❯ trivy image test-image
test-image (alpine 3.18.5)

Total: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)

/app/aws-creds (secrets)

Total: 2 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 2)

CRITICAL: AWS (aws-access-key-id)
═══════════════════════════════════════════════════════════════════════
AWS Access Key ID
───────────────────────────────────────────────────────────────────────
 /app/aws-creds:2 (added by 'COPY <<EOF /app/aws-creds # buildkit')
───────────────────────────────────────────────────────────────────────
 2 [ aws_access_key_id = ********************
 3 aws_secret_access_key = ****************************************
───────────────────────────────────────────────────────────────────────

在此,Trivy运行了两种类型的扫描:针对已安装软件包的漏洞扫描、以及用于查找文件中密钥的密钥检测。在本例中,漏洞扫描并没有发现任何问题。这是在意料之中的,毕竟我们使用的是alpine镜像,其中只有非常基本的操作系统软件包,没有其他,甚至连Bash都没有。不过,密钥检测发现了aws-creds中的硬编码密钥。同时,Trivy还能捕捉到环境变量中的密钥。例如,使用如下由Dockerfile构建的镜像,其生成的报告也会体现出发现了关键性问题。

FROM alpine:3.18
ENV AWS_ACCESS_KEY_ID=AKIA5432112345XXXXPP
ENV AWS_SECRET_ACCESS_KEY=P9YXdfASDfdsfdldFdfdfs4sldkfksfsdle3vg

此外,您还可以为密钥扫描自定义匹配器,以扫描Dockerfile本身,而不是镜像。为此,您可以导航到包含了Dockerfile的目录,然后按照如下方式运行trivy config。

~❯ trivy config .
Dockerfile (dockerfile)

Tests: 26 (SUCCESSES: 24, FAILURES: 2, EXCEPTIONS: 0)
Failures: 2 (UNKNOWN: 0, LOW: 1, MEDIUM: 0, HIGH: 1, CRITICAL: 0)

HIGH: Specify at least 1 USER command in Dockerfile with non-root user
════════════════════════════════════════════════════════════════════════════=
Running containers with 'root' user can lead to a container escape situation.
It is a best practice to run containers as non-root users,
which can be done by adding a 'USER' statement to the Dockerfile.

See https://avd.aquasec.com/misconfig/ds002
─────────────────────────────────────────────────────────────────────────────

当然,trivy config也会扫描Kubernetes、Terraform和CloudFormation清单,以检查它们是否遵循了最佳实践。您可以参照由链接--Redirecting提供的多种选择,将Trivy集成到自己的CI/CD中。

3. Grype

由Anchore开发的Grype虽然不如Trivy那样成熟,但是它仍在不断改进中。尽管Grype不具备配置扫描和密钥检测等功能,但是它能够很好地完成扫描Docker镜像包的主要功能。从原理上说,Grype实际上使用了同样由Anchore开发的Syft,来生成SBOM。据此,它将软件包与漏洞数据库进行了比较。您可以使用如下命令来安装它。

curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sudo sh -s -- -b /usr/local/bin

要扫描镜像,您只需运行如下命令:

~❯ grype aquasec/trivy
 ✔ Scanned for vulnerabilities [14 vulnerability matches] 
 ├── by severity: 0 critical, 0 high, 14 medium, 0 low, 0 negligible
 └── by status: 2 fixed, 12 not-fixed, 0 ignored 
NAME INSTALLED FIXED-IN TYPE VULNERABILITY SEVERITY 
busybox 1.36.1-r5 apk CVE-2023-42366 Medium 
busybox 1.36.1-r5 apk CVE-2023-42365 Medium 
busybox 1.36.1-r5 apk CVE-2023-42364 Medium 
busybox 1.36.1-r5 apk CVE-2023-42363 Medium
...

在上例中,Grype测试了Trivy的镜像。类似Docker Scout,Grype也会告诉你是否有更新版本的受影响软件包修复了该漏洞。而且,Grype的优点在于它的漏洞列表并不杂乱,其每个漏洞在屏幕上都只占一行。如果您想进一步了解某个漏洞的话,则可以使用grype explain。

grype -o json aquasec/trivy | grype explain --id CVE-2023-42366

不过,由于Grype不会缓存镜像的SBOM,因此即便您刚刚完成了一次扫描,每次任务都必须从零开始加载和扫描镜像。对于CI/CD而言,由于它只有一个适用于GitHub Actions的模板,因此您必须手动创建针对其他CI/CD服务的扫描任务。

4. Snyk Container

Snyk可以通过各种功能来简化应用程序的安全加固过程。不过,Snyk仅供个人免费使用,而且并不开源(当然它也有付费计划)。其Snyk Container则是一款可以被免费提供的,用于扫描Docker镜像的工具。在使用之前,您需要在snyk.io处注册一个账户,接着可以通过链接--Install or update the Snyk CLI - Snyk User Docs安装Snyk CLI,或运行如下命令:

curl --compressed https://static.snyk.io/cli/latest/snyk-linux -o snyk
chmod +x ./snyk
sudo mv ./snyk /usr/local/bin/

在运行任何命令之前,您都需要通过如下命令在页面上完成身份验证。

Snyk auth

至此,我们便可以使用snyk container test来扫描镜像了。注意,请不要被该命令的名称所误导。它扫描的是镜像,而不是正在运行的容器。

~❯ synk container test anchore/grype
Testing anchore/grype...

✗ Medium severity vulnerability found in google.golang.org/protobuf/encoding/protojson
 Description: Stack-based Buffer Overflow
 Info: https://security.snyk.io/vuln/SNYK-GOLANG-GOOGLEGOLANGORGPROTOBUFENCODINGPROTOJSON-6137908
 Introduced through: google.golang.org/protobuf/encoding/protojson@v1.31.0
 From: google.golang.org/protobuf/encoding/protojson@v1.31.0

✗ Medium severity vulnerability found in golang.org/x/crypto/ssh
 Description: Authentication Bypass by Capture-replay
 Info: https://security.snyk.io/vuln/SNYK-GOLANG-GOLANGORGXCRYPTOSSH-6130669
 Introduced through: golang.org/x/crypto/ssh@v0.16.0
 From: golang.org/x/crypto/ssh@v0.16.0
 Fixed in: 0.17.0

Tested 827 dependencies for known issues, found 2 issues.

上例便是我们使用Snyk来测试Grype的镜像。可见,Snyk发现了2个中等严重程度的问题。不同于Trivy和Grype把摘要放在报告最上面,Snyk则在漏洞列表的末尾处才给出小结摘要。这就意味着,当漏洞列表过长时,查阅小结就不太方便了。同时,Snyk也能够扫描各种IaC文件,即:使用snyk iac test命令来扫描Terraform、CloudFormation、Kubernetes、Kustomize、Helm、ARM和Serverless等文件。此外,Snyk还有一个Web应用版的GUI(如下图),可以连接到Git存储库处扫描漏洞。

来自docs.snyk.io的Snyk项目的漏洞信息

来自docs.snyk.io的Snyk项目的漏洞信息

当然,Snyk也集成了大量的CI/CD功能,具体请参考链接:Snyk CI/CD integrations - Snyk User Docs。

小结

综上所述,Snyk无疑是四种工具中功能最强大的。但是它需要一个账户,而且只能免费供个人使用。如果您正在寻找一款开源工具的话,Trivy会是您的不二之选。它比Docker Scout和Grype具有更多的功能,且速度相当快。总的来说,我强烈建议您在CI/CD管道中至少实施这些工具中的一种,以实现对应用程序的安全加固。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/332995.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虚拟线程探索与实践(JDK19)

优质博文&#xff1a;IT-BLOG-CN 一、简介 虚拟线程是轻量级线程&#xff0c;极大地减少了编写、维护和观察高吞吐量并发应用的工作量。虚拟线程是由JEP 425提出的预览功能&#xff0c;并在JDK 19中发布&#xff0c;JDK 21中最终确定虚拟线程&#xff0c;以下是根据开发者反馈…

解锁文字魔法:探索自然语言处理的秘密——从技术揭秘到应用实战!

目录 前言 关键技术——揭密自然语言处理的秘密武器&#xff01; 领域应用——自然语言处理技术在不同领域的奇妙表演&#xff01; 超越极限——自然语言处理技术面临的顽强挑战揭秘&#xff01; 科技VS伦理——自然语言处理技术的发展与伦理社会的纠结较量&#xff01; 开…

LINUX基础培训十一之日志管理

前言、本章学习目标 了解LINUX中日志文件及其功能掌握rsyslog服务及启动方法熟悉日志文件格式的分析 一、Linux日志常见文件及其功能 日志文件是重要的系统信息文件&#xff0c;其中记录了许多重要的系统事件&#xff0c;包括用户的登录信息、系统的启动信息、系统的安全信…

最长上升子序列模型(LIS)

最长上升子序列模型就像它的名字一样&#xff0c;用来从区间中找出最长上升的子序列。它主要用来处理区间中的挑选问题&#xff0c;可以处理上升序列也可以处理下降序列&#xff0c;原序列本身的顺序并不重要。 模型 895. 最长上升子序列&#xff08;活动 - AcWing&#xff0…

分享一个基于easyui前端框架开发的后台管理系统模板

这是博主自己在使用的一套easyui前端框架的后台管理系统模版&#xff0c;包含了后端的Java代码&#xff0c;已经实现了菜单控制、权限控制功能&#xff0c;可以直接拿来使用。 springboot mybatis mybatis-plus实现的增删查改完整项目&#xff0c;前端使用了easyui前端框架。…

怎么在桌面查看备忘录新的提醒事项?方法教程

在这个信息爆炸的时代&#xff0c;我们每天都面临着无数的任务和提醒。作为一名忙碌的职场人&#xff0c;我经常需要依赖备忘录来记录重要的待办事项&#xff0c;以免遗漏。备忘录&#xff0c;就像我生活中的小助手&#xff0c;帮我记下工作会议、生日提醒、购物清单等等&#…

基于 Hologres+Flink 的曹操出行实时数仓建设

本文整理自曹操出行实时计算负责人林震基于 HologresFlink 的曹操出行实时数仓建设的分享&#xff0c;内容主要分为以下六部分&#xff1a; 曹操出行业务背景介绍曹操出行业务痛点分析HologresFlink 构建企业级实时数仓曹操出行实时数仓实践曹操出行业务成果分析未来展望 一、曹…

基于Vue+Canvas实现的画板绘画以及保存功能,解决保存没有背景问题

基于VueCanvas实现的画板绘画以及保存功能 本文内容设计到的画板的js部分内容来源于灵感来源引用地址&#xff0c;然后我在此基础上&#xff0c;根据自己的需求做了修改&#xff0c;增加了其他功能。 下面展示了完整的前后端代码 这里写目录标题 基于VueCanvas实现的画板绘…

OpenAI GPT应用商城正式上线!超300万个GPT应用供选择

原创 | 文 BFT机器人 千呼万唤始出来&#xff0c;终于在北京时间1月11日凌晨&#xff0c;OpenAI在官网发布了令人振奋的消息&#xff1a;备受瞩目的GPT store正式上线&#xff01; 这个商店旨在让团体和企业用户轻松找到那些既实用又热门的GPT应用。在这里&#xff0c;用户可以…

python基础知识

python基础语法 python基础精讲 http://t.csdnimg.cn/HdKdi 本专栏主要针对python基础语法&#xff0c;帮助学习者快速接触并掌握python大部分最重要的语法特征。 1、基本数据类型和变量 2、分支结构与循环结构 3、函数与异常处理 4、类与模块 5、文件读写 通过本专栏可以快…

Unity 编辑器篇|(十)Handles (全面总结 | 建议收藏)

目录 1. 前言2 参数总览3 Handles两种使用方式3.1 基于Editor类的OnSceneGUI3.2 基于EditorWindow 4 Handles绘制4.1 Draw&#xff1a;绘制元几何体(点、线、面)4.1.1 抗锯齿&#xff1a; DrawAAPolyLine 、 DrawAAConvexPolygon4.1.2 绘制实线: DrawLine 、 DrawLines 、DrawP…

(2)(2.1) Andruav Android Cellular(一)

文章目录 前言 1 Andruav 是什么&#xff1f; 2 Andruav入门 3 Andruav FPV 4 Andruav GCS App​​​​​​​ 前言 Andruav 是一个基于安卓的互联系统&#xff0c;它将安卓手机作为公司计算机&#xff0c;为你的无人机和遥控车增添先进功能。 1 Andruav 是什么&#xff…

门禁监控如何提升安全系数?这个技术,学习一下!

随着社会的不断发展和科技的快速进步&#xff0c;安全管理成为各个领域至关重要的议题。在这一背景下&#xff0c;门禁监控系统逐渐崭露头角&#xff0c;成为保障建筑物和场所安全的关键工具。 门禁监控系统不仅在提高安全性方面发挥着积极作用&#xff0c;而且通过智能化的技术…

《模拟龙生》|500行Go代码写一个随机冒险游戏|巨龙修为挑战开启

一、前言 新年就要到了&#xff0c;祝大家新的一年&#xff1a;&#x1f432; 龙行龘龘&#xff0c;&#x1f525; 前程朤朤&#xff01; 白泽花了点时间&#xff0c;用 500行 Go 代码写了一个控制台的小游戏&#xff1a;《模拟龙生》&#xff0c;在游戏中你将模拟一条新生的…

Linux系统三剑客之grep和正则表达式的介绍(一)

1.正则表达式 目录 1.正则表达式 1.什么是正则表达式 &#xff1f; 2.正则表达式的使用场景 3.正则表达式字符表示 4.它们之间的区别 2.grep命令 作用&#xff1a; 语法&#xff1a; 说明&#xff1a; 选项&#xff1a;options 重点 实例 3.后面的下次再更新。 …

C语言位域定义与使用

参考文章&#xff1a; 【C语言】详解位域定义与使用_c 语言定义位-CSDN博客 代码有修改&#xff0c;主要是变量初始化&#xff0c;原程序可能相应内存不能写。且第二个字节F不好区分各位。 #include <stdio.h>typedef struct {unsigned short b1 : 1;unsigned short b…

情人节专属--HTML制作情人节告白爱心

💕效果展示 💕html展示 <!DOCTYPE html> <html lang="en" > <head>

ros2仿真学习04 -turtlebot3实现cartographer算法建图演示

安装看这里 https://blog.csdn.net/hai411741962/article/details/135619608?spm1001.2014.3001.5502 虚拟机配置&#xff1a; 内存16g cpu 4 核 磁盘40G,20G 不够 启动仿真 ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py启动成功如下 启动建图 重新开一个…

浅谈情绪的分类合集

什么是情绪分类 情绪分类&#xff0c;是指区分或者对比一种情绪与另一种情绪的方法&#xff0c;目前在情绪研究&#xff08;emotion research&#xff09;与情感科学&#xff08;affective science&#xff09;是具有争议的问题。有两个讨论情绪分类的基本观点&#xff1a; 情…

【计算机组成与体系结构Ⅱ】Tomasulo 算法模拟和分析(实验)

实验5&#xff1a;Tomasulo 算法模拟和分析 一、实验目的 1&#xff1a;加深对指令级并行性及开发的理解。 2&#xff1a;加深对 Tomasulo 算法的理解。 3&#xff1a;掌握 Tomasulo 算法在指令流出、执行、写结果各阶段对浮点操作指令以及 load 和 store 指令进行了什么处…