Trivy(発音:/ˈtraɪvi/)は、Aqua Securityが開発したオープンソース総合セキュリティスキャナーです。GitHubで35,000以上のスターを獲得し、現在最も人気のあるオープンソースセキュリティスキャンツールの一つとなっています。

Trivyの最大の強みはその包括性にあります。複数のターゲット(コンテナイメージ、ファイルシステム、Gitリポジトリ、VMイメージ、Kubernetesクラスター)をスキャンし、複数のセキュリティ問題(既知のCVE脆弱性、IaC設定ミス、機密情報漏洩、ソフトウェアライセンス、SBOM生成)を検出できます。現代のDevSecOpsチームにとって、Trivyはコードコミットから本番デプロイメントまで、ほぼすべてのセキュリティスキャン連鎖をカバーできます。

本記事ではインストールから始め、Trivyのコア機能、実践的な使い方、そしてCI/CDパイプラインへの統合方法を段階的に紹介し、開発者とセキュリティエンジニアがこの強力なセキュリティツールをすぐに使いこなせるようお手伝いします。

なぜTrivyを選ぶのか?

Trivyが登場する前、セキュリティスキャン分野は断片化していました。コンテナイメージのスキャン、IaC設定のチェック、コード内のキー漏洩の検索には、それぞれ異なるツールが必要でした。Trivyはこれらの機能を統一されたCLIツールにまとめ、以下の優れた特徴を持っています:

1. マルチターゲットスキャン対応

Trivyは以下のターゲットをスキャンできます:

  • コンテナイメージ:Docker、OCI互換イメージ(ローカルまたはリモートレジストリ)
  • ファイルシステム:ローカルディレクトリ、プロジェクトソースコード
  • Gitリポジトリ:リモートGitリポジトリ(クローン不要)
  • 仮想マシンイメージ:AWS EC2 AMI、Azure VMなど
  • Kubernetesクラスター:稼働中のクラスター設定

2. 多次元セキュリティ検出

Trivyは以下のタイプのセキュリティ問題を発見できます:

  • 既知の脆弱性(CVE):OSパッケージとソフトウェア依存関係の脆弱性データベースに基づく
  • IaC設定ミス:Terraform、CloudFormation、Kubernetes YAMLなどのベストプラクティス違反
  • 機密情報漏洩:ハードコードされたAPIキー、パスワード、トークン
  • ソフトウェアライセンスコンプライアンス:プロジェクトで使用されているオープンソースライセンスタイプの特定
  • SBOM生成:ソフトウェア部品表(Software Bill of Materials)の生成

3. 統合が容易

Trivyは豊富な統合オプションを提供しています:

4. 高速・低リソース

TrivyはGo言語で書かれており、起動が速く、メモリ消費が少ないため、CI/CDパイプラインでの頻繁な実行に適しています。

Trivyのインストール

Trivyは複数のインストール方法に対応しています。以下は最も一般的な方法です:

方法1:Homebrewを使用(macOS/Linux)

BASH
brew install trivy

方法2:Dockerを使用

BASH
docker run aquasec/trivy --version

方法3:バイナリファイルをダウンロード

GitHub Releasesから対応プラットフォームのバイナリをダウンロード:

BASH
# Linux x86_64
wget https://github.com/aquasecurity/trivy/releases/download/v0.50.0/trivy_0.50.0_Linux-64bit.tar.gz
tar -xzf trivy_0.50.0_Linux-64bit.tar.gz
sudo mv trivy /usr/local/bin/

方法4:apt/yumを使用(Linuxディストリビューション)

BASH
# Ubuntu/Debian
sudo apt-get install wget gnupg
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo "deb https://aquasecurity.github.io/trivy-repo/deb generic main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install trivy

# CentOS/RHEL
sudo yum install trivy

インストールの確認

BASH
trivy --version
# 出力例:Version: 0.50.0

クイックスタート:最初のコンテナイメージをスキャン

簡単な例から始めましょう。公開されているDockerイメージをスキャンして、Trivyが何を発見できるか見てみましょう。

Python公式イメージのスキャン

BASH
trivy image python:3.9-slim

Trivyは以下のような結果を出力します:

python:3.9-slim (debian 11.7)
=====================================
Total: 123 (UNKNOWN: 0, LOW: 45, MEDIUM: 52, HIGH: 24, CRITICAL: 2)

+------------------+---------------------+----------+-------------------+---------------+---------------------------------------+
|     LIBRARY      |   VULNERABILITY ID  | SEVERITY | INSTALLED VERSION | FIXED VERSION |               TITLE                   |
+------------------+---------------------+----------+-------------------+---------------+---------------------------------------+
| libssl1.1        | CVE-2023-5678       | CRITICAL | 1.1.1w-0+deb11u1  | 1.1.1w-0+deb11u2 | OpenSSL: X.509 Email Address ...     |
| openssl          | CVE-2023-6129       | HIGH     | 1.1.1w-0+deb11u1  | 1.1.1w-0+deb11u2 | OpenSSL: POLY1305 MAC implementation... |
+------------------+---------------------+----------+-------------------+---------------+---------------------------------------+

出力には以下の重要な情報が含まれます:

  • 脆弱性総数:重大度別に分類(UNKNOWN、LOW、MEDIUM、HIGH、CRITICAL)
  • 脆弱性詳細テーブル:各脆弱性のライブラリ名、CVE ID、重大度、現在のバージョン、修正バージョン、脆弱性の説明

高危険度と致命的な脆弱性のみ出力

実際の業務では、通常、高危険度と致命的な脆弱性に注目します。--severityパラメータでフィルタリングできます:

BASH
trivy image --severity HIGH,CRITICAL python:3.9-slim

JSON形式で出力(自動化処理に適した形式)

BASH
trivy image --format json python:3.9-slim > results.json

コア機能の詳細

1. ファイルシステムのスキャン

コンテナイメージだけでなく、Trivyはローカルファイルシステムもスキャンし、プロジェクトの依存関係に含まれる脆弱性を検索できます。これは開発初期段階でセキュリティ問題を早期発見するために非常に有用です。

BASH
# 現在のディレクトリをスキャン
trivy fs .

# 指定したディレクトリをスキャン
trivy fs /path/to/project

# 特定の言語の依存関係のみスキャン
trivy fs --scanners vuln --language python /path/to/project

Trivyが対応する言語は:Python、Node.js、Java、Go、Ruby、PHP、.NET、Rustなどの主要なプログラミング言語です。

2. Gitリポジトリのスキャン

TrivyはリモートGitリポジトリを直接スキャンでき、事前にローカルにクローンする必要はありません:

BASH
# 公開GitHubリポジトリをスキャン
trivy repo https://github.com/aquasecurity/trivy

# 指定したブランチをスキャン
trivy repo https://github.com/aquasecurity/trivy@main

これはサードパーティのオープンソースプロジェクトのセキュリティ監査に非常に便利です。

3. Kubernetes設定のスキャン

Kubernetesの設定ミスはセキュリティインシデントの主な原因の一つです。TrivyはKubernetes YAMLファイルがセキュリティのベストプラクティスに準拠しているかチェックできます:

BASH
# 単一のYAMLファイルをスキャン
trivy config deployment.yaml

# ディレクトリ内のすべての設定ファイルをスキャン
trivy config ./k8s-manifests/

Trivyは以下の問題を検出します:

  • コンテナがrootユーザーで実行されている
  • リソース制限(CPU/メモリ)が設定されていない
  • latestタグが使用されている
  • 特権モードが有効になっている
  • 機密情報が環境変数でハードコードされている

出力例:

k8s-manifests/deployment.yaml
=============================
Tests: 15 (SUCCESSES: 12, FAILURES: 3, EXCEPTIONS: 0)
Failures: 3 (UNKNOWN: 0, LOW: 1, MEDIUM: 1, HIGH: 1, CRITICAL: 0)

+-----------+------------+-----------------+----------+---------------------------------------+
| TYPE      | MISCONF ID |    CHECK        | SEVERITY |              MESSAGE                  |
+-----------+------------+-----------------+----------+---------------------------------------+
| Kubernetes| KSV012     | Image Tag       | MEDIUM   | Container 'app' uses 'latest' tag     |
| Kubernetes| KSV001     | Privileged      | HIGH     | Container 'app' runs in privileged mode|
+-----------+------------+-----------------+----------+---------------------------------------+

4. SBOM(ソフトウェア部品表)の生成

SBOMはソフトウェアサプライチェーンセキュリティの重要な構成要素です。Trivyは標準形式のSBOMを生成できます:

BASH
# SPDX形式のSBOMを生成
trivy image --format spdx-json python:3.9-slim > sbom.spdx.json

# CycloneDX形式のSBOMを生成
trivy image --format cyclonedx python:3.9-slim > sbom.cyclonedx.xml

生成されたSBOMはコンプライアンス監査や脆弱性影響分析などのシナリオで使用できます。

5. 機密情報漏洩の検出

Trivyはコードにハードコードされた機密情報(APIキー、パスワード、トークンなど)が含まれているかスキャンできます:

BASH
trivy fs --scanners secret ./my-project

Trivyには以下のような機密情報検出ルールが組み込まれています:

  • AWS Access Key
  • GitHub Token
  • Slack Webhook URL
  • Private Key
  • Database Connection String

CI/CD統合実践

TrivyをCI/CDパイプラインに統合することは、「セキュリティの左シフト」を実現する重要なステップです。以下は一般的なプラットフォームの統合例です。

GitHub Actions

プロジェクトのルートディレクトリに.github/workflows/trivy.ymlを作成:

YAML
name: Trivy Security Scan

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  trivy-scan:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Run Trivy vulnerability scanner
        uses: aquasecurity/trivy-action@master
        with:
          image-ref: 'python:3.9-slim'
          format: 'table'
          severity: 'CRITICAL,HIGH'
          exit-code: '1'  # 高危険度の脆弱性が見つかった場合に失敗

このワークフローはプッシュやPRのたびに指定したコンテナイメージを自動的にスキャンし、高危険度または致命的な脆弱性が見つかった場合、CIは失敗します。

GitLab CI

.gitlab-ci.ymlに追加:

YAML
trivy-scan:
  image:
    name: aquasec/trivy:latest
    entrypoint: [""]
  script:
    - trivy fs --exit-code 1 --severity HIGH,CRITICAL .
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

Jenkins Pipeline

GROOVY
pipeline {
    agent any

    stages {
        stage('Security Scan') {
            steps {
                sh '''
                    docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
                        aquasec/trivy image --exit-code 1 --severity HIGH,CRITICAL \
                        my-app:latest
                '''
            }
        }
    }
}

高度な使い方

1. 特定の脆弱性を無視する

場合によっては、特定の脆弱性があなたのシナリオでは悪用できないことがあります。.trivyignoreファイルを作成して無視できます:

# .trivyignore
CVE-2023-1234
CVE-2023-5678

または--ignorefileパラメータでカスタム無視ファイルを指定:

BASH
trivy image --ignorefile .trivyignore python:3.9-slim

2. 脆弱性データベースのキャッシュ

Trivyはデフォルトでスキャンのたびに脆弱性データベースを更新しますが、これはCI/CD環境で追加のネットワークオーバーヘッドを引き起こします。キャッシュを使用して高速化できます:

BASH
# 初回スキャン時にデータベースをダウンロード
trivy image --download-db-only

# 以降のスキャンはローカルキャッシュを使用
trivy image --skip-db-update python:3.9-slim

GitHub Actionsでは、actions/cacheを使用してデータベースを永続化できます:

YAML
- name: Cache Trivy DB
  uses: actions/cache@v3
  with:
    path: ~/.cache/trivy
    key: trivy-db-${{ hashFiles('~/.cache/trivy/db/trivy.db') }}
    restore-keys: trivy-db-

3. カスタムレポートテンプレート

TrivyはGoテンプレートを使用したカスタム出力形式に対応しています:

BASH
trivy image --format template --template "@contrib/html.tpl" python:3.9-slim > report.html

Trivyには以下のテンプレートが組み込まれています:

  • @contrib/html.tpl:HTMLレポート
  • @contrib/junit.tpl:JUnit XML形式(CI/CDに適した形式)
  • @contrib/sarif.tpl:SARIF形式(GitHub Code Scanningに適した形式)

4. Trivy Operatorとの統合(Kubernetes)

稼働中のKubernetesクラスターについては、Trivy Operatorをデプロイしてクラスター内のセキュリティリスクを継続的に監視できます:

BASH
helm repo add aqua https://aquasecurity.github.io/helm-charts/
helm install trivy-operator aqua/trivy-operator --namespace trivy-system --create-namespace

Trivy Operatorは自動的にクラスター内のワークロードをスキャンし、結果をKubernetes CRDとして保存します。Dashboardで確認するか、APIでクエリできます。

よくある問題のトラブルシューティング

問題1:スキャン速度が遅い

原因: 初回スキャンでは脆弱性データベース(約100-200MB)のダウンロードが必要です。

解決策: --skip-db-updateでデータベース更新をスキップするか、事前にデータベースをダウンロード:

BASH
trivy image --download-db-only
trivy image --skip-db-update python:3.9-slim

問題2:誤検出が多い

原因: Trivyの脆弱性データベースには、あなたのシナリオでは悪用できない脆弱性が含まれている可能性があります。

解決策: .trivyignoreファイルで既知の誤検出を無視するか、--severityパラメータを調整して高危険度の脆弱性のみに注目:

問題3:プライベートイメージのスキャンに失敗する

原因: Trivyは認証が必要なプライベートイメージレジストリにアクセスできません。

解決策: 環境変数を設定するか、--registry-tokenパラメータを使用:

BASH
export TRIVY_USERNAME=myuser
export TRIVY_PASSWORD=mypassword
trivy image registry.example.com/my-private-image:latest

問題4:メモリ不足

原因: 大規模なイメージやファイルシステムのスキャン時に多くのメモリを消費する可能性があります。

解決策: コンテナのメモリ制限を増やすか、--lightモードを使用してメモリ使用量を削減:

BASH
trivy image --light python:3.9-slim

まとめ

Trivyは機能が強力で使いやすいオープンソースセキュリティスキャンツールです。その核心的な価値は以下にあります:

  1. 包括性:複数のスキャンターゲットと検出タイプに対応し、コードから本番までの全セキュリティニーズをカバー
  2. 使いやすさ:シンプルなCLIインターフェース、豊富なドキュメントとコミュニティサポート
  3. 統合のしやすさ:主要なCI/CDプラットフォームとKubernetesをネイティブサポート
  4. 優れたパフォーマンス:Go言語実装、起動が速く、リソース消費が少ない

セキュリティを重視する開発チームにとって、Trivyを日々の開発フローに組み込むことは賢明な選択です。早期にセキュリティ問題を発見・修正し、本番環境のセキュリティリスクを低減できます。

次のアクションの推奨:

  1. ローカル開発環境にTrivyをインストールし、よく使うコンテナイメージをスキャンしてみる
  2. TrivyをCI/CDパイプラインに統合し、適切なセキュリティしきい値を設定
  3. スキャン結果を定期的にレビューし、脆弱性修正のワークフローを確立
  4. Trivy Operatorを検討し、Kubernetesクラスターに継続的なセキュリティ監視を追加

Trivyの公式ドキュメントはhttps://trivy.devにあり、GitHubリポジトリはhttps://github.com/aquasecurity/trivyです。問題に遭遇した場合、これらの場所で詳細なドキュメントとコミュニティサポートを見つけることができます。


関連記事: