漏洞扫描

简要概述

通过开源漏洞库,实现对镜像、文件系统、代码仓库、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;




最后修改 2024.01.05: docs: 添加 falco 内容 (b084241)