漏洞扫描
2 分钟阅读
简要概述
通过开源漏洞库,实现对镜像、文件系统、代码仓库、K8S 配置清单等进行扫描以提前发现问题。
配置参数
工具 trivy 支持在 cli 直接跟参数或通过 trivy --cofnig trivy.yaml
使用配置文件,内容如下:
# 同 cli 参数 '--cache-dir'
# 存放漏洞库等缓存数据,首次初始化会自动从 github 下载
cache:
dir: ./cache/
db:
# 同 cli 参数 '--skip-db-update'
# 本地漏洞库存在有效期,超过后会重新下载,这里忽略时间检测
skip-update: true
# 仅列出 "UNKNOWN" "HIGH" "CRITICAL" 三个级别事件
severity:
- UNKNOWN
- HIGH
- CRITICAL
scan:
# 默认开启 "漏洞扫描“ 与 "密钥扫描"
scanners:
- vuln
#- misconfig
- secret
#- license
以上等同于 cli 模式:
trivy \
--cache-dir ./cache/ \
--skip-policy-update \
--skip-db-update \
--skip-java-db-update \
以下实验均使用配置文件模式,更多内容可参考官方文档。
支持的功能
漏洞扫描
仅支持以上这些系统的安装包检测,如果是自编译或者第三方安装包则不被支持,因为漏洞源中没有相关数据。
安全评估等级
如果相同的漏洞,多家给予不通的评分,则一般以供应商的评估等级更加准确,比如 cve-2023-0464 上 Redhat 与 NVD 不同。因为安全评估的严重性取决于编译选项、默认配置等,NVD 不知道供应商如何分发软件,而厂商可以更准确地评估。
分数范围 | 等级 |
---|---|
- | UNKNOWN |
0.1 - 3.9 | Low |
4.0 - 6.9 | Medium |
7.0 - 8.9 | High |
9.0 - 10.0 | Critical |
评估等级优先级:系统厂商 > NVD。如果 NVD 未找到则标志等级为 “UNKNOWN”
错误配置扫描
TODO;
密钥扫描
TODO;
许可证扫描
TODO;
扫描的目标
容器镜像
默认开关的扫描功能:
功能 | 启动参数 | 默认启用 |
---|---|---|
漏洞扫描 | trivy image --scanners vuln |
是 |
错误配置扫描 | trivy image --scanners config |
否 |
密钥扫描 | trivy image --scanners secret |
是 |
许可证扫描 | trivy image --scanners license |
否 |
通过对镜像 docker.io/bitnami/redis:7.2.3-debian-11-r2
进行扫描:
trivy --config trivy.yaml image docker.io/bitnami/redis:7.2.3-debian-11-r2
代码仓库
默认开关的扫描功能:
功能 | 启动参数 | 默认启用 |
---|---|---|
漏洞扫描 | trivy repo --scanners vuln |
是 |
错误配置扫描 | trivy repo --scanners config |
否 |
密钥扫描 | trivy repo --scanners secret |
是 |
许可证扫描 | trivy repo --scanners license |
否 |
实现原理是通过扫描各语言依赖关系的锁定文件,部分如下列表:
语言 | 扫描文件 |
---|---|
go | go.mod |
node | package-lock.json |
ruby | Gemfile.lock |
支持扫描本地或者远程代码仓库,这里针对代码仓库 github.com/grpc-kit/cli
进行在线扫描:
trivy --config trivy.yaml repo https://github.com/grpc-kit/cli.git
然后生成如下报告:
Library | Vulnerability | Severity | Status | Installed Version | Fixed Version |
---|---|---|---|---|---|
golang.org/x/net | CVE-2022-41723 | HIGH | fixed | 0.6.0 | 0.7.0 |
golang.org/x/net | CVE-2023-39325 | HIGH | fixed | 0.6.0 | 0.17.0 |
github.com/emicklei/go-restful | CVE-2022-1996 | CRITICAL | fixed | 2.9.5+incompatible | 2.16.0 |
本地文件
默认开关的扫描功能:
功能 | 启动参数 | 默认启用 |
---|---|---|
漏洞扫描 | trivy fs --scanners vuln |
是 |
错误配置扫描 | trivy fs --scanners config |
否 |
密钥扫描 | trivy fs --scanners secret |
是 |
许可证扫描 | trivy fs --scanners license |
否 |
本地扫描文件存在两种不通的工作模式:
参数 | 用途 | 场景 |
---|---|---|
trivy fs |
针对镜像、语言依赖库扫描 | 一般用于 CICD 场景 |
trivy rootfs |
针对文件系统上二进制文件等 | 操作系统扫描 |
如果代码仓库、容器镜像等均在本地,也可以通过该方式扫描,如:
trivy --config trivy.yaml fs test/go.mod
针对系统目录下 /usr/local/bin
二进制文件扫描,当然这些二进制文件必须是公开漏洞库中已有的数据,不能是内部自己编译应用:
trivy --config trivy.yaml rootfs /usr/local/bin/
Kubernetes
需要能访问到 k8s 集群,trivy 默认是通过读取 “$HOME/.kube/config” 连接集群。
可扫描以下内容:
trivy --config trivy.yaml k8s all
trivy --config trivy.yaml k8s pods
trivy --config trivy.yaml k8s deploy myapp
trivy --config trivy.yaml k8s pod/mypod
trivy --config trivy.yaml k8s pods,deploy
trivy --config trivy.yaml k8s cluster
支持针对以下几个合规进行扫描:
规则 | 指令参数 | 规范地址 |
---|---|---|
NSA, CISA Kubernetes Hardening Guidance v1.2 | k8s-nsa | url |
CIS Benchmark for Kubernetes v1.23 | k8s-cis | url |
Pod Security Standards, Baseline | k8s-pss-baseline | url |
Pod Security Standards, Restricted | k8s-pss-restricted | url |
这里使用 k8s cis 规范进行检查,同 kube-beach
:
trivy k8s cluster \
--config trivy.yaml \
--scanners vuln \
--report summary \
--compliance=k8s-cis
Java
TODO;
应用案例实践
容器镜像扫描
trivy --cache-dir ./cache/ image docker.io/bitnami/redis:7.2.3-debian-11-r2
预先下载漏洞库至本地目录 “./cache”,否则会在线下载。
trivy --cache-dir ./cache/ image docker.io/bitnami/redis:7.2.3-debian-11-r2 --report summary --severity UNKNOWN,HIGH,CRITICAL
仅列出 “HIGH” 与 “CRITICAL” 级别漏洞。
K8S 集群扫描
使用本地病毒库
trivy --cache-dir ./cache/ k8s -n kube-system --report summary all
业务开发代码仓库
TODO;
基础设施既代码
TODO;