容器镜像安全:安全漏洞扫描神器Trivy

trivy · 浏览次数 : 0

小编点评

一. 系统环境 本文基于Docker version 20.10.14和Linux操作系统Ubuntu 18.04,服务器版本为docker软件版本CPU架构Ubuntu 18.04.5 LTS。 二. 前言 随着容器技术的普及,容器镜像的安全性问题日益凸显。容器镜像中可能存在的漏洞会被攻击者利用,从而导致整个应用的安全风险。因此,对容器镜像进行安全漏洞扫描成为了必要的需求。Trivy是一款由aquasecurity团队开发的容器镜像安全漏洞扫描工具,支持Docker、Kubernetes等多种容器技术,具有易于使用、支持多种漏洞数据库等特点。 三. Trivy简介 Trivy是一款全面且多功能的安全扫描程序。Trivy 具有查找安全问题的扫描器。Trivy官网为:https://github.com/aquasecurity/trivy ,Trivy软件包下载地址为:https://github.com/aquasecurity/trivy/releases/ 。Trivy可以扫描的对象为:容器镜像;文件系统;Git Repository (远程);虚拟机映像;Kubernetes;AWS系统。Trivy能够发现的问题有:正在使用的操作系统包和软件依赖项(SBOM);已知漏洞(CVE);IaC 问题和错误配置;敏感信息和机密;软件许可证。 四. Trivy漏洞扫描原理 Trivy通过分析容器镜像的文件系统,识别出其中的软件包及其版本号,然后与漏洞数据库进行匹配,找出存在安全漏洞的软件包。Trivy采用了以下技术实现漏洞扫描:Dockerfile解析;漏洞数据库匹配;漏洞详情展示。 CVE全称是Common Vulnerabilities and Exposures,即通用漏洞披露,它是MITRE公司维护和更新的安全漏洞列表,列表中的每个条目都会有一个唯一的CVE编号,即CVE ID,供安全研究员和受攻击的软件供应商使用,以便确定和回应安全漏洞。CVE条目包含了与CVE ID相关的漏洞的描述性数据(即简要描述和至少一个参考)。当前CVE累计收录了19万+个安全漏洞。 Trivy漏洞扫描原理简单来说就是:Trivy下载漏洞数据库CVE到本地,Trivy本地数据库记录了常见的漏洞信息,Trivy读取镜像里的程序和本地数据库进行比对,确定镜像是否存在漏洞。 五. 利用trivy检测容器镜像的安全性 首先需要安装docker。[root@etcd2 ~]# yum -y install docker-ce查看docker版本。[root@etcd2 ~]# docker -vDocker version 20.10.12, build e91ed57配置docker镜像加速器。[root@etcd2 ~]# cat /etc/docker/daemon.json{ \"registry-mirrors\": [ \"https://frz7i079.mirror.aliyuncs.com\" ]}提前下载好镜像做准备,我们下载了redis,busybox,nginx镜像。[root@etcd2 ~]# docker pull redis[root@etcd2 ~]# docker pull busybox[root@etcd2 ~]# docker pull nginx[root@etcd2 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmysql latest 7614ae9453d1 5 months ago 113MBnginx latest 605c77e624dd 5 months ago 141MBredis latest 7614ae9453d1 5 months ago 113MB下载好trivy安装包。[root@etcd2 ~]# ls trivy_0.28.1_Linux-64bit.rpm trivy_0.28.1_Linux-64bit.rpm安装trivy。[root@etcd2 ~]# yum -y install trivy_0.28.1_Linux-64bit.rpm 现在trivy就安装好了。[root@etcd2 ~]# which trivy/usr/local/bin/trivy查看帮助:trivy --help。[root@etcd2 ~]# trivy --help查看trivy扫描镜像的语法:[root@etcd2 ~]# trivy image --helptrivy image nginx 表示检测nginx镜像的漏洞,第一次检测漏洞会下载漏洞数据库,漏洞数据库目录默认是~/.cache/trivy 。[root@etcd2 ~]# trivy image nginx2022-06-16T17:06:01.035+0800\tINFO\tNeed to update DB2022-06-16T17:06:01.036+0800\tINFO\tDB Repository: ghcr.io/aquasecurity/trivy-db2022-06-16T17:06:01.036+0800\tINFO\tDownloading DB...32.56 MiB / 32.56 MiB [------------------------------------------------------------------------------------------------------------------------------------------------------------] 100.00% 42.01 KiB p/s 13m14ss2022-06-16T17:19:28.400+0800\tWARN\tIncrease --timeout value2022-06-16T17:19:28.400+0800\tFATAL\timage scan error: scan error: image scan failed: failed analysis: analyze error: timeout: context deadline exceeded漏洞数据库下载好之后,就可以检测镜像漏洞了,显示了5个级别的漏洞:UNKNOWN: 1, LOW: 93, MEDIUM: 43, HIGH: 41, CRITICAL: 24。[root@etcd2 ~]# trivy image nginx2022-06-16T17:23:11.533+0800\tINFO\tDetected OS: debian2022-06-16T17:23:11.533+0800\tINFO\tDetecting Debian vulnerabilities...2022-06-16T17:23:11.585+0800\tINFO\tNumber of language-specific files: 0nginx (debian 11.2)Total: 202 (UNKNOWN: 1, LOW: 93, MEDIUM: 43, HIGH: 41, CRITICAL: 24)┌─────────────────────┬──────────────────┬──────────┬────────────────────┬─────────────────────────┬──────────────────────────────────────────────────────────────┐│ Library │ Vulnerability │ Severity │ Installed Version │ Fixed Version │ Title │├─────────────────────┼──────────────────┼──────────┼────────────────────┼─────────────────────────┼──────────────────────────────────────────────────────────────┤│ apt │ CVE-2011-3374 │ LOW │ 2.2.4 │ │ It was found that apt-key in apt, all versions, do not ││ │ │ │ │ │ correctly... ││ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2011-3374 │├─────────────────────┼──────────────────┼──────────┼────────────────────┼─────────────────────────┼──────────────────────────────────────────────────────────────┤│ bsdutils │ CVE-2021-3995 │ MEDIUM │ 2.36.1-8 │ 2.36.1-8+deb11u1 │ util-linux: Unauthorized unmount of FUSE filesystems ││ │ │ │ │ │ belonging to users with similar uid... ││ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2021-3995 │├─────────────────────┼──────────────────┼──────────┼────────────────────┼─────────────────────────┼──────────────────────────────────────────────────────────────┤......├─────────────────────┼──────────────────┼──────────┼────────────────────┼─────────────────────────┼──────────────────────────────────────────────────────────────┤│ zlib1g │ CVE-2018-25032 │ HIGH │ 1:1.2.11.dfsg-2 │ 1:1.2.11.dfsg-2+deb11u1 │ zlib: A flaw found in zlib when compressing (not ││ │ │ │ │ │ decompressing) certain inputs... ││ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2018-25032 │└─────────────────────┴──────────────────┴──────────┴────────────────────┴─────────────────────────┴──────────────────────────────────────────────────────────────┘trivy缓存漏洞数据库目录如下:[root@etcd2 ~]# ls .cache/trivy/ -lh总用量 0drwxr-xr-x 2 root root 43 6月 16 17:19 dbdrwx------ 2 root root 22 6月 16 17:06 fanaltrivy会下载漏洞数据库到本地,有时候下载会很慢,可以直接把已经安装好的~/.cache/trivy文件夹直接打包,放到新安装的机器上,就可以直接使用trivy了。Trivy开始运行时每 12 小时下载一次漏洞数据库。这通常很快,因为数据库的大小只有 10~30MB。但是,如果您甚至想跳过它,请使用该--skip-db-update选项: trivy image --skip-db-update nginx:1.16。trivy只下载漏洞数据库语法为:[root@etcd2 ~]# trivy image --download-db-only检测redis镜像漏洞。[root@etcd2 ~]# trivy image redis | head2022-06-16T17:38:18.504+0800\tINFO\tDetected OS: debian2022-06-16T17:38:18.505+0800\tINFO\tDetecting Debian vulnerabilities...2022-06-16T17:38:18.520+0800\tINFO\tNumber of language-specific files: 0redis (debian 11.2)===================Total: 108 (UNKNOWN: 0, LOW: 63, MEDIUM: 18, HIGH: 16, CRITICAL: 11)┌──────────────────┬──────────────────┬──────────┬───────────────────┬─────────────────────────┬──────────────────────────────────────────────────────────────┐│ Library │ Vulnerability │ Severity │ Installed Version │ Fixed Version │ Title │检测nginx镜像漏洞。[root@etcd2 ~]# trivy image nginx | head2022-06-16T17:38:35.172+0800\tINFO\tDetected OS: debian2022-06-16T17:38:35.172+0800\tINFO\tDetecting Debian vulnerabilities...2022-06-16T17:38:35.189+0800\tINFO\tNumber of language-specific files: 0nginx (debian 11.2)===================Total: 202 (UNKNOWN: 1, LOW: 93, MEDIUM: 43, HIGH: 41, CRITICAL: 24)┌─────────────────────┬──────────────────┬──────────┬────────────────────┬─────────────────────────┬──────────────────────────────────────────────────────────────┐│ Library │ Vulnerability │ Severity │ Installed Version │ Fixed Version │ Title │注意Trivy 漏洞报告格式默认是表格。[root@etcd2 ~]# trivy image -f table nginx:1.16Trivy 漏洞报告格式也可以设置为JSON格式(-f), -o指定输出打印到文件里。[root@etcd2 ~]# trivy image -f json -o results.json nginx:1.16 六. 总结 Trivy是一款功能强大、易于使用的容器镜像安全漏洞扫描工具。通过在docker环境下的实践,我们了解到Trivy可以有效地检测容器镜像中的安全漏洞,帮助我们保障应用的安全性。

正文

一.系统环境

本文主要基于Docker version 20.10.14和Linux操作系统Ubuntu 18.04。

服务器版本 docker软件版本 CPU架构
Ubuntu 18.04.5 LTS Docker version 20.10.14 x86_64

二.前言

随着容器技术的普及,容器镜像的安全性问题日益凸显。容器镜像中可能存在的漏洞会被攻击者利用,从而导致整个应用的安全风险。因此,对容器镜像进行安全漏洞扫描成为了必要的需求。Trivy是一款由aquasecurity团队开发的容器镜像安全漏洞扫描工具,支持Docker、Kubernetes等多种容器技术,具有易于使用、支持多种漏洞数据库等特点。

三.Trivy简介

Trivy是一款全面且多功能的安全扫描程序。Trivy 具有查找安全问题的扫描器。Trivy官网为:https://github.com/aquasecurity/trivy ,Trivy软件包下载地址为:https://github.com/aquasecurity/trivy/releases/
Trivy 可以扫描的对象为:

  • 容器镜像;
  • 文件系统;
  • Git Repository (远程);
  • 虚拟机映像;
  • Kubernetes;
  • AWS系统。

Trivy能够发现的问题有:

  • 正在使用的操作系统包和软件依赖项 (SBOM);
  • 已知漏洞 (CVE);
  • IaC 问题和错误配置;
  • 敏感信息和机密;
  • 软件许可证。

四.Trivy漏洞扫描原理

Trivy通过分析容器镜像的文件系统,识别出其中的软件包及其版本号,然后与漏洞数据库进行匹配,找出存在安全漏洞的软件包。Trivy采用了以下技术实现漏洞扫描:

  1. Dockerfile解析:Trivy可以根据Dockerfile自动解析出容器镜像的构建过程,获取镜像中包含的软件包及其版本号。

  2. 漏洞数据库匹配:Trivy将容器镜像中的软件包及其版本号与漏洞数据库进行匹配,找出存在安全漏洞的软件包。

  3. 漏洞详情展示:Trivy提供了详细的漏洞信息,包括漏洞描述、影响版本、修复建议等,帮助用户了解漏洞风险。

CVE全称是Common Vulnerabilities and Exposures,即通用漏洞披露,它是MITRE公司维护和更新的安全漏洞列表,列表中的每个条目都会有一个唯一的CVE编号,即CVE ID,供安全研究员和受攻击的软件供应商使用,以便确定和回应安全漏洞。CVE条目包含了与CVE ID相关的漏洞的描述性数据(即简要描述和至少一个参考)。当前CVE累计收录了19万+个安全漏洞。

Trivy漏洞扫描原理简单来说就是:Trivy下载漏洞数据库CVE到本地,Trivy本地数据库记录了常见的漏洞信息,Trivy读取镜像里的程序和本地数据库进行比对,确定镜像是否存在漏洞

五.利用trivy检测容器镜像的安全性

首先需要安装docker。

[root@etcd2 ~]# yum -y install docker-ce

查看docker版本。

[root@etcd2 ~]# docker -v
Docker version 20.10.12, build e91ed57

配置docker镜像加速器。

[root@etcd2 ~]# cat /etc/docker/daemon.json
{
    "registry-mirrors": [
        "https://frz7i079.mirror.aliyuncs.com"
    ]
}

提前下载好镜像做准备,我们下载了redis,busybox,nginx镜像。

[root@etcd2 ~]# docker pull redis

[root@etcd2 ~]# docker pull busybox

[root@etcd2 ~]# docker pull nginx

[root@etcd2 ~]# docker images
REPOSITORY                    TAG       IMAGE ID       CREATED        SIZE
busybox                       latest    ec3f0931a6e6   4 months ago   1.24MB
nginx                         latest    605c77e624dd   5 months ago   141MB
redis                         latest    7614ae9453d1   5 months ago   113MB

下载好trivy安装包。

[root@etcd2 ~]# ls trivy_0.28.1_Linux-64bit.rpm 
trivy_0.28.1_Linux-64bit.rpm

安装trivy。

[root@etcd2 ~]# yum -y install trivy_0.28.1_Linux-64bit.rpm 

现在trivy就安装好了。

[root@etcd2 ~]# which trivy
/usr/local/bin/trivy

查看帮助:trivy --help。

[root@etcd2 ~]# trivy --help

查看trivy扫描镜像的语法:

[root@etcd2 ~]# trivy image --help

trivy image nginx 表示检测nginx镜像的漏洞,第一次检测漏洞会下载漏洞数据库,漏洞数据库目录默认是~/.cache/trivy 。

[root@etcd2 ~]# trivy image nginx
2022-06-16T17:06:01.035+0800	INFO	Need to update DB
2022-06-16T17:06:01.036+0800	INFO	DB Repository: ghcr.io/aquasecurity/trivy-db
2022-06-16T17:06:01.036+0800	INFO	Downloading DB...
32.56 MiB / 32.56 MiB [------------------------------------------------------------------------------------------------------------------------------------------------------------] 100.00% 42.01 KiB p/s 13m14ss
2022-06-16T17:19:28.400+0800	WARN	Increase --timeout value
2022-06-16T17:19:28.400+0800	FATAL	image scan error: scan error: image scan failed: failed analysis: analyze error: timeout: context deadline exceeded

漏洞数据库下载好之后,就可以检测镜像漏洞了,显示了5个级别的漏洞:UNKNOWN: 1, LOW: 93, MEDIUM: 43, HIGH: 41, CRITICAL: 24。

[root@etcd2 ~]# trivy image nginx
2022-06-16T17:23:11.533+0800	INFO	Detected OS: debian
2022-06-16T17:23:11.533+0800	INFO	Detecting Debian vulnerabilities...
2022-06-16T17:23:11.585+0800	INFO	Number of language-specific files: 0

nginx (debian 11.2)

Total: 202 (UNKNOWN: 1, LOW: 93, MEDIUM: 43, HIGH: 41, CRITICAL: 24)

┌─────────────────────┬──────────────────┬──────────┬────────────────────┬─────────────────────────┬──────────────────────────────────────────────────────────────┐
│       Library       │  Vulnerability   │ Severity │ Installed Version  │      Fixed Version      │                            Title                             │
├─────────────────────┼──────────────────┼──────────┼────────────────────┼─────────────────────────┼──────────────────────────────────────────────────────────────┤
│ apt                 │ CVE-2011-3374    │ LOW      │ 2.2.4              │                         │ It was found that apt-key in apt, all versions, do not       │
│                     │                  │          │                    │                         │ correctly...                                                 │
│                     │                  │          │                    │                         │ https://avd.aquasec.com/nvd/cve-2011-3374                    │
├─────────────────────┼──────────────────┼──────────┼────────────────────┼─────────────────────────┼──────────────────────────────────────────────────────────────┤
│ bsdutils            │ CVE-2021-3995    │ MEDIUM   │ 2.36.1-8           │ 2.36.1-8+deb11u1        │ util-linux: Unauthorized unmount of FUSE filesystems         │
│                     │                  │          │                    │                         │ belonging to users with similar uid...                       │
│                     │                  │          │                    │                         │ https://avd.aquasec.com/nvd/cve-2021-3995                    │
├─────────────────────┼──────────────────┼──────────┼────────────────────┼─────────────────────────┼──────────────────────────────────────────────────────────────┤
......
├─────────────────────┼──────────────────┼──────────┼────────────────────┼─────────────────────────┼──────────────────────────────────────────────────────────────┤
│ zlib1g              │ CVE-2018-25032   │ HIGH     │ 1:1.2.11.dfsg-2    │ 1:1.2.11.dfsg-2+deb11u1 │ zlib: A flaw found in zlib when compressing (not             │
│                     │                  │          │                    │                         │ decompressing) certain inputs...                             │
│                     │                  │          │                    │                         │ https://avd.aquasec.com/nvd/cve-2018-25032                   │
└─────────────────────┴──────────────────┴──────────┴────────────────────┴─────────────────────────┴──────────────────────────────────────────────────────────────┘

trivy缓存漏洞数据库目录如下:

[root@etcd2 ~]# ls .cache/trivy/ -lh
总用量 0
drwxr-xr-x 2 root root 43 6月  16 17:19 db
drwx------ 2 root root 22 6月  16 17:06 fanal

trivy会下载漏洞数据库到本地,有时候下载会很慢,可以直接把已经安装好的~/.cache/trivy文件夹直接打包,放到新安装的机器上,就可以直接使用trivy了。

Trivy开始运行时每 12 小时下载一次漏洞数据库。这通常很快,因为数据库的大小只有 10~30MB。但是,如果您甚至想跳过它,请使用该--skip-db-update选项: trivy image --skip-db-update nginx:1.16。

trivy只下载漏洞数据库语法为:

[root@etcd2 ~]# trivy image --download-db-only

检测redis镜像漏洞。

[root@etcd2 ~]# trivy image redis | head
2022-06-16T17:38:18.504+0800	INFO	Detected OS: debian
2022-06-16T17:38:18.505+0800	INFO	Detecting Debian vulnerabilities...
2022-06-16T17:38:18.520+0800	INFO	Number of language-specific files: 0

redis (debian 11.2)
===================
Total: 108 (UNKNOWN: 0, LOW: 63, MEDIUM: 18, HIGH: 16, CRITICAL: 11)

┌──────────────────┬──────────────────┬──────────┬───────────────────┬─────────────────────────┬──────────────────────────────────────────────────────────────┐
│     Library      │  Vulnerability   │ Severity │ Installed Version │      Fixed Version      │                            Title                             │

检测nginx镜像漏洞。

[root@etcd2 ~]# trivy image nginx | head
2022-06-16T17:38:35.172+0800	INFO	Detected OS: debian
2022-06-16T17:38:35.172+0800	INFO	Detecting Debian vulnerabilities...
2022-06-16T17:38:35.189+0800	INFO	Number of language-specific files: 0

nginx (debian 11.2)
===================
Total: 202 (UNKNOWN: 1, LOW: 93, MEDIUM: 43, HIGH: 41, CRITICAL: 24)

┌─────────────────────┬──────────────────┬──────────┬────────────────────┬─────────────────────────┬──────────────────────────────────────────────────────────────┐
│       Library       │  Vulnerability   │ Severity │ Installed Version  │      Fixed Version      │                            Title                             │

注意Trivy 漏洞报告格式默认是表格。

[root@etcd2 ~]# trivy image -f table nginx:1.16

Trivy 漏洞报告格式也可以设置为JSON格式(-f), -o指定输出打印到文件里。

[root@etcd2 ~]# trivy image -f json -o results.json nginx:1.16

六.总结

Trivy是一款功能强大、易于使用的容器镜像安全漏洞扫描工具。通过在docker环境下的实践,我们了解到Trivy可以有效地检测容器镜像中的安全漏洞,帮助我们保障应用的安全性。

与容器镜像安全:安全漏洞扫描神器Trivy相似的内容:

容器镜像安全:安全漏洞扫描神器Trivy

容器镜像安全:安全漏洞扫描神器Trivy,Trivy是一款由aquasecurity团队开发的容器镜像安全漏洞扫描工具,Trivy简介,Trivy漏洞扫描原理,CVE全称是Common Vulnerabilities and Exposures,即通用漏洞披露,Trivy漏洞扫描原理简单来说就是:*...

制作容器镜像的最佳实践

概述 这篇文章主要是我日常工作中的制作镜像的实践, 同时结合我学习到的关于镜像制作的相关文章总结出来的. 包括通用的容器最佳实践, java, nginx, python 容器最佳实践. 最佳实践的目的一方面保证镜像是可复用的, 提升 DevOps 效率, 另一方面是为了提高安全性. 希望对各位有所

制作 Python Docker 镜像的最佳实践

概述 📚️Reference: 制作容器镜像的最佳实践 这篇文章是关于制作 Python Docker 容器镜像的最佳实践。(2022 年 12 月更新) 最佳实践的目的一方面是为了减小镜像体积,提升 DevOps 效率,另一方面是为了提高安全性。希望对各位有所帮助。 通用 Docker 容器镜像

配置pod拉取harbor容器镜像仓库私有镜像:secret保存账号密码

配置pod拉取harbor容器镜像仓库私有镜像:secret保存账号密码,Docker-Registry类型的Secret简介,镜像仓库简介,搭建Harbor容器镜像仓库,安装Harbor,创建项目,推送镜像到harbor镜像仓库,使用secret保存harbor账号密码拉取私有仓库的镜像

Portainer安装

Portainer安装 Portainer是一个可视化的容器镜像的图形管理工具,利用Portainer可以轻松构建,管理和维护Docker环境。 而且完全免费,基于容器化的安装方式,方便高效部署。 官网地址:https://www.portainer.io/ Docker安装Portainer #拉

[转帖]nerdctl+buildkitd构建容器镜像

https://www.cnblogs.com/wyh-l6/p/16590586.html 搭建nerdctl+buildkitd环境: 安装nerdctl: wget https://github.com/containerd/nerdctl/releases/download/v0.22.0/

docker安装mysql

转载请注明出处: 1.从Docker Hub下载MySQL镜像: docker pull mysql 2.运行MySQL容器,并将主机的3306端口映射到容器的3306端口: docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=yo

[转帖]Springboot容器化镜像设置堆内存大小

参考资料:Best Practices: Java Memory Arguments for Containers - DZone Java 有三种方式设置最大堆内存大小: 1. -Xmx 2. -XX:MaxRAMFraction, -XX:MinRAMFraction 3.-XX:MaxRAMP

[转帖]openEuler官方容器镜像仓

https://gitee.com/openeuler/openeuler-docker-images 介绍 这里存放着由openEuler官方提供的容器镜像,包含openEuler基础镜像、应用镜像。 openEuler基础镜像 openEuler的基础镜像由社区官方发布,目前发布在openEul

K8S 1.20 弃用 Docker 评估之 Docker 和 OCI 镜像格式的差别

背景 2020 年 12 月初,Kubernetes 在其最新的 Changelog 中宣布,自 Kubernetes 1.20 之后将弃用 Docker 作为容器运行时。 弃用 Docker 带来的,可能是一系列的改变,包括不限于: 容器镜像构建工具 容器 CLI 容器镜像仓库 容器运行时 专题文