查看原文
其他

推荐一款适用CI的容器漏洞扫描工具

运维菜鸟 运维研习社 2022-11-05



trivy是一个简单而全面的容器漏洞扫描程序。它能够检测操作系统软件包(Alpine,RHEL,CentOS等)的漏洞

和应用程序依赖项(Bundler,Composer,npm,yarn等),通过检测容器中的以下文件并扫描依赖项中的漏洞

  • Gemfile.lock

  • Pipfile.lock

  • poetry.lock

  • composer.lock

  • package-lock.json

  • yarn.lock

  • Cargo.lock


Trivy很容易使用。只需安装二进制文件即可进行扫描。需要执行的扫描操作是指定容器的镜像名称

先来直观的感受一下它的强大

安装

trivy安装非常简单,方便,在Centos中可通过yum包管理工具,或rpm包安装,同样支持源码编译安装

yum安装,需要在yum存储库中添加trivy.repo,内容如下:

然后通过yum makecache生成缓存

通过yum install trivy进行安装


rpm安装,通过如下命令进行安装:

rpm -ivh https://github.com/knqyf263/trivy/releases/download/v0.0.15/trivy_0.0.15_Linux-64bit.rpm


二进制安装即编译安装,需要依赖go编译环境

$ mkdir -p $GOPATH/src/github.com/knqyf263
$ cd $GOPATH/src/github.com/knqyf263
$ git clone https://github.com/knqyf263/trivy
$ cd trivy/cmd/trivy/
$ export GO111MODULE=on
$ go install


使用

trivy首次使用需要等待很长时间,它会从github上更新所有的漏洞库

完成后,会在用户家目录的.cache/trivy下生成缓存文件

第二次执行的时候就可以快速进行漏洞扫描


当然,trivy也支持docker快速启动

docker run --rm -v [YOUR_CACHE_DIR]:/root/.cache/ knqyf263/trivy [YOUR_IMAGE_NAME]

需要将YOUR_CACHE_DIR替换成你的缓存目录,将之前缓存的漏洞库映射到容器中,不然启动会很慢


如果想通过这种方式扫描本机的容器镜像,需要将docker.sock文件映射到容器内,比如

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \

    -v $HOME/.cache/:/root/.cache/ knqyf263/trivy python:3.4-alpine


trivy使用简单示例如下:

扫描镜像:

trivy [image_name]


扫描通过save方式打包的镜像:

trivy --input [image_name.tar]


将扫描结果存为json文件:

trivy -f json -o results.json [image_name]


通过设置漏洞级别过滤漏洞:

trivy --severity HIGH,CRITICAL [image_name]


通过设置漏洞类型过滤漏洞:

trivy --vuln-type os [image_name]

漏洞类型分为os和library


只更新某个系统类型的漏洞库:

trivy --only-update alpine,debia [image_name]


指定退出代码:

trivy --exit-code 1 [image_name]

指定退出代码,主要是为后续判断提供可操作性,主要是在CI中


由于trivy有缓存,所以在扫描镜像的latest版本的时候,会出现异常,需要清楚缓存操作:

trivy --clear-cache [image_name]


如果需要重建本地漏洞数据库,或清除所有缓存,可以通过trivy --reset


trivy的另一个牛逼特性是对持续集成(CI)的支持,即在docker的持续集成环境中,可以在启动服务前,对镜像进行扫描,并通过漏洞级别指定退出代码


trivy的ci配置如下:

$ cat .travis.yml
services:
 - docker

env:
 global:
   - COMMIT=${TRAVIS_COMMIT::8}

before_install:
 - docker build -t trivy-ci-test:${COMMIT} .
 - export VERSION=$(curl --silent "https://api.github.com/repos/knqyf263/trivy/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
 - wget https://github.com/knqyf263/trivy/releases/download/v${VERSION}/trivy_${VERSION}_Linux-64bit.tar.gz
 - tar zxvf trivy_${VERSION}_Linux-64bit.tar.gz
script:
 - ./trivy --exit-code 0 --severity HIGH --quiet --auto-refresh trivy-ci-test:${COMMIT}
 - ./trivy --exit-code 1 --severity CRITICAL --quiet --auto-refresh trivy-ci-test:${COMMIT}
cache:
 directories:
   - $HOME/.cache/trivy


trivy除了支持公有镜像仓库,同时也支持私有镜像仓库,只需要在ENV中指定TRIVY_AUTH_URL, TRIVY_USERNAME  TRIVY_PASSWORD

比如:

export TRIVY_AUTH_URL=https://registry.hub.docker.com

export TRIVY_USERNAME={DOCKERHUB_USERNAME}

export TRIVY_PASSWORD={DOCKERHUB_PASSWORD}


持续更新,欢迎扫码关注,敬请期待!


原文链接:https://github.com/knqyf263/trivy


扫描二维码关注我们吧



温馨提示

如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存