What is it, naokirin?

依存関係のライセンスと脆弱性を検出するために、License FinderとTrivyを試してみる

サーバーを実行していたりすると使っているフレームワークやライブラリの依存関係を含めて「ライセンスは大丈夫なのか?」「脆弱性はないのか?」ということがあります。この「依存関係を含めて」というのが自前で検証するのが難しい要因ですが、現在はパッケージ管理ツールなどの設定からこれらをチェックしてくれるツールが存在しているため、それらを試してみました。

今回は、パッケージ管理ツールからライセンスのチェックをしてくれる License Finderと、コンテナイメージの脆弱性チェックをしてくれるTrivyを使ってみました。

ちなみに、ライセンスのチェックは、Githubの内製ツールをOSS化したlicensedなどもあります。また稼働中のサーバーに対して脆弱性をチェックするための、Vulsもあります。

https://github.com/github/licensed
https://github.com/future-architect/vuls

今回は、以下を理由にLicense FinderとTrivyを使ってみることにしました。

  • 依存関係を含めてライセンスのチェックをしたいが、網羅的にできるツールがよい
    • License Finderは他ツールに比べて対応が多く、Experimentalとはいえ、対応しようとしているものも多い
  • デプロイ時のCI/CDでチェックしたい
    • イメージビルドの段階で脆弱性がチェックできることがまずは望ましい

今回は、Ruby on Railsのプロジェクトに対して実行してみたので、その検証した際のリポジトリを載せておきます(Railsのプロジェクトはrails new しただけのものです)。

github.com

Trivy

Trivyは、脆弱性や設定ミスをコンテナイメージからスキャンしてくれるツールです。

github.com

インストール後に以下のようにコマンドを実行すると、対象ごとに分けて結果を出力してくれます。

$ trivy image <イメージ名>

... 脆弱性DB取得のログ ...

dep_checkers_server (alpine 3.12.7)
===================================
Total: 2 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 2, CRITICAL: 0)

+------------+------------------+----------+-------------------+---------------+---------------------------------------+
|  LIBRARY   | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION |                 TITLE                 |
+------------+------------------+----------+-------------------+---------------+---------------------------------------+
| busybox    | CVE-2021-28831   | HIGH     | 1.31.1-r21        | 1.32.1-r4     | busybox: invalid free or segmentation |
|            |                  |          |                   |               | fault via malformed gzip data         |
|            |                  |          |                   |               | -->avd.aquasec.com/nvd/cve-2021-28831 |
+------------+                  +          +                   +               +                                       +
| ssl_client |                  |          |                   |               |                                       |
|            |                  |          |                   |               |                                       |
|            |                  |          |                   |               |                                       |
+------------+------------------+----------+-------------------+---------------+---------------------------------------+

Node.js (node-pkg)
==================
Total: 3 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 3, CRITICAL: 0)

...

最初に脆弱性情報データベースを取得するため少し時間がかかりますが、二回目以降はキャッシュを利用するのであまり時間はかからないようです。

またCIなどで、CRITICAL以上はexit 1 にしたい、といった場合は以下のようなオプションをつけて実行すれば、対応できます。

trivy image --exit-code 1 --severity CRITICAL <イメージ名>

各環境でのインストール方法などは以下のドキュメントにまとまっています。

aquasecurity.github.io

残念ながらAlpineやAmazon Linuxでは未修正の脆弱性の検出はできないようですが、修正済みはできるようなので、適用漏れなどは防ぐことができそうです。

OS Packages - Trivy

License Finder

License Finderは、各言語のパッケージ管理ツールから、依存関係を含めてライセンスを一覧として抽出してくれます。

github.com

許可するライセンスを予め指定しておくことで、許可していないライセンスのパッケージが含まれていることを検出することができます。

gemが使える場合は、 license_finder gemを入れるだけなので簡単に利用できます。Railsのプロジェクトなどでは、Gemfileで入れておくほうがよさそうです。

gem 'license_finder', :group => :development

実行も、基本的には license_finder コマンドを実行するだけです(Gemfileで入れている場合はもちろん bundle exec license_finder です)。

HTML形式で出力したい場合は、以下のようにフォーマットを指定すれば、HTML形式でも出力できます。

license_finder report --format html > <出力先>

また、許可するライセンスは、以下のようにして指定できます。このコマンドを実行すると、 doc/dependency_decisions.yml に設定として出力されます。

license_finder permitted_licenses add MIT

実際に以下のような形で出力されるため、どのパッケージがライセンスに問題がありそうかを簡単に調べることができます。

f:id:naokirin:20211212165703j:plain

まとめ

今回は、依存関係のパッケージなどのライセンス、脆弱性という、開発では常に向き合うことになる問題について、ツールで自動的に検知できないか簡単に検証してみました。

最近はOSSでも使いやすいツールが増えているので、CI/CDに組み込んだり、cronで実行して検知するなどの対策をしていくべきですね。