Trivy DBを他のデータベースにマイグレーションするツール trivy-db-toを作った

Trivyは言わずと知れた脆弱性スキャナです。

私は最近までコンテナ専用のスキャナだと思っていましたがそんなことはなく、様々な環境に対してOSパッケージやアプリケーションの依存ライブラリの脆弱性を高速に検知してくれる汎用的なスキャナです。

k1low.hatenablog.com

CI環境だろうがサーバ内だろうが脆弱性検知をしてくれるTrivyですが、「その脆弱性データベースはどこにあるんだ?」となると思います。

実は毎回最新の脆弱性データベースを確認し(手元のデータベースより新しいものがあれば)ダウンロードしています。Trivy DBと呼ばれているようです。

Trivy DB

github.com

Trivy DBは通常版とlight版があるのですが、通常版でもダウンロードサイズはわずか19.4MBです *1

(実は、このTrivy DBを作成するまでの仕組みがよくできていたり、Trivy DBの中身についてTrivyの作者である@knqyf263さんに解説いただいたりしたので、それはまた別のエントリとか別のどこかで紹介したいです。)

Trivy DBを利用することでTrivyと同一の脆弱性データベースを得ることができるわけです。

同一のデータベースを得ることで、Trivyで検知した脆弱性情報を確認するWebUIを作ったり、別のツールでTrivyと同一の情報を利用することで情報の信頼性を担保したり、Trivyを中心としたシステムを作りやすくなります。

Trivy DBはbboltというファイルベースのいわゆる組み込み向けKey-Valueデータベースを採用しており、Trivyが効率的に使う想定になっています(それは当然そう)。

bboltのままだと他のシステムからの情報取得がしづらいので*2、Trivy DBを他のデータベースにマイグレーションするツールを作りました。

github.com

trivy-db-to

trivy-db-toはTrivy DBを他のデータベースにマイグレーションをするツールです。

CIやk8sのCronJobなど、データベースに接続できる環境で定期的に実行して脆弱性情報を更新する想定で作成しています。

使い方は以下のようにマイグレーション先のデータベースを指定して実行するだけです。

$ trivy-db-to mysql://root:mypass@127.0.0.1:3306/mydb

内部のフローとしては、

  1. (なければ)最新のTrivy DBを取得
  2. (なければ)マイグレーション先のデータベースに必要なテーブルを作成
  3. Trivy DBから脆弱性情報を吸い出してテーブルに登録
    • INSERT前にTRUNCATEが走ります

となります。更新が必要なデータだけUPDATEすれば良いとは思ったのですが、処理がある程度実時間で完了するので

v0.2.0ではMySQLPostgreSQLに対応しており、要望があれば他のデータベースにも対応したいと思っています。

私もまだプロダクション環境では利用していないのですが、使っていきたいところがあるので近いうちに適用できるように狙っていきます。

ニッチですがぜひどうぞ。

*1:2020/12/7時点のサイズ

*2:Goのツールであれば良いのですが