使用Trivy扫描Docker容器镜像中的漏洞

时间:2020-02-23 14:31:49  来源:igfitidea点击:

安全性每时每刻都在演变,以至于令人难以置信。在将应用程序发布到生产环境之前,需要非常认真的安全考虑和协议,以帮助保护资产。这是因为互联网上有许多坏蛋,他们等着我们度过了不眠之夜而刚刚部署的时机。为了为容器化应用程序的安全性做出贡献,今天,我们将踏上这一安全之路。所有这些都是希望能激发一些希望,并提供可以在此旅程中与我们同行的工具。今天,我们介绍并鼓励Trivy。

Trivy是用于容器和其他工件的简单而全面的漏洞扫描程序。它有助于检测操作系统软件包(Alpine,RHEL,CentOS等)的漏洞和应用程序依赖项(捆绑程序,Composer,npm,yarn等)。在推送到容器注册表或者部署应用程序之前,我们可以轻松地扫描本地容器镜像和其他工件,从而使我们确信应用程序一切都很好,而无需像其他扫描程序那样使用更多压力配置。

Trivy的特点

Trivy的荣耀和精巧拥有我们将享受的以下功能:

检测全面漏洞单纯性仅指定图像名称或者工件名称快速首次扫描将在10秒内完成(取决于网络)。相应的扫描将在几秒钟内完成.DevSecOps适用于CI,例如Travis CI,CircleCI,Jenkins,GitLab CI等支持多种格式,包括:容器镜像,本地文件系统,远程git存储库易于安装apt-get安装,yum安装和brew安装没有准备工作,例如安装数据库,库等。

如何简化容器图像扫描仪

Trivy可以安装在许多Linux发行版以及MacOS上。我们将介绍Trivy在CentOS,Ubuntu,Debian,Arch和MacOS上的安装。让节目开始。

在CentOS上安装Trivy

如果我们希望在CentOS机器上安装Trivy,则有两个选择。我们可以使用Trivys存储库,也可以直接从其RPM源安装它。要从存储库安装,请添加以下存储库,然后继续安装Trivy。

echo -e "\n[trivy]\nname=Trivy repository\nbaseurl=https://aquasecurity.github.io/trivy-repo/rpm/releases/$releasever/$basearch/\ngpgcheck=0\nenabled=1" | sudo tee -a /etc/yum.repos.d/kubernetes.repo

添加Trivy存储库后,更新服务器并按以下方式安装trivy软件包:

sudo yum -y update
sudo yum -y install trivy

要从RPM源码安装trivy,我们需要获取最新的Trivy版本,然后运行以下命令:

$rpm -ivh https://github.com/aquasecurity/trivy/releases/download/v0.12.0/trivy_0.12.0_Linux-64bit.rpm

在Debian上安装Trivy | Ubuntu

与在CentOS上安装Trivy相似,我们还可以使用两个选项将其安装在Debian | Ubuntu上
框。我们可以使用Trivys存储库,也可以直接从其DEB源安装它。要从存储库安装,请添加以下存储库,然后继续安装Trivy。

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 /etc/apt/sources.list.d/trivy.list

添加Trivy存储库后,更新服务器并按如下所示安装trivy软件包:

sudo apt-get update
sudo apt-get install trivy

另外,如果我们是Deb源风扇,则可以使用其Trib源安装Trivy。要以这种方式安装trivy,我们将需要获取最新的Trivy版本,然后运行以下命令:

sudo apt-get install rpm
wget <deb-package-url>
sudo apt install ./<deb-package>.deb

在Arch Linux上安装Trivy | Manjaro

好了,对于所有Arch忠实的粉丝,我们可以使用pikaur或者yay AUR助手轻松在计算机上安装Trivy,如下所示。

pikaur -Sy trivy-bin

或者我们也可以像这样使用yay AUR助手:

yay  -Sy trivy-bin

在MacOS上安装Trivy

对于Mac用户,我们不会被抛在后面,可以通过运行以下命令通过Homebrew在MacOS上安装此炫酷工具

brew install aquasecurity/trivy/trivy

Trivy在实践中如何使用Trivy

安装Trivy后,我们准备立即投入业务。 Trivy涵盖了无数用例,我们将在本教程中涵盖其中一些用例。

扫描文件系统

Trivy可以扫描文件系统(例如主机,虚拟机镜像或者解压缩的容器镜像文件系统)。在扫描过程中,它将基于锁定文件(例如Gemfile.lock和package-lock.json)查找漏洞。语法如下:

$trivy fs /home/vagrant

2017-11-09T10:35:41.656Z        WARN    OS is not detected and vulnerabilities in OS packages are not detected.
2017-11-09T10:35:41.656Z        INFO    Detecting ruby vulnerabilities...
2017-11-09T10:35:41.656Z        INFO    Detecting nodejs vulnerabilities...

octant/site/Gemfile.lock
========================
Total: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)

octant/web/package-lock.json
============================
Total: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)

扫描Git存储库

幸运的是,我们可以使用此简单但功能强大的工具扫描远程git存储库。应当指出,这里仅支持公共存储库。使用Repo开关扫描Git存储库,如下所示:

$trivy repo https://github.com/aquasecurity/trivy

2017-11-09T07:13:25.265Z        INFO    Need to update DB
2017-11-09T07:13:25.265Z        INFO    Downloading DB...
19.13 MiB/19.13 MiB [-----------------------------------------------------------] 100.00% 512.75 KiB p/s 38sEnumerating objects: 2338, done.
Counting objects: 100% (2338/2338), done.
Compressing objects: 100% (1260/1260), done.

Total 2338 (delta 1229), reused 1943 (delta 933), pack-reused 0
2017-11-09T07:40:29.758Z        WARN    OS is not detected and vulnerabilities in OS packages are not detected.

扫描影像

在将应用程序开发并整合到一个镜像(Docker等)中之后,我们可以选择找出我们可能忽略的任何安全问题。只需指定图像名称和标签以及trivy命令,如下所示。

列出图片

$docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              c39a868aad02        3 days ago          133MB
$trivy image nginx

我们应该在终端输出中看到一份详尽的详细报告。以下是一个摘要。

将Trivy嵌入Dockerfile

此工具的另一个很酷的功能是我们可以将其包含在Dockerfile中,并且它将在构建镜像时扫描所有内容。我们将在此处使用Nginx图像进行演示,如下所示:

$vim Dockerfile
FROM alpine:3.7

RUN apk add curl \
    && curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/master/contrib/install.sh | sh -s -- -b /usr/local/bin \
    && trivy filesystem --exit-code 1 --no-progress /

然后放松时,使用类似于以下所示的输出构建图像。

$docker build -t scanned-image .

Sending build context to Docker daemon 8.704 kB
Step 1/2 : FROM alpine:3.7
Trying to pull repository docker.io/library/alpine ...
3.7: Pulling from docker.io/library/alpine
5d20c808ce19: Pull complete
Digest: sha256:8421d9a84432575381bfabd248f1eb56f3aa21d9d7cd2511583c68c9b7511d10
Status: Downloaded newer image for docker.io/alpine:3.7
 ---> 6d1ef012b567
Step 2/2 : RUN apk add curl     && curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/master/contrib/install.sh | sh -s 
-- -b /usr/local/bin     && trivy filesystem --exit-code 1 --no-progress /
 ---> Running in 445558539f6f

fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
(1/4) Installing ca-certificates (20190108-r0)
(2/4) Installing libssh2 (1.9.0-r1)
(3/4) Installing libcurl (7.61.1-r3)
(4/4) Installing curl (7.61.1-r3)
Executing busybox-1.27.2-r11.trigger
Executing ca-certificates-20190108-r0.trigger
OK: 6 MiB in 17 packages
aquasecurity/trivy info checking GitHub for latest tag
aquasecurity/trivy info found version: 0.12.0 for v0.12.0/Linux/64bit
aquasecurity/trivy info installed /usr/local/bin/trivy
2017-11-09T10:13:02.597Z        INFO    Need to update DB
2017-11-09T10:13:02.597Z        INFO    Downloading DB...
2017-11-09T10:13:27.545Z        INFO    Detecting Alpine vulnerabilities...
2017-11-09T10:13:27.547Z        WARN    This OS version is no longer supported by the distribution: alpine 3.7.3
2017-11-09T10:13:27.547Z        WARN    The vulnerability detection Jan be insufficient because security updates are not provided   

445558539f6f (alpine 3.7.3)
===========================
Total: 2 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 2)

+------------+------------------+----------+-------------------+---------------+--------------------------------+
|  LIBRARY   | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION |             TITLE              |
+------------+------------------+----------+-------------------+---------------+--------------------------------+
| musl       | CVE-2019-14697   | CRITICAL | 1.1.18-r3         | 1.1.18-r4     | musl libc through 1.1.23       |
|            |                  |          |                   |               | has an x87 floating-point      |
|            |                  |          |                   |               | stack adjustment imbalance,    |
|            |                  |          |                   |               | related...                     |
+------------+                  +          +                   +               +                                +
| musl-utils |                  |          |                   |               |                                |
|            |                  |          |                   |               |                                |
|            |                  |          |                   |               |                                |
|            |                  |          |                   |               |                                |
+------------+------------------+----------+-------------------+---------------+--------------------------------+

按严重程度过滤漏洞

如果我们有特殊需要,并且需要对生成的报表进行过滤,以便可以看到HIGH,CRITICAL等字段,那么Trivy会立即为我们提供帮助。只需运行类似于以下内容的命令:

$trivy image --severity HIGH,CRITICAL nginx:latest

使用锁定文件扫描项目

如果我们有Python项目,则很可能其中包含锁定文件。因此,我们可以通过以下方式扫描这样的项目:

$trivy fs ~/src/github.com/aquasecurity/trivy-ci-test

从容器内部扫描容器

要为我们享受的甜味添加更多的糖,值得一提的是Trivy可以从容器内部扫描正在运行的容器。它绝不会让人惊讶。这是可以实现的方法,请注意,我们不需要在主机上安装Trivy。

$docker run --rm -it nginx \
   && curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/master/contrib/install.sh | sh -s -- -b /usr/local/bin \
   && trivy fs /