ちょっと話題の記事

最近話題のコンテナ脆弱性ツール「Trivy」を試してみた

2019.05.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちわ、札幌のヨシエです。
社内にコンテナチャンネルがありまして、話題に上がったTrivyというコンテナイメージ用脆弱性スキャナを試してみました。

knqyf263/trivy

対象OS

対象OSは以下となります。
注意点としてAmazonLinuxのコンテナイメージはスキャン対象外となりますのでご注意ください。

  • Alpine
  • RHEL
  • CentOS
  • RedHat Universal Base image
  • Debian
  • Ubuntu

MacOSへインストール

検証目的なので作業用MBPにTrivyをインストールします。

% sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.5
BuildVersion:   18F132

HomeBrewを使用してインストールを行いました。

$ brew tap knqyf263/trivy
$ brew install knqyf263/trivy/trivy

コマンド構文

基本となるコマンド構文は以下のようになります。

trivy [options] container_image_name

スキャン検証実施

試しにredisのコンテナイメージに脆弱性スキャンを実施してみます。

■スキャン実行(初回)

% time trivy redis
2019-05-21T16:50:26.608+0900    INFO    Updating vulnerability database...
2019-05-21T16:54:05.479+0900    INFO    Updating NVD data...
 122582 / 122582 [======================================================================================================] 100.00% 3m57s
2019-05-21T16:58:02.860+0900    INFO    Updating Alpine data...
 11119 / 11119 [==========================================================================================================] 100.00% 17s
2019-05-21T16:58:20.343+0900    INFO    Updating RedHat data...
 19428 / 19428 [==========================================================================================================] 100.00% 31s
2019-05-21T16:58:51.666+0900    INFO    Updating Debian data...
 27846 / 27846 [==========================================================================================================] 100.00% 38s
2019-05-21T16:59:30.201+0900    INFO    Updating Debian OVAL data...
 59739 / 59739 [========================================================================================================] 100.00% 1m26s
2019-05-21T17:00:56.834+0900    INFO    Updating Ubuntu data...
 30192 / 30192 [==========================================================================================================] 100.00% 51s
2019-05-21T17:01:48.808+0900    WARN    You should avoid using the :latest tag as it is cached. You need to specify '--clear-cache' option when :latest image is changed
2019-05-21T17:01:51.551+0900    INFO    Detecting Debian vulnerabilities...

redis (debian 9.7)
==================
Total: 145 (UNKNOWN: 0, LOW: 21, MEDIUM: 76, HIGH: 40, CRITICAL: 8)

+-------------------+---------------------+----------+-----------------------+----------------+--------------------------------+
|      LIBRARY      |  VULNERABILITY ID   | SEVERITY |   INSTALLED VERSION   | FIXED VERSION  |             TITLE              |
+-------------------+---------------------+----------+-----------------------+----------------+--------------------------------+
| apt               | CVE-2011-3374       | LOW      | 1.4.9                 |                |                                |
+-------------------+---------------------+          +-----------------------+----------------+--------------------------------+
 〜〜〜〜〜     省略     〜〜〜〜〜
+-------------------+---------------------+----------+-----------------------+----------------+--------------------------------+
| util-linux        | CVE-2016-2779       | HIGH     | 2.29.2-1+deb9u1       |                | util-linux: runuser tty hijack |
|                   |                     |          |                       |                | via TIOCSTI ioctl              |
+-------------------+---------------------+----------+-----------------------+----------------+--------------------------------+
trivy redis  97.34s user 104.27s system 29% cpu 11:25.16 total

初回実行時は脆弱性情報の取得処理が実行されることから約11分程かかりました。

■スキャン実行(2回目)

初回スキャンの実行後に再度実行してみます。
コンテナイメージのチェックとして、都度キャッシュをクリアする観点から-cオプションを付与して実行してます。

% time trivy -c redis
2019-05-21T17:15:25.963+0900    INFO    Removing image caches...
2019-05-21T17:15:25.974+0900    INFO    Updating vulnerability database...
2019-05-21T17:15:29.799+0900    INFO    Detecting Debian vulnerabilities...

redis (debian 9.7)
==================
Total: 145 (UNKNOWN: 0, LOW: 21, MEDIUM: 76, HIGH: 40, CRITICAL: 8)
trivy -c redis  0.40s user 0.75s system 28% cpu 4.043 total

およそ4秒でスキャンが完了しました。

実際の使い方

実際にTrivyを使用した使い方を考えてみました。

実行例①:単純なイメージ脆弱性スキャン

初めて使用するコンテナイメージなどに利用する形が良いかと思います。

% trivy --auto-refresh -c httpd

実行例②:CI環境での脆弱性スキャン

CI環境でコンテナイメージを作成する環境で使えそうなコマンド例です。

trivyが脆弱性スキャンを実行して脆弱性が存在する場合、終了コードはデフォルトで0を返します。 オプションである--exit-codeを入れることで脆弱性が存在した場合に1を返すオプションとなってます。

% trivy --exit-code 1 --auto-refresh -c -q httpd
% trivy --exit-code 1 --auto-refresh -c -q httpd ; echo $?
2019-05-21T17:31:54.326+0900    INFO    Removing image caches...
2019-05-21T17:31:54.348+0900    INFO    Updating vulnerability database...
2019-05-21T17:31:57.535+0900    INFO    Detecting Debian vulnerabilities...

httpd (debian 9.7)
==================
Total: 340 (UNKNOWN: 0, LOW: 68, MEDIUM: 178, HIGH: 80, CRITICAL: 14)

1 ←終了コード

最後に

脆弱性情報の取得処理に多少時間がかかりましたが、前もって取得処理を完了している環境であれば高速なスキャン環境が実現出来ると思います。
また、CI環境で利用されることを想定して作られている点からも簡単に取り入れやすいのでぜひ活用いただければと思います。