Trivyとは

Trivy は Dockerイメージの脆弱性を診断するツール。

オープンソースで公開されており、静的にチェックする。
シングルバイナリで配布されているので、バイナリをダウンロードすればすぐに使える。

Trivyはイメージの脆弱性を診断するだけでなく、レジストリやオーケストレータなど、その他のコンテナ環境におけるセキュリティ診断も行なえる。

本記事ではイメージのみの脆弱性診断について記載する。

Trivyの使い方

インストール

Macの場合はHomebrewでインストールできる。

$ brew install trivy

その他のOSの場合は Installing Trivy を参照。
CentOSの場合はyumリポジトリが用意されているなど、各種OSごとにパッケージが提供されている。

スキャンする

例として簡単なDockerfileを作成する。

FROM public.ecr.aws/amazonlinux/amazonlinux:2023.2.20231011.0

Dockerfileからイメージをビルドする場合はdocker buildコマンドの-tオプションでイメージ名を指定する。

$ docker build -t trivy-test_linux:latest .

Dockerイメージのセキュリティスキャンを行なうには、trivyコマンドのサブコマンドimageに、スキャンしたいイメージの名前を渡して実行する。

$ trivy image イメージ名

Dockerイメージ名を探すにはdocker imagesコマンドを使う。

$ docker images
REPOSITORY          TAG       IMAGE ID       CREATED         SIZE
trivy-test_linux    latest    2a6f7159afcb   5 days ago      179MB

REPOSITORYとTAGを組み合わせてイメージ名を指定する。

$ trivy image trivy-test_linux:latest

出力結果

$ trivy image dockle-test_linux:latest
2023-10-22T23:14:04.166+0900    INFO    Need to update DB
2023-10-22T23:14:04.166+0900    INFO    DB Repository: ghcr.io/aquasecurity/trivy-db
2023-10-22T23:14:04.166+0900    INFO    Downloading DB...
40.64 MiB / 40.64 MiB [------------------------------------------------------------------------------------------------] 100.00% 8.03 MiB p/s 5.3s
2023-10-22T23:14:10.568+0900    INFO    Vulnerability scanning is enabled
2023-10-22T23:14:10.568+0900    INFO    Secret scanning is enabled
2023-10-22T23:14:10.568+0900    INFO    If your scanning is slow, please try '--scanners vuln' to disable secret scanning
2023-10-22T23:14:10.568+0900    INFO    Please see also https://aquasecurity.github.io/trivy/v0.46/docs/scanner/secret/#recommendation for faster secret detection
2023-10-22T23:14:14.275+0900    INFO    Detected OS: amazon
2023-10-22T23:14:14.276+0900    INFO    Detecting Amazon Linux vulnerabilities...
2023-10-22T23:14:14.277+0900    INFO    Number of language-specific files: 0

dockle-test_linux:latest (amazon 2023 (Amazon Linux))

Total: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 1, CRITICAL: 0)

┌────────────┬────────────────┬──────────┬────────┬───────────────────────┬───────────────────────┬──────────────────────────────────────────────────────────────┐
│  Library   │ Vulnerability  │ Severity │ Status │   Installed Version   │     Fixed Version     │                            Title                             │
├────────────┼────────────────┼──────────┼────────┼───────────────────────┼───────────────────────┼──────────────────────────────────────────────────────────────┤
│ libnghttp2 │ CVE-2023-44487 │ HIGH     │ fixed  │ 1.55.1-1.amzn2023.0.4 │ 1.57.0-1.amzn2023.0.1 │ Multiple HTTP/2 enabled web servers are vulnerable to a DDoS │
│            │                │          │        │                       │                       │ attack (Rapid...                                             │
│            │                │          │        │                       │                       │ https://avd.aquasec.com/nvd/cve-2023-44487                   │
└────────────┴────────────────┴──────────┴────────┴───────────────────────┴───────────────────────┴──────────────────────────────────────────────────────────────┘

CVE-2023-44487が検出された。libnghttp2パッケージを更新する必要があると分かる。

除外設定

なんらかの理由で除外したい場合は.trivyignoreファイルを作成し、除外したいCVEを記載する。

CVE-2023-44487

.trivyignoreファイルを配置したディレクトリでtrivyコマンドを実行する。

$ trivy image trivy-test_linux:latest
2023-10-22T23:20:30.014+0900    INFO    Vulnerability scanning is enabled
2023-10-22T23:20:30.014+0900    INFO    Secret scanning is enabled
2023-10-22T23:20:30.014+0900    INFO    If your scanning is slow, please try '--scanners vuln' to disable secret scanning
2023-10-22T23:20:30.014+0900    INFO    Please see also https://aquasecurity.github.io/trivy/v0.46/docs/scanner/secret/#recommendation for faster secret detection
2023-10-22T23:20:34.248+0900    INFO    Detected OS: amazon
2023-10-22T23:20:34.248+0900    INFO    Detecting Amazon Linux vulnerabilities...
2023-10-22T23:20:34.252+0900    INFO    Number of language-specific files: 0

trivy-test_linux:latest (amazon 2023 (Amazon Linux))

Total: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)

上記では.trivyignoreに記載したCVE-2023-44487が除外されている。

GitHub ActionsでTrivyを使う

GitHub ActionsでTrivyを使うには aquasecurity/trivy-action を利用するとよい。

ワークフローの設定は以下のようになる。

name: trivy

on:
  pull_request:
  push:
    branches:
      - master

jobs:
  trivy-test:
    runs-on: ubuntu-latest
    steps:
      # リポジトリをチェックアウト
      - name: Checkout code
        uses: actions/checkout@v4
      # Dockerイメージをビルド
      - name: Build an image from Dockerfile
        run: |
          cd trivy-test 
          docker build -t trivy-test:${{ github.sha }} .          
      # Trivyでスキャン
      - name: Run Trivy vulnerability scanner
        uses: aquasecurity/trivy-action@0.12.0
        with:
          image-ref: 'trivy-test:${{ github.sha }}'
          format: 'table'
          exit-code: '1'
          ignore-unfixed: true
          vuln-type: 'os'
          scanners: 'vuln'
          severity: 'CRITICAL,HIGH'

exit-codeで問題検出時の終了ステータスコードを1に指定しているので、問題が検出された場合はビルドを失敗させられる。
またseverityで問題として検出する脆弱性の深刻度をCRITICALHIGHに指定している。