
TrivyをGitHub Actionとして実行し、Dockerコンテナイメージを脆弱性スキャンします。
GitHub Action のための Trivy
[![GitHub Release][release-img]][release] [![GitHub Marketplace][marketplace-img]][marketplace] [![License][license-img]][license]

name: build on: push: branches: - main pull_request: jobs: build: name: Build runs-on: ubuntu-24.04 steps: - name: Checkout code uses: actions/checkout@v4 - name: Build an image from Dockerfile run: docker build -t docker.io/my-organization/my-app:${{ github.sha }} . - name: Run Trivy vulnerability scanner uses: aquasecurity/[email protected] with: image-ref: 'docker.io/my-organization/my-app:${{ github.sha }}' format: 'table' exit-code: '1' ignore-unfixed: true vuln-type: 'os,library' severity: 'CRITICAL,HIGH'
### CIパイプラインのスキャン(Trivy Config付き)```yaml
name: build
on:
push:
branches:
- main
pull_request:
jobs:
build:
name: Build
runs-on: ubuntu-24.04
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Run Trivy vulnerability scanner in fs mode
uses: aquasecurity/[email protected]
with:
scan-type: 'fs'
scan-ref: '.'
trivy-config: trivy.yaml
この場合、trivy.yaml はリポジトリの一部としてチェックインされているYAML設定です。詳細はTrivyのウェブサイトで入手できますが、例は以下の通りです:```yaml
format: json
exit-code: 1
severity: CRITICAL
secret:
config: config/trivy/secret.yaml
すべてのオプションは `trivy.yaml` ファイルで定義することが可能です。アクションを介して個々のオプションを指定することは、後方互換性を保つために残されています。次に示すものは、設定ファイルでは定義できないため、指定が必要です:
- `scan-ref`: `fs, repo` スキャンを使用する場合。
- `image-ref`: `image` スキャンを使用する場合。
- `scan-type`: スキャンタイプを定義するため(例:`image`, `fs`, `repo` など)。
#### オプションの優先順位
Trivy は [Viper](https://github.com/spf13/viper) を使用しており、オプションの優先順位が定義されています。順序は次の通りです:
- GitHub Action フラグ
- 環境変数
- 設定ファイル
- デフォルト
### キャッシュ
このアクションには、スキャン中にダウンロードされた [脆弱性 DB](https://github.com/aquasecurity/trivy-db)、[Java DB](https://github.com/aquasecurity/trivy-java-db)、[チェックバンドル](https://github.com/aquasecurity/trivy-checks) をキャッシュして復元する機能が組み込まれています。
キャッシュはデフォルトで `$GITHUB_WORKSPACE/.cache/trivy` ディレクトリに保存されます。
キャッシュはスキャン開始前に復元され、スキャン終了後に保存されます。
内部では [actions/cache](https://github.com/actions/cache) を使用していますが、必要な設定は少なくなっています。
キャッシュ入力はオプションであり、デフォルトでキャッシュは有効になっています。
#### キャッシュの無効化
キャッシュを無効にする場合は、`cache` 入力を `false` に設定します。ただし、レート制限の問題を避けるため、有効にしておくことを推奨します。```yaml
- name: Run Trivy scanner without cache
uses: aquasecurity/[email protected]
with:
scan-type: 'fs'
scan-ref: '.'
cache: 'false'
GitHub Actions では、ブランチ間のキャッシュアクセスに関する制限があることに注意してください。
デフォルトでは、ワークフローは現在のブランチまたはデフォルトブランチ(通常は main または master)のいずれかで作成されたキャッシュにアクセスして復元できます。
ブランチ間でキャッシュを共有する必要がある場合は、デフォルトブランチにキャッシュを作成し、現在のブランチで復元する必要があるかもしれません。
ワークフローを最適化するために、cronジョブを設定してデフォルトブランチのキャッシュを定期的に更新することができます。 これにより、後続のスキャンでキャッシュされたDBを再度ダウンロードせずに使用できるようになります。```yaml
name: Update Trivy Cache
on: schedule: - cron: '0 0 * * *' # Run daily at midnight UTC workflow_dispatch: # Allow manual triggering
jobs: update-trivy-db: runs-on: ubuntu-latest steps: - name: Setup oras uses: oras-project/setup-oras@v1
- name: Get current date
id: date
run: echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
- name: Download and extract the vulnerability DB
run: |
mkdir -p $GITHUB_WORKSPACE/.cache/trivy/db
oras pull ghcr.io/aquasecurity/trivy-db:2
tar -xzf db.tar.gz -C $GITHUB_WORKSPACE/.cache/trivy/db
rm db.tar.gz
- name: Download and extract the Java DB
run: |
mkdir -p $GITHUB_WORKSPACE/.cache/trivy/java-db
oras pull ghcr.io/aquasecurity/trivy-java-db:1
tar -xzf javadb.tar.gz -C $GITHUB_WORKSPACE/.cache/trivy/java-db
rm javadb.tar.gz
- name: Cache DBs
uses: actions/cache/save@v4
with:
path: ${{ github.workspace }}/.cache/trivy
key: cache-trivy-${{ steps.date.outputs.date }}
スキャンを実行する際に、ダウンロードプロセスをスキップするために、環境変数 `TRIVY_SKIP_DB_UPDATE` と `TRIVY_SKIP_JAVA_DB_UPDATE` を設定してください。```yaml
- name: Run Trivy scanner without downloading DBs
uses: aquasecurity/[email protected]
with:
scan-type: 'image'
scan-ref: 'myimage'
env:
TRIVY_SKIP_DB_UPDATE: true
TRIVY_SKIP_JAVA_DB_UPDATE: true
デフォルトでは、アクションは最初のステップとしてaquasecurity/setup-trivyを呼び出し、version入力で指定されたtrivyバージョンをインストールします。既に別の方法でtrivyをインストールしている場合(例えば、直接aquasecurity/setup-trivyを呼び出した場合)、またはこのアクションを複数回呼び出す場合は、skip-setup-trivy入力を使用してこのステップを無効にできます。
name: build on: push: branches: - main pull_request: jobs: build: name: Build runs-on: ubuntu-24.04 steps: - name: Checkout code uses: actions/checkout@v4
- name: Manual Trivy Setup
uses: aquasecurity/[email protected]
with:
cache: true
version: v0.72.0
- name: Run Trivy vulnerability scanner in repo mode
uses: aquasecurity/[email protected]
with:
scan-type: 'fs'
ignore-unfixed: true
format: 'sarif'
output: 'trivy-results.sarif'
severity: 'CRITICAL'
skip-setup-trivy: true
#### 複数回Trivy Actionを呼び出す際のセットアップをスキップする
もう一つの一般的なユースケースは、ビルドがこのアクションを複数回呼び出す場合です。その場合、以降の呼び出しでは `skip-setup-trivy` を `true` に設定できます。例:```yaml
name: build
on:
push:
branches:
- main
pull_request:
jobs:
test:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Check out Git repository
uses: actions/checkout@v4
# The first call to the action will invoke setup-trivy and install trivy
- name: Generate Trivy Vulnerability Report
uses: aquasecurity/[email protected]
with:
scan-type: "fs"
output: trivy-report.json
format: json
scan-ref: .
exit-code: 0
- name: Upload Vulnerability Scan Results
uses: actions/upload-artifact@v4
with:
name: trivy-report
path: trivy-report.json
retention-days: 30