Blog

Trivyで脆弱性スキャンしてみた。

はじめに

こんにちは。セキュリティチームの添野隼矢と申します。
近年、サイバー攻撃によるセキュリティ被害やApache Log4jの脆弱性の件などで、脆弱性やシークレット情報をスキャンすることが重要になってきています。
本記事では、脆弱性やシークレット情報のスキャンを手軽に実行できるツール「Trivy」について紹介したいと思います。

「Trivy」とは

Trivyとは、コンテナイメージやファイルシステム、RemoteのGit Repository等の脆弱性やシークレット情報をスキャンできるツールです。
Trivyは他の脆弱性スキャンツールと比べ、バイナリを配置するだけで利用可能になる等、導入が容易で、実行もワンライナーで実行することができます。
また、TrivyはGitHub Actions、JenkinsなどのCIにも簡単に組み込めるように作られています。

Trivyがスキャンできるターゲット

参考:https://github.com/aquasecurity/trivy#installation

Trivyのスキャン内容

  • 使用しているOSのソフトウェアの依存関係(SBOM)
  • 既知の脆弱性(CVE)
  • IaC の問題と設定ミス
  • 機密情報とシークレット情報
  • ソフトウェア ライセンス

参考:https://github.com/aquasecurity/trivy#installation

Trivyの脆弱性スキャンについて

Trivyの脆弱性スキャンは、trivy-dbと呼ばれているツールで作成されている脆弱性DBを参照して行われます。
6時間おきに、脆弱性DBが更新されていくため、最新の脆弱性情報で脆弱性スキャンをかけることができます。

Update interval
Every 6 hours

引用元:https://github.com/aquasecurity/trivy-db

上記の脆弱性DBに更新があった際、スキャンコマンド初回実行時に以下のようなコマンドが流れ、自動で最新の脆弱性情報を取り込んでくれます。

Trivy実際に使ってみる

初めにTrivyをインストールします。
インストール方法は以下の公式に従って、インストールをします。 https://github.com/aquasecurity/trivy#installation

コンテナイメージスキャン

コンテナイメージをスキャンする際は、trivy image [image名]でスキャンすることができます。
試しにベースイメージ Alpine Linux 3.4のPythonイメージに対してスキャンしてみます。
※出力結果は長いため、記載は一部のみにしています。

出力結果を確認すると37件の脆弱性があることがわかります。
37件の脆弱性の内訳にCRITICAL、HIGH、MEDIUM、LOW、UNKNOWNが書かれていると思います。
こちらは、共通脆弱性評価システムCVSS(Common Vulnerability Scoring System)によって評価された脆弱性のスコアをもとに設定されているものです。
現在、最新版のCVSSバージョン3での各レベルのスコアは以下の通りです。
CRITICAL(9.0~10.0)、HIGH(7.0~8.9)、MEDIUM(4.0~6.9)、LOW(0.1~3.9)、UNKNOWN(未確認)
スコアの算出方法など詳しくはこちらをご覧ください。

--severityオプションを使用することで、上記の出力結果から脆弱性のレベルで絞ることもできます。
実行例(CRITICAL,HIGHで絞ってみた例)

ファイルシステムスキャン

次にファイルシステムをスキャンする際は、trivy fs または trivy rootfs でスキャンすることができます。
trivy fs trivy rootfs の違い
fsコマンド

  • ローカルプロジェクトに対するスキャン 参考:Filesystem

roofsコマンド

  • ホストマシン、仮想マシンイメージ、展開されたコンテナイメージのファイルシステムなどに対するスキャン 参考:Rootfs

試しにDjangoをインストールしたPythonの仮想環境のプロジェクトを用意してみました。

上記のプロジェクトに対して、スキャンしてみます。
※実行すると、実行時刻が実行結果のINFOの左列に出ますが、ここでは消しています。

上記のようなコマンドが出力された後に、なにも脆弱性情報が出なかった場合は、スキャンで脆弱性が見当たらなかったということになります。
また単一ファイル(Pipfile.lockなど)に対してもスキャンすることが可能です。

ここで一時的にDjangoのバージョンを4.0.5(脆弱性が発見されているバージョン)に落としてみて、再度スキャンをしてみます。

4.0.5にバージョンを下げてスキャンしたところ、3件の脆弱性が検知されました。
3件の脆弱性が検知されることの確認が終わりましたので、バージョンを元に戻します。

終わりに

Trivyには、ライセンスチェックやシークレット情報のチェック、出力形式の指定、また記事の最初の方で触れたAWSのAMIやEBSスナップショットのスキャンなど、本記事で紹介していない部分がまだまだあります。
今後も引き続き紹介していければと思います。

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!