TrivyでDockerコンテナの脆弱性スキャンを実践する入門

※本記事にはプロモーション(広告)を含みます。
Dockerコンテナの脆弱性対策は「イメージをビルドした直後にTrivyでスキャンする」ことから始めてください。Trivyはコンテナイメージ、ファイルシステム、Gitリポジトリに含まれる既知の脆弱性(CVE)やライセンス情報を無料で検出できるオープンソースのスキャナです。本記事ではTrivyのインストールから実際のスキャン手順、CI/CDへの組み込み、運用時に気をつけたい点までを、コマンド例を交えて解説します。
Trivyとは何か
TrivyはAqua Security社が開発しているオープンソースの脆弱性スキャナです。Dockerイメージの中にインストールされているOSパッケージ(Debian、Alpine、Ubuntu、CentOSなど)や、npm・pip・Goモジュールといった言語パッケージのバージョンを解析し、既知の脆弱性データベースと突き合わせて危険なバージョンを検出します。単体のバイナリとして配布されているため、専用サーバーやエージェントを別途用意しなくても、開発者のローカル環境やCI環境にそのまま導入できる点が特徴です。
スキャン対象はコンテナイメージだけではありません。以下の表はTrivyが対応している主なスキャン対象と用途をまとめたものです。
| スキャン対象 | コマンド例 | 主な用途 |
|---|---|---|
| コンテナイメージ | trivy image イメージ名 | 本番デプロイ前のイメージ検査 |
| ファイルシステム | trivy fs . | ローカルのソースコードや依存関係の検査 |
| Gitリポジトリ | trivy repo リポジトリURL | クローンせずにリモートリポジトリを検査 |
| Kubernetesマニフェスト | trivy config . | 設定ミス(misconfiguration)の検出 |
| SBOM生成 | trivy image –format cyclonedx | ソフトウェア部品表の出力 |
本記事では、この中でも最も利用頻度の高い「コンテナイメージのスキャン」を中心に手順を紹介します。
導入前の準備
動作環境の確認
Trivyは公式ドキュメントでLinux、macOS、Windowsに対応していると案内されています。バージョンによってインストール手順やオプション名が変わることがあるため、実際の導入時は必ずTrivy公式ドキュメントの最新版を確認してください。本記事のコマンド例は基本的な操作を示すものであり、細部のオプション名は利用しているバージョンに合わせて読み替える必要があります。
インストール方法の例
macOSであればHomebrewを使って導入できます。Linux環境ではAqua Security社が公開しているインストールスクリプト、またはaptやyumのパッケージリポジトリを追加する方法が案内されています。コンテナ環境であれば、Trivy自体のDockerイメージを使ってスキャンを実行することも可能です。ローカルに追加のツールを増やしたくない場合はこの方式が扱いやすい選択肢になります。
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image nginx:latest上記のようにDockerソケットをマウントすることで、ホスト上のDockerデーモンに保存されているイメージをスキャン対象として指定できます。社内のネットワークポリシーによってはこの方式が制限されている場合があるため、事前にインフラ担当者へ確認してください。
基本的な使い方
イメージスキャン手順
最初に、動作確認のため公開イメージをスキャンしてみます。
trivy image nginx:1.25このコマンドを実行すると、Trivyは指定したイメージのレイヤーを解析し、内部にインストールされているパッケージの一覧を取得したうえで脆弱性データベースと照合します。初回実行時はデータベースのダウンロードが発生するため、回線速度によっては数十秒から数分の待ち時間が発生します。2回目以降はローカルにキャッシュされたデータベースを使うため、実行時間は短くなります。
結果の読み方
スキャン結果には、検出されたCVE番号、影響を受けるパッケージ名、現在インストールされているバージョン、修正済みバージョン、深刻度(CRITICAL・HIGH・MEDIUM・LOW・UNKNOWN)が表示されます。まず確認すべきはCRITICALとHIGHの件数です。深刻度がCRITICALでも「修正済みバージョンなし」と表示されている場合は、現時点でパッケージ更新による対応ができないため、該当パッケージの利用を別の手段に置き換える検討が必要になります。
件数だけで判断せず、実際にアプリケーションがその脆弱なパッケージの機能を使っているかどうかも確認してください。ベースイメージに含まれているだけで、アプリケーションのコードパスから到達しない脆弱性も一定数含まれています。
出力形式の指定
デフォルトの出力は人が読みやすいテーブル形式ですが、後続処理で扱いやすいJSON形式やSARIF形式も指定できます。
trivy image --format json --output result.json nginx:1.25JSON形式で出力しておくと、社内のダッシュボードや別のセキュリティツールへの連携がしやすくなります。
CI/CDへの組込み
実行タイミングの設計
Trivyは開発者のローカル環境だけでなく、CI/CDパイプラインに組み込んで自動実行する使い方が一般的です。イメージをビルドした直後にスキャンを実行し、一定以上の深刻度の脆弱性が見つかった場合はパイプラインを失敗させる、という流れを組むことで、脆弱なイメージが本番環境にデプロイされる前に検出できます。
GitHub Actionsでの例
GitHub Actionsでは、公式に公開されているアクションを利用することでワークフローに組み込みやすくなります。以下は概念を示す設定例です。実際に導入する際は公式リポジトリのドキュメントに沿って最新の記法を確認してください。
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
with:
image-ref: 'myapp:latest'
severity: 'CRITICAL,HIGH'
exit-code: '1'exit-codeを1に設定しておくと、CRITICALまたはHIGHの脆弱性が検出された時点でジョブが失敗扱いになり、以降のデプロイステップに進まなくなります。severityで対象の深刻度を絞り込むことで、LOWレベルの検出結果でパイプラインが頻繁に止まる事態を避けられます。
失敗条件の設定
すべての脆弱性検出でパイプラインを止めてしまうと、開発チームの作業が滞りやすくなります。運用開始直後は「CRITICALのみで失敗」に設定し、既存イメージの棚卸しが進んだ段階で「HIGH以上で失敗」に条件を広げるなど、段階的に厳しくしていく進め方が現実的です。あわせて、修正が難しい既知の脆弱性については、Trivyの無視リスト機能(.trivyignoreファイル)にCVE番号を登録し、理由と再確認日をコメントで残しておくと後から見直しやすくなります。
運用時の注意点
誤検知への対応
脆弱性データベースの粒度によっては、実際には影響を受けない構成であっても検出される場合があります。検出結果をそのまま鵜呑みにせず、影響を受けるパッケージが実際に使用されているかどうかをコードレベルで確認する作業が発生します。誤検知と判断した場合も、無視リストに登録するだけで終わらせず、判断根拠をチームで共有できる場所に記録しておくと、後日別のメンバーが同じ調査をやり直す手間を減らせます。
DB更新の管理
Trivyが参照する脆弱性データベースは日々更新されています。CI環境でデータベースを都度ダウンロードすると、実行時間が延びるだけでなく、外部ネットワークへの依存が増えます。社内にデータベースのキャッシュサーバーを立てる、あるいは定期的にデータベースを更新する専用ジョブを分離するなど、実行環境の構成に応じた工夫が必要です。オフライン環境で運用する場合は、事前にデータベースをダウンロードしてローカルに配置する手順が公式ドキュメントで案内されています。
設定ミス検出の活用
Trivyはパッケージの脆弱性だけでなく、Dockerfileやkubernetesマニフェストの設定ミス(rootユーザーでのコンテナ起動、特権モードの有効化など)も検出できます。イメージ内部の脆弱性対策とあわせて、そもそもの設定に危険な項目がないかを定期的に確認する運用に組み込むと、対策の幅が広がります。
よくある質問
無料で使えますか
Trivy自体はオープンソースソフトウェアとして公開されており、無料で利用できます。商用サポートが必要な場合は、Aqua Security社が提供する有償製品との連携を公式サイトで確認してください。
Windows環境でも動きますか
公式ドキュメントではWindowsへの対応も案内されています。ただしDockerソケットへのアクセス方法がLinux環境と異なるため、Docker Desktopの設定にあわせてコマンドを調整する必要があります。
スキャンにかかる時間の目安は
イメージのサイズやパッケージ数によって変わりますが、目安として数百MB程度のイメージであれば数秒から数十秒程度で完了することが多いです。データベースのダウンロードが発生する初回実行時は、これに加えて追加の時間がかかります。
脆弱性が見つかったら必ず修正すべきですか
深刻度が高く、かつ修正済みバージョンが存在する場合は速やかな更新が推奨されます。一方で、修正版が存在しない、あるいはアプリケーションのコードパスから到達しない脆弱性については、リスクを評価したうえで対応の優先順位を判断する必要があります。
他の脆弱性スキャナとの違いは何ですか
コンテナイメージ、ファイルシステム、Gitリポジトリ、Infrastructure as Codeの設定ファイルまで単一のツールで横断的にスキャンできる点がTrivyの特徴です。ツールごとに得意な検出対象が異なるため、既存のセキュリティ運用に応じて他のツールと併用する構成も選択肢になります。
関連記事
まとめ
Trivyを使ったDockerコンテナの脆弱性スキャンは、イメージのビルド直後にコマンド一つで実行できる手軽さが強みです。まずはローカル環境で trivy image コマンドを実行して検出結果の読み方に慣れ、その後CI/CDパイプラインに組み込んで自動化する流れが導入しやすい進め方になります。深刻度に応じた失敗条件の設定、無視リストの運用ルール、データベース更新の管理体制まで含めて設計しておくことで、開発チームの負担を抑えながら継続的な脆弱性対策の運用につなげられます。バージョンによって挙動やオプションが変わることがあるため、導入・運用にあたっては必ずTrivy公式ドキュメントの最新情報を確認し、セキュリティ設定については自己の責任で実施してください。
本記事はInfra Academy編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。 編集ポリシーはこちら




