scanning-iac-and-images-with-trivy について
CI/CD でイメージ、IaC、依存関係を検査する Trivy のスキャンワークフローを扱うスキルです。開発・セキュリティチーム向けに、SBOM 生成、SARIF 出力、ポリシーに基づくビルド失敗の設定も説明します。
主な機能
- 01イメージと依存関係の脆弱性スキャン
- 02IaC の設定ミス検査
- 03ハードコードされたシークレットとライセンスの検出
- 04SBOM の生成と再スキャン
- 05SARIF 出力とポリシーによるビルド制御
活用シーン
- 01イメージのプッシュ前に CI/CD のセキュリティゲートを設置
- 02デプロイ前の Terraform や Kubernetes 設定監査
- 03SBOM 生成と新たな CVE 公開後の再評価
- 04リポジトリ内のハードコード認証情報の検出
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill scanning-iac-and-images-with-trivyインストール後、Claude Code で/scanning-iac-and-images-with-trivyを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdstandards.mdscripts/agent.py詳細
Trivy で IaC とイメージをスキャンする
概要
Trivy(Aqua Security 提供)は、コンテナイメージ、ファイルシステム、Git リポジトリ、仮想マシンイメージ、Kubernetes クラスター、SBOM ドキュメントなど、幅広い対象の脆弱性(CVE)、設定ミス(IaC)、シークレット、ソフトウェアライセンス、ソフトウェアサプライチェーンの弱点を検出する、包括的なオープンソースのセキュリティスキャナーです。高速で、単一の静的バイナリとして動作し、エージェントが不要で、コードスキャンダッシュボードとの連携に使える機械可読形式(JSON、SARIF、CycloneDX、SPDX)の出力に対応しているため、CI/CD パイプラインの「シフトレフト」ゲートとして広く採用されています。
Trivy には、--scanners で切り替えられる4つの主要なスキャナーがバンドルされています。
- vuln — OS パッケージとプログラミング言語の依存関係の脆弱性検出(Trivy 脆弱性 DB と照合して CVE を判定)。
- misconfig — 組み込みおよびカスタムの Rego ポリシーを使用した、Infrastructure-as-Code と設定の不備の検出(Terraform、CloudFormation、Kubernetes マニフェスト、Dockerfile、Helm)。
- secret — ハードコードされたシークレット/認証情報の検出(API キー、トークン、秘密鍵)。
- license — ソフトウェアライセンスの識別とポリシーの適用。
このスキルでは、CI/CD パイプラインをゲートする Trivy ベースのスキャンワークフローの構築方法を説明します。具体的には、プッシュ前のイメージスキャン、適用前の IaC スキャン、SBOM の生成と再スキャン、ポリシー違反時のビルド失敗を扱います。こうした弱点の検出は、攻撃者がレジストリに悪意のあるイメージや脆弱なイメージを仕込み、環境全体にデプロイさせる MITRE ATT&CK の手法 T1525(内部イメージの埋め込み) への防御に役立ちます。
使用する場面
- イメージのプッシュやインフラストラクチャの適用前に、品質/セキュリティゲートとして脆弱性と設定ミスのスキャンを CI/CD パイプラインに組み込む場合。
- デプロイ前に、レジストリ内のコンテナイメージを監査して既知の CVE を確認する場合。
- Terraform、CloudFormation、Kubernetes、Dockerfile、Helm の IaC にセキュリティ上の設定ミスがないか検証する場合。
- サプライチェーンの透明性を高めるために SBOM(CycloneDX/SPDX)を生成し、後に新たに公開された CVE がないか SBOM を再スキャンする場合。
- 稼働中の Kubernetes クラスターをスキャンし、脆弱なワークロードや設定ミスのある RBAC/リソースを検出する場合。
- 依存関係に対するライセンスコンプライアンスポリシーを適用する場合。
前提条件
- Trivy の脆弱性データベースをダウンロードするためのネットワークアクセスがある Linux/macOS/Windows ホスト、または CI ランナー。
- 名前でローカルイメージをスキャンする場合、またはコンテナ化された Trivy を使用する場合は、Docker(任意)。
- Trivy のインストール(Aqua Security 公式の方法):
# Debian/Ubuntu (APT repository)
sudo apt-get install -y wget gnupg
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | gpg --dearmor | sudo tee /usr/share/keyrings/trivy.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb generic main" | sudo tee /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install -y trivy
# RHEL/CentOS (YUM repository), macOS (Homebrew), and install script
brew install trivy
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sudo sh -s -- -b /usr/local/bin
# Containerized usage (no install)
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy:latest image python:3.10-alpine
# Verify
trivy --version
- エアギャップ環境やレート制限のある環境では、必要に応じて
trivy image --download-db-onlyで DB を、Java/ポリシーバンドルを事前にダウンロードします。
目標
- コンテナイメージの OS とプログラミング言語の脆弱性をスキャンし、重大度のしきい値を超えた場合にビルドを失敗させる。
- IaC(Terraform/Kubernetes/Dockerfile)の設定ミスをスキャンする。
- リポジトリまたはファイルシステム内のハードコードされたシークレットを検出する。
- CycloneDX または SPDX の SBOM を生成し、脆弱性がないか再スキャンする。
- GitHub コードスキャン用の SARIF と、プログラムによるゲート判定用の JSON を出力する。
--exit-codeを使ってポリシーを適用するよう、Trivy を CI/CD パイプラインに組み込む。
MITRE ATT&CK との対応
| 手法 ID | 名前 | 戦術 | 関連性 |
|---|---|---|---|
| T1525 | 内部イメージの埋め込み | 永続化 | Trivy は、脆弱なイメージや悪意のあるイメージ/レイヤー、および埋め込まれたシークレットを、レジストリに仕込まれて稼働中のワークロードに拡散する前に検出します。 |
ワークフロー
1. コンテナイメージの脆弱性をスキャンする
レジストリイメージを脆弱性のみ対象としてスキャンし、重大度が高または重大な検出結果に絞り、修正が提供されていない CVE は無視します。
trivy image \
--scanners vuln \
--severity HIGH,CRITICAL \
--ignore-unfixed \
--format table \
python:3.10-alpine
tarball として保存されたイメージをスキャンします(イメージをビルド済みでも、まだプッシュしていない場合に便利です)。
docker save myorg/app:1.4.0 -o app.tar
trivy image --input app.tar --severity CRITICAL --format json --output app-vulns.json
2. イメージで複数のスキャナーを有効にする
脆弱性、設定ミス、シークレット、ライセンスの各スキャナーを同時に実行します。
trivy image \
--scanners vuln,misconfig,secret,license \
--severity MEDIUM,HIGH,CRITICAL \
myorg/app:1.4.0
イメージに埋め込まれた設定(Dockerfile と同等のビルド履歴と履歴内のシークレット)をスキャンします。
trivy image --image-config-scanners misconfig,secret myorg/app:1.4.0
3. Infrastructure-as-Code(設定ミス)をスキャンする
config ターゲットを使って、Terraform/Kubernetes/Dockerfile/Helm/CloudFormation の設定ミスをディレクトリ内でスキャンします。
# Scan a Terraform / IaC directory
trivy config \
--severity HIGH,CRITICAL \
--format table \
./infra
# Scan with custom Rego policies and a specific policy namespace
trivy config \
--config-policy ./policies \
--policy-namespaces user \
./infra
または、設定ミススキャナーを明示的に指定して、fs(ファイルシステム)ターゲットを使用します。
trivy fs --scanners misconfig,secret --severity HIGH,CRITICAL ./infra
4. リポジトリをスキャンしてシークレットを検出する
ローカルの作業ツリー(またはリモートリポジトリ)をスキャンし、ロックファイル内の脆弱性とハードコードされたシークレットを検出します。
# Local filesystem (dependencies + secrets)
trivy fs --scanners vuln,secret --severity HIGH,CRITICAL .
# Remote Git repository
trivy repository --scanners vuln,secret https://github.com/myorg/myrepo
5. SBOM を生成して再スキャンする
イメージから CycloneDX SBOM を生成し、その後 SBOM 自体をスキャンして脆弱性を検出します(保存した SBOM は、新しい CVE が公開された際に再評価できます)。
# Generate CycloneDX SBOM
trivy image --format cyclonedx --output sbom.cdx.json myorg/app:1.4.0
# Generate SPDX SBOM
trivy image --format spdx-json --output sbom.spdx.json myorg/app:1.4.0
# Re-scan the SBOM for vulnerabilities later
trivy sbom --severity HIGH,CRITICAL sbom.cdx.json
6. コードスキャンダッシュボード向けに SARIF を出力する
GitHub Advanced Security/コードスキャンへの取り込み用に SARIF を生成します。
trivy image \
--format sarif \
--output trivy-results.sarif \
--severity HIGH,CRITICAL \
myorg/app:1.4.0
7. 終了コードで CI/CD パイプラインを制御する
選択した重要度以上の検出結果がある場合にパイプラインのステップが失敗するよう、--exit-code 1 を使用します。「すべてをレポートする」実行(終了コード 0)と「適用する」実行(終了コード 1)を分けます。
# 1) Informational report (never fails the build)
trivy image --severity LOW,MEDIUM,HIGH,CRITICAL --exit-code 0 --format table myorg/app:1.4.0
# 2) Enforcement gate (fails build on HIGH/CRITICAL with a fix available)
trivy image \
--severity HIGH,CRITICAL \
--ignore-unfixed \
--exit-code 1 \
--format json --output gate.json \
myorg/app:1.4.0
公式アクションを使用する GitHub Actions のステップ例:
- name: Run Trivy image scan (gate)
uses: aquasecurity/trivy-action@master
with:
image-ref: 'myorg/app:1.4.0'
format: 'sarif'
output: 'trivy-results.sarif'
severity: 'HIGH,CRITICAL'
ignore-unfixed: true
exit-code: '1'
8. 誤検知と DB を管理する
.trivyignore ファイルを使って許容済みのリスクに該当する検出結果を抑制し、DB を最新の状態に保ちます。
# .trivyignore — one CVE/AVD/secret rule ID per line
echo "CVE-2023-12345" >> .trivyignore
echo "AVD-AWS-0089" >> .trivyignore
# Refresh DBs explicitly (useful for caching layers in CI)
trivy image --download-db-only
trivy image --download-java-db-only
# Scan a Kubernetes cluster (summary report)
trivy k8s --report summary --severity HIGH,CRITICAL cluster
ツールとリソース
| ツール/リソース | 目的 | リンク |
|---|---|---|
| Trivy | コアスキャナー CLI | https://github.com/aquasecurity/trivy |
| Trivy Documentation | 公式ドキュメント(ターゲット、スキャナー、フラグ) | https://trivy.dev/latest/docs/ |
| trivy-action | GitHub Actions との連携 | https://github.com/aquasecurity/trivy-action |
| Trivy Operator | クラスター内 Kubernetes の継続的なスキャン | https://github.com/aquasecurity/trivy-operator |
| Trivy vulnerability DB | OSS 脆弱性データソース | https://github.com/aquasecurity/trivy-db |
| CycloneDX | Trivy が出力する SBOM 標準 | https://cyclonedx.org/ |
検証基準
- Trivy がインストールされ、
trivy --versionで有効なバージョンが表示される。 - 重要度フィルターを適用してコンテナイメージの脆弱性をスキャンする。
- 複数のスキャナー(vuln、misconfig、secret、license)を使ってイメージをスキャンする。
-
trivy configで IaC ディレクトリをスキャンし、設定ミスを確認する。 - リポジトリに対してシークレットスキャンを実行する。
- CycloneDX/SPDX SBOM を生成し、
trivy sbomで再スキャンして成功する。 - コードスキャンダッシュボード向けに SARIF 出力を生成する。
-
--exit-code 1により、HIGH/CRITICAL の検出結果がある場合に CI/CD ゲートでビルドが失敗する。 - 許容済みのリスクに該当する検出結果について、根拠を記録したうえで
.trivyignoreを設定する。