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