Trivy 概述

官方地址:https://aquasecurity.github.io/trivy

GITHUB:https://github.com/aquasecurity/trivy

Trivy(tri 发音为 trigger,vy 发音为 envy)是一个简单而全面的漏洞/错误配置扫描器,用于容器和其他工件。 软件漏洞是软件或操作系统中存在的故障、缺陷或弱点。 Trivy 检测操作系统包(Alpine、RHEL、CentOS 等)和特定语言包(Bundler、Composer、npm、yarn 等)的漏洞。 此外,Trivy 会扫描基础设施即代码 (IaC) 文件,例如 Terraform 和 Kubernetes,以检测使你的部署面临攻击风险的潜在配置问题。 Trivy 易于使用。 只需安装二进制文件,你就可以开始扫描了。 扫描所需要做的就是指定一个目标,例如容器的图像名称。

Trivy 检测两种类型的安全问题

  • 漏洞
  • 配置错误

Trivy 可以扫描三种不同的工件

  • 容器镜像
  • 文件系统
  • Git存储库

Trivy 可以在两种不同的模式下运行

  • 独立

  • 客户端服务器

    它旨在用于 CI。在推送到容器注册表或部署应用程序之前,你可以轻松扫描本地容器映像和其他工件。

Trivy 安装

参考:https://aquasecurity.github.io/trivy/v0.41/getting-started/installation/

1
2
# 脚本方式安装,以0.41.0为例
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin v0.41.0

容器镜像漏洞扫描

只需指定镜像仓库(和tag)

1
# trivy image nginx:1.16

trivy image [IMAGE_NAME]

漏洞等级

  • CRITICAL
  • HIGH
  • MEDIUM
  • LOW

文件系统漏洞扫描

扫描文件系统(例如主机、虚拟机映像或解压缩的容器映像文件系统)

1
# trivy fs /application/zookeeper/

Git 存储库漏洞扫描

扫描远程 git 存储库

1
# trivy repo https://github.com/kubernetes/kubernetes.git

Trivy 过滤漏洞

隐藏未修复得漏洞

默认情况下, Trivy还会检测未修补/未修复的漏洞。这意味着即使你更新所有软件包,你也无法修复这些漏洞。如果你想忽略它们,请使用该--ignore-unfixed选项。

1
# trivy image --ignore-unfixed nginx:1.16 

按扫描类型筛选

使用--scanners选项,常用value值包含vuln,config(在0.50以上较新版本中由misconfig替代),secret

1
# trivy image --scanners vuln,config,secret nginx:1.16

按严重程度

使用--severity选项

1
# trivy image --severity HIGH,CRITICAL nginx:1.16

指定退出代码

默认情况下,即使检测到漏洞,Trivy 也会以代码 0 退出。如果要使用非零退出代码退出,请使用 -–exit code 选项。此选项对 CI/CD 很有用。在下面的示例中,仅当发现关键漏洞时,测试才会失败。

1
2
3
$ trivy -–exit-code 1 python:3.4-alpine3.9
$ trivy -–exit-code 0 –severity MEDIUM,HIGH ruby:2.3.0
$ trivy -–exit-code 1 –severity CRITICAL ruby:2.3.0

漏洞数据库

跳过漏洞数据库得更新

  • --skip-db-update

Trivy开始运行时每 12 小时下载一次漏洞数据库。这通常很快【补充:如果处于国内环境可能会很慢,可通过配置 repository: ghcr.m.daocloud.io/aquasecurity/trivy-db换成国内源】,因为数据库的大小只有 10~30MB。但是如果想跳过它,可以使用--skip-db-update选项。

1
# trivy image --skip-db-update nginx:1.16

只下载漏洞数据库

  • --download-db-only
1
# trivy image --download-db-only

轻量级数据库

  • --light

轻量级数据库不包含漏洞详细信息,例如描述和参考。因此,DB 的大小更小,下载速度更快,以优化执行扫描的效率。

当你不需要漏洞详细信息并且适用于 CI/CD 时,此选项很有用。要查找其他信息,可以在 NVD 网站上搜索漏洞详细信息。https://nvd.nist.gov/vuln/search

1
# trivy image --light nginx:1.16

--light 选项不会像下面的例子那样显示标题。

实战

全局配置文件配置

参考:https://aquasecurity.github.io/trivy/v0.41/docs/references/configuration/config-file/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
mkdir -p /usr/local/src/trivy/ && cd /usr/local/src/trivy/ && vim /usr/local/src/trivy/trivy.yaml

################################配置文件################################

# Same as '--quiet'
# Default is false
quiet: false

# Same as '--debug'
# Default is false
debug: false

# Same as '--insecure'
# Default is false
insecure: true

# Same as '--timeout'
# Default is '5m'
timeout: 60m

# Same as '--cache-dir'
# Default is your system cache dir
cache:
# trivy默认db缓存文件夹$HOME/.cache/trivy,这里方便结合gitlab-runner一起使用
dir: /home/gitlab-runner/.cache/trivy
# db global
db:
# Same as '--skip-db-update'
# Default is false
skip-update: false

# Same as '--no-progress'
# Default is false
no-progress: false

# Same as '--db-repository'
# Default is 'ghcr.io/aquasecurity/trivy-db'
# 因为官方db更新较慢,这里使用一个镜像地址
repository: ghcr.m.daocloud.io/aquasecurity/trivy-db

定期执行更新db操作

1
2
3
4
chown -R gitlab-runner:gitlab-runner /home/gitlab-runner/.cache/
crontab -e
# 每天凌晨仅更新db,因为db文件每次更新都会重建,所以需要记得赋权
30 04 * * * trivy image --download-db-only --config /usr/local/src/trivy/trivy.yaml && chown -R gitlab-runner:gitlab-runner /home/gitlab-runner/.cache/trivy/db/ && chmod -R 755 /home/gitlab-runner/.cache/trivy/db/

gitlab-ci整合

参考:https://aquasecurity.github.io/trivy/v0.41/tutorials/integrations/gitlab-ci/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
stages:
- check

######################如果扫描出漏洞则不继续向下执行(1:失败则不向下执行. 0:跳过. --scanners vuln:仅扫描漏洞)########################
trivy-check:
stage: check
script:
- trivy fs --skip-db-update --exit-code 1 --severity HIGH --scanners vuln .
tags:
- check
only:
- /^dev.*/
- /^release-.*/
- master

插件

trivy-plugin-sonarqube

项目地址:https://github.com/umax/trivy-plugin-sonarqube

用于将JSON报告转换为SonarQube格式。用Trivy扫描项目依赖关系,并通过sonar.externalIssuesReportPaths将结果发布到SonarQube并展示

安装

install plugin:

1
$ trivy plugin install github.com/umax/trivy-plugin-sonarqube

check the installation:

1
$ trivy plugin list

NOTE: you need Python interpreter installed to be able to run plugin.

使用

fs/image/git方式都支持,按如下修改即可

  • 原有指令后新增两个参数
1
2
3
...
--format=json \
--output=trivy-deps-report.json
  • 正常流程结束后,新增一条指令
1
trivy sonarqube trivy-deps-report.json > sonar-deps-report.json
1
trivy sonarqube trivy-deps-report.json -- filePath=Dockerfile > sonar-deps-report.json
  • 然后在执行sonar-scan指令时,使用参数sonar.externalIssuesReportPaths将结果发布到sonarqube即可
1
sonar-scanner -D sonar.externalIssuesReportPaths="sonar-deps-report.json" ...
  • 样例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
trivy-check:
stage: trivy-check
script:
- trivy image
--skip-db-update
--exit-code 0
--severity HIGH,CRITICAL
--scanners vuln,config,secret
--format json
--output trivy-deps-report.json .
- trivy sonarqube trivy-deps-report.json -- filePath=Dockerfile > sonar-deps-report.json
tags:
- trivy-check
only:
- master
allow_failure: true
artifacts:
paths:
- trivy-deps-report.json
- sonar-deps-report.json