【処理速度53倍】コンテナ脆弱性スキャンツールTrivyの初回実行速度が高速化されました!

初回起動が圧倒的に高速化されたOSSのコンテナ脆弱性スキャンツールTrivy。今後の進化に注目です。
2019.11.23

「これは、まじで圧倒的…」

OSSの脆弱性スキャンツールとして界隈では有名な「Trivy」。以前からもお世話になっていたのですが、初回起動処理が長いためキャッシュが効かないCI/CDツールとは相性が悪いという弱点がありました。

それが、バージョン0.2.0からその弱点の初回起動処理の遅さが一気に解消され、既存のCI/CDツールへの取り込みが現実的になりました。

インストールも簡単で、かつワンライナーで実行できる手軽なツールなので、コンテナを運用している人はこれを機に一度試してみることをおすすめします。

初回起動爆速化きたか…!!

  ( ゚д゚) ガタッ
  /   ヾ
__L| / ̄ ̄ ̄/_
  \/   /

Trivyとは

GitHubはこちら。

aquasecurity/trivy: A Simple and Comprehensive Vulnerability Scanner for Containers, Suitable for CI

AquaからOSSで提供されているコンテナ脆弱性スキャンツール。作者は日本人のスッキリごん!さん。

作者の方が、Aquaに入社するまでの流れは本人のブログを読めばすべてわかります。はてぶが1900以上ついてる記事なので、見たことがある人も多いんじゃないでしょうか。

趣味で作ったソフトウェアが海外企業に買われるまでの話 - knqyf263's blog

v0.2.0から初回起動が超高速化されました

v0.2.0以前は、脆弱性情報をGitHubに保存してあり、起動時にGit CloneしてローカルでDB構築していました。そのため初回起動が重くキャッシュを基本持たないCIサービスでは非常に時間がかかるものでした。

これが、v0.2.0のリリースでBoltDBをzip化してGitHub Releaseに移行し、データサイズを削減。全体で80%のサイズ削減に成功。これにより、初回実行でも10秒以内に完了するようになっているとのことです。

というわけで、実際にスキャンをかけてみた様子をご覧いれます。

脆弱性スキャン対象イメージをダウンロード

最初に、予めスキャン対象のイメージをクライアントにダウンロードしておきます。手元の環境は以下の通り。

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.1
BuildVersion:   19B88
$ docker --version
Docker version 19.03.5, build 633a0ea

スキャン対象は、centosで公開されているイメージで一番古いcentos6.6を利用します。スキャンが捗りそう。

$ docker image pull centos:centos6.6
centos6.6: Pulling from library/centos
5dd797628260: Pull complete 
Digest: sha256:32b80b90ba17ed16e9fa3430a49f53ff6de0d4c76ad8631717a1373d5921fa26
Status: Downloaded newer image for centos:centos6.6

以前のバージョンでのスキャン実行速度の計測

以前のバージョンと比較するため、旧バージョンで実行速度を確認しておきます。

$ trivy --version
trivy version 0.1.4

最初に、全てのキャッシュとクライアントデータベースを削除。--resetオプションを使います。

$ trivy --reset
2019-11-23T18:16:02.052+0900    INFO    Resetting...

ほな、計測してみましょう!

$ time trivy centos:centos6.6
Updating vulnerability database...
[                    ] It will take a while for the first time... 

centos:centos6.6 (centos 6.6)
=============================
Total: 899 (UNKNOWN: 0, LOW: 83, MEDIUM: 634, HIGH: 150, CRITICAL: 32)

====途中省略===

real    7m6.512s
user    1m40.775s
sys     2m13.785s

というわけで、初回起動では7分6秒程かかっています。これはつらいですな。

ちなみに2回めからは2秒ほどで完了。

$ time trivy centos:centos6.6
real    0m2.301s
user    0m0.794s
sys     0m0.398s

バージョン0.2.1によるスキャン実行速度の計測

trivyを最新版に更新します。

自分の環境だと、Aqua移譲前の古いFORMULAだったので、一旦アンインストールします。

$ brew uninstall knqyf263/trivy/trivy
Uninstalling /usr/local/Cellar/trivy/0.1.4... (5 files, 25.5MB)

再度最新版のインストール。

$ brew install aquasecurity/trivy/trivy

バージョンが、0.2.1になっていることを確認。

$ trivy --version
trivy version 0.2.1

実行前にキャッシュを削除。

$ trivy --reset
2019-11-23T21:27:40.616+0900    INFO    Resetting...

さて、いよいよスキャンしてみます。

$ time trivy centos:centos6.6
[============>       ] Downloading Full DB file...

real	0m7.823s
user	0m0.832s
sys	0m0.399s

その実行時間7.8秒!こりゃすごい。以前のバージョンの初回実行が7分6秒(426秒)なので、およそ54倍高速化しています。

ちなみに2回めの実行結果はこちら。2回目も0.05秒と非常に早くなっています。

$ time trivy centos:centos6.6
real	0m0.572s
user	0m0.419s
sys	0m0.130s

lightモードでさらに初回起動を早く

ちなみに、v.0.2.0以降では、新たに--lightオプションが追加されており、このオプションでは脆弱性情報の詳細はダウンロードせず、CVEのバージョンのみを表示します。こちらを使うと、初回起動でも約3秒で実行できました。詳細な脆弱性の情報が不要なCI/CDに組み込んで使うには最適ですね。

$ trivy --reset
$ time trivy --light centos:centos6.
real	0m2.971s
user	0m0.499s
sys	0m0.218s

参考までに2回目の実行結果です。

$ time trivy --light centos:centos6.
real	0m0.510s
user	0m0.362s
sys	0m0.113s

バージョンアップ前後での実行時間まとめ

以上、バージョンアップ前後の実行時間をまとめた表がこちら。

実行形態 v0.1.4 v0.2.1 v0.2.1(lightモード)
初回起動 426秒 7.8秒 2.9秒
2回目 2.3秒 0.5秒 0.5秒

初回起動から圧倒的に早くなっており、キャッシュが効かないCI/CD環境でも非常に使いやすくなっていることがわかります。

AWSブログにもTrivy登場の衝撃

実はめっちゃ自分的にびっくりしたことなんですが、ちょうど今日、AWSブログにもTrivyが取り上げられるという衝撃の出来事がありました。

ご存じの方も多いと思いますが、AWSのコンテナレジストリのECRに、先日脆弱性スキャンが提供されていたんですね(参考:【超待望アップデート】ECRに対する脆弱性スキャン機能が提供されました | Developers.IO

このECRの脆弱性スキャンは、別のOSSのコンテナ脆弱性スキャンツールであるClairをベースとしたものでした。

以前のAWSブログでもClairは紹介されていたので、「そっかぁ、ECRはClair使ったんだな」と思っていたところ、突然このタイミングでAWSのコンテナヒーローでかつAqua社のVPであるLiz RiceがAWSブログに寄稿したのは大きな驚きです。

あくまで個人の想像ですが、ECRの脆弱性スキャンエンジンの中にTrivyも取り込まれる布石では?と考えたりしています。

オープンソースでどこでも使えるTrivyをCI/CDに組み込んでみよう!

もともとワンライナーで気軽に使えるコンテナ脆弱性スキャンツールとして、Trivyは非常に使いやすいツールでした。ただ、クライアント側に脆弱性データベースをダウンロードするための初回処理が非常に長かったため、SaaSのCI/CDツールなどのような基本キャッシュを持たない環境では使いにくかったです。

今回のアップデートにより、その弱点が解消され、手軽にどこでも使える高機能な脆弱性スキャンツールとして大きな進化を遂げています。

ワンライナーで実行可能、かつエラーコード判定するためのオプションも豊富なため、オプションの組み合わせ次第でどんなシチュエーションに柔軟に対応可能。今までコンテナの脆弱性スキャン、いまいちめんどくさいなぁと思っていた人もこれをきっかけに取り入れてみてはいかがでしょうか。

それでは、今日はこのへんで。濱田(@hamako9999)でした。