気軽に使えるContainerの脆弱性スキャンツール Trivy を試してみた

はじめに

こんにちは、スタディサプリENGLISH SRE 木村です。

皆さん、コンテナ使ってますか? リクルートマーケティングパートナーズのサービスでは多くのワークロードがコンテナで動いています。一度コンテナの利便性を知ってしまうともう元に戻れません……(個人差・用途に寄ります)。コンテナ技術は非常に便利ですが、その一方で気になるのがセキュリティです。

今回はコンテナの脆弱性スキャンを試すことが出来るツール。Trivyを試してみました。

弊グループ会社リクルートテクノロジーズセキュリティチームに所属している藤村さん(@masahiro331)も開発を精力的に手伝っています。

コンテナの脆弱性について

コンテナを利用する際は、DockerHubなどからImageをPullをしてきて使うことが多いかと思います。しかし、野良Imageなどはもちろん公式Imageの中にも脆弱性が含まれていることが多いのも事実です。

また、同じImageを使っていても日々新たな脆弱性が発見・報告されつづけているので、その都度対応が求められます1)https://www.ipa.go.jp/security/vuln/CVE.html

しかし、日々脆弱性を確認し続けるのは大変です。そのためか、近年脆弱性の対応のためのコンテナの脆弱性スキャンツールが議論に上がることが多くなっています。
Clair, Docker Security Scanning,Google Container Registry vulnerability-scanning(Alpha), Aqua Container Security Platform (色々な機能の一つにimage scanがある) などのツールがあります(AWS ECRも自動脆弱製スキャン対応してほしい[壁|]_・。))

Trivyについて

概要

A Simple and Comprehensive Vulnerability Scanner for Containers, Suitable for CIと書いてあるように、TrivyはCIなどでも簡単に組み込んで使えるようにシンプルに作られているツールです。

Trivyで検知することが出来るのは、owasp zapのようなツールで検知するアプリケーションの脆弱性ではなく、アプリケーションに依存するライブラリやOSパッケージの脆弱性検知になります。

使い方

trivy [YOUR_IMAGE_NAME] の形で実行するだけで簡単に指定したimageの脆弱性をScan出来るようになっています。簡単!

Golang製

Goで作られており、RHEL/CentOS、Debian/Ubuntu、MacOS、Windowsで動かすことが出来ます。Mac環境であればHomebrewでinstall出来るようになっており、もちろんGoなので go get でinstallすることも出来ます。

OSパッケージの脆弱性検知

yumapt-get などからinstallしたパッケージの脆弱性の検知をしてくれます。

アプリケーションの依存ライブラリ

ここがすごい!と思ったのですが、OSパッケージだけでなく、gem(Ruby)、pip(Python)などのアプリケーションの依存性解決ツールでinstallされるライブラリの脆弱性を検知してくれます。アプリケーションの脆弱性から入れるのは、アプリエンジニアから見ても敷居が低い所から見ることが出来るのでいいですね。

20190612時点の対応ファイル

Gemfile.lock (Ruby)
Pipfile.lock (Python)
poetry.lock (Python)
composer.lock (PHP)
package-lock.json (Javascript)
yarn.lock (Javascript)
Cargo.lock (Rust)

CI (Continuous Integration)

cliから気軽に実行が出来、CIの組み込みがしやすいようになっています。
公式にCircleCIとTravisCIの設定例が書いてあり、非常に丁寧です。(他の例を書くなら今がPRチャンス?)

使ってみた

昔書いて放置しっぱなしの明らかに脆弱性の塊の個人Repositoryがあったので、こいつを使って実際にScanを行いました。

実行結果

結果から書くとOSパッケージ関連が下記のようになり、

Total: 3125 (UNKNOWN: 2, LOW: 131, MEDIUM: 2390, HIGH: 590, CRITICAL: 12)

gem関連の検出結果は下記の通りとなりました。

usr/local/bundle/gems/database_cleaner-1.7.0/Gemfile.lock Total: 54 (UNKNOWN: 3, LOW: 2, MEDIUM: 38, HIGH: 10, CRITICAL: 1)
app/Gemfile.lock Total: 9 (UNKNOWN: 0, LOW: 1, MEDIUM: 5, HIGH: 3, CRITICAL: 0)
usr/local/bundle/gems/factory_bot-4.10.0/Gemfile.lock Total: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 1, HIGH: 0, CRITICAL: 0)

実際にこれを書いたのは多分2年ぐらい前 ( ? ) だった気がしますが、こんなにも脆弱性が発見されるとは……😨
全ての脆弱性を見たい方は、ぜひtrivyをDLして実際にScanしてみてください。

コマンドの実行

脆弱性DBからのデータ取得

初回の実行の場合は脆弱性の情報を取得するのに時間がかかります。回線やその他の状況にもよりますが、今回の場合は20分ほどかかりました。
2回目以降は差分だけ落としてくるので速くなります。CI等で使う場合はtrivyのcache($HOME/.cache/trivy)をCI上のcacheにしておきましょう

  • 今回実際に実行したコマンド trivy yutachaos/circleci-rails-sample:3c92ef7d

OSパッケージの脆弱性の検査

実際の画面ではterminalで色付きのテーブルで表示されます。わかりやすくて良いですね。OSのエラーをいくつか眺めてみましたが、やはり有名どころではImageMagicのErrorはたくさんでていたような印象です (;゚Д゚)

アプリケーションパッケージの脆弱性の検査

使われている依存アプリケーションの脆弱性がわかるのは、アプリケーション側の人にも親しみやすくてよいですね。ライブラリのupdateは怠りがちになる部分でもあるので、まずはここからアプローチしていくのも手だと思います。

さいごに

DevSecOpsなど、DevOpsの文脈2)https://www.gartner.com/jp/newsroom/press-releases/pr-20180725の中、CI/CD pipelineに脆弱性スキャンを組み込むべきという話も出ていており、3) https://blog.aquasec.com/gartner-report-securing-containers 日に日にソフトウェアのセキュリティに対する重要度は上がってきています。

開発や事業のスピードに比べるとどうしてもおざなりになりがちなセキュリティですが、Trivyのような気軽に使えるツールを使って、スモールスタートでもセキュリティを高めていきましょう!

参考記事