
Kubernetes 镜像安全Trivy
Trivy的特征与简介
rivy是一种适用于CI的简单而全面的容器漏洞扫描程序。软件漏洞是指软件或操作系统中存在的故障、缺陷或弱点。Trivy检测操作系统包(Alpine、RHEL、CentOS等)和应用程序依赖(Bundler、Composer、npm、yarn等)的漏洞。Trivy很容易使用,只要安装二进制文件,就可以扫描了。扫描只需指定容器的镜像名称。与其他镜像扫描工具相比,例如Clair,Anchore Engine,Quay相比,Trivy在准确性、方便性和对CI的支持等方面都有着明显的优势。
推荐在CI中使用它,在推送到container registry之前,您可以轻松地扫描本地容器镜像,Trivy具备如下的特征:
1.检测面很全,能检测全面的漏洞,操作系统软件包(Alpine、Red Hat Universal Base Image、Red Hat Enterprise Linux、CentOS、Oracle Linux、Debian、Ubuntu、Amazon Linux、openSUSE Leap、SUSE Enterprise Linux、Photon OS 和Distrioless)、应用程序依赖项(Bundler、Composer、Pipenv、Poetry、npm、yarn和Cargo);
2.使用简单,仅仅只需要指定镜像名称;
3.扫描快且无状态,第一次扫描将在10秒内完成(取决于您的网络)。随后的扫描将在一秒钟内完成。与其他扫描器在第一次运行时需要很长时间(大约10分钟)来获取漏洞信息,并鼓励您维护持久的漏洞数据库不同,Trivy是无状态的,不需要维护或准备;
易于安装,安装方式:
apt-get install
yum install
brew install
4.无需安装数据库、库等先决条件(例外情况是需要安装rpm以扫描基于RHEL/CentOS的图像)。
安装
CentOS安装
sudo vim /etc/yum.repos.d/trivy.repo
[trivy]
name=Trivy repository
baseurl=https://aquasecurity.github.io/trivy-repo/rpm/releases/$releasever/$basearch/
gpgcheck=0
enabled=1
sudo yum -y update
sudo yum -y install trivy
RPM的方式
rpm -ivh https://github.com/aquasecurity/trivy/releases/download/v0.24.4/trivy_0.24.4_Linux-64bit.rpm
Debian/Ubuntu安装
Ubuntu
sudo apt-get install wget apt-transport-https gnupg lsb-release
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install trivy
Debian
wget https://github.com/aquasecurity/trivy/releases/download/v0.24.4/trivy_0.24.4_Linux-64bit.deb
sudo dpkg -i trivy_0.24.4_Linux-64bit.deb
容器安装
脚本格式:
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v [YOUR_CACHE_DIR]:/root/.cache/ aquasec/trivy:0.24.4 image [YOUR_IMAGE_NAME]
举例:检测python:3.4-alpine
镜像
# 0.20.2
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
-v $HOME/Library/Caches:/root/.cache/ aquasec/trivy:0.20.2 python:3.4-alpine
# 0.24.4
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
-v $HOME/Library/Caches:/root/.cache/ aquasec/trivy:0.24.4 image python:3.4-alpine
Helm安装
helm repo add aquasecurity https://aquasecurity.github.io/helm-charts/
helm repo update
helm search repo trivy
helm install my-trivy aquasecurity/trivy
使用发布名称安装图表my-release:
helm install my-release .
快速开始
扫描指定镜像与漏洞只需要如下命令即可实现
trivy image [你的镜像名称]
扫描IAC文件目录,例如Terraform
和 Dockerfile
。
trivy config [你的IAC目录]
# 举例
$ ls build/
Dockerfile
$ trivy config ./build
故障排查
扫描超时(Timeout)
当扫描一个镜像过长,我们可以设置扫描超时的异常错误。
# 设置超时时间为15分钟
trivy image [你的镜像] --timeout 15m
# 错误信息
analyze error: timeout: context deadline exceeded.
证书问题(Certification)
当扫描时报错:Error: x509: certificate signed by unknown authority
。TRIVY_INSECURE
参数可以允许容器注册表的不安全连接,来解决这个问题。
TRIVY_INSECURE=true trivy image [你的镜像]
GitHub限速
GitHub如果限速,需要传入Github的Token。不然就会报以下错误:
API rate limit exceeded for xxx.xxx.xxx.xxx.
添加GitHub的Token
GITHUB_TOKEN=XXXXXXXXXX trivy alpine:3.10
Maven速率限制
Trivy 调用 Maven API 以更好地检测 JAR 文件,但许多请求可能会超出速率限制。
status 403 Forbidden from http://search.maven.org/solrsearch/select
--offline-scan
阻止 Trivy 发出 API 请求的选项。此选项仅影响漏洞扫描。漏洞数据库和内置策略照常下载。--skip-update
和--skip-policy-update
可以跳过它们。
下载漏洞数据库时出错
如果 trivy 在公司防火墙后面运行,您必须将以下 url 添加到您的允许列表中。
ghcr.io
pkg-containers.githubusercontent.com
重试
# 未知错误
trivy image --reset
按严重程度过滤漏洞
trivy image --severity HIGH,CRITICAL ruby:2.3.0
跳过数据库漏洞更新
Trivy总是在开始运行时更新其漏洞数据库。这通常很快,因为这是一个差异更新。但是如果你想跳过这一步,可以使用--skip update
选项。
trivy image --skip-update python:3.4-alpine3.9
仅更新指定的发行版
默认情况下,Trivy总是为所有发行版更新其漏洞数据库。如果要命名要更新的指定发行版,请使用--only-update
选项。
trivy image --only-update alpine,debian python:3.4-alpine3.9
trivy image --only-update alpine python:3.4-alpine3.9
仅下载漏洞数据库
您还可以让Trivy简单地检索漏洞数据库。这对于在连续集成系统中初始化工作人员很有用。在第一次运行中,--only-update
选项被默默忽略。
trivy image --download-db-only
trivy image --download-db-only --only-update alpine
忽略未修复的漏洞
默认情况下,Trivy还检测未修补/未修复的漏洞。这意味着即使更新了所有软件包,也无法修复这些漏洞。如果要忽略它们,请使用--ignore-unfixed
选项。
trivy image --ignore-unfixed ruby:2.3.0
指定退出代码
默认情况下,即使检测到漏洞,Trivy也会以代码0退出。如果要使用非零退出代码退出,请使用--exit-code
选项。
trivy image --exit-code 1 python:3.4-alpine3.9
此选项对CI/CD很有用。在以下示例中,只有在发现关键漏洞时,测试才会失败。
trivy image --exit-code 0 --severity MEDIUM,HIGH ruby:2.3.0
trivy image --exit-code 1 --severity CRITICAL ruby:2.3.0
忽略指定的漏洞,定义
.trivyignore
文件
$ cat .trivyignore
# Accept the risk
CVE-2018-14618
# No impact in our settings
CVE-2019-1543
$ trivy image python:3.4-alpine3.9
指定缓存目录
trivy image --cache-dir /tmp/trivy/ python:3.4-alpine3.9
清除图像缓存
--clear-cache
选项删除图像缓存。如果更新了具有相同标记的图像(例如使用最新标记时),此选项将非常有用。
trivy image --clear-cache python:3.7
常见检测问题
使用Trivy开源容器扫瞄器检测命名空间yavin中POD使用的具有严重漏洞的镜像。
查找具有High或Critical漏洞的镜像,并删除使用这些镜像的POD。
Trivy仅预装在集群的主节点上;它在基本系统或工作节点上不可用。必须连接到集群的主节点才能使用Trivy。
ssh xxx@xxx
kubectl get po -n yavin -o yaml | grep 'image'
trivy image | grep -i "High|Critical"
#或者
trivy image --severity HIGH,CRITICAL [那些包名]
#删除Pod....(控制器删除等)
参考:
https://aquasecurity.github.io/trivy/v0.24.4/
https://0x1.gitlab.io/security/Trivy/
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

