Trivy で Docker イメージの脆弱性をチェックする

Today I Learned

Trivy は、Docker コンテナイメージなどの脆弱性を診断できるツールで、次の特徴をもっている。

aquasecurity/trivy

Trivy をインストールする

Mac であれば homebrew を使ってインストールできる。

$ brew install aquasecurity/trivy/trivy

Trivy を実行する

コンテナイメージの脆弱性をチェックするには、次のコマンドを実行する。
Docker daemon を起動する必要はない。

$ trivy image IMAGE
# trivy image node:16-slim

脆弱性の一覧が、テーブル形式で出力される。

node:16-slim (debian 10.12)
===========================
Total: 133 (UNKNOWN: 0, LOW: 84, MEDIUM: 10, HIGH: 29, CRITICAL: 10)

┌───────────────┬──────────────────┬──────────┬─────────────────────────┬───────────────┬──────────────────────────────────────────────────────────────┐
│    Library    │  Vulnerability   │ Severity │    Installed Version    │ Fixed Version │                            Title                             │
├───────────────┼──────────────────┼──────────┼─────────────────────────┼───────────────┼──────────────────────────────────────────────────────────────┤
│ apt           │ CVE-2011-3374    │ LOW      │ 1.8.2.3                 │               │ It was found that apt-key in apt, all versions, do not       │
│               │                  │          │                         │               │ correctly...                                                 │
│               │                  │          │                         │               │ https://avd.aquasec.com/nvd/cve-2011-3374                    │
... 略 ...
└───────────────┴──────────────────┴──────────┴─────────────────────────┴───────────────┴──────────────────────────────────────────────────────────────┘

イメージ名が引数になるので、Dockerfile を対象にする場合は、あらかじめイメージにビルドする必要がある。

$ docker build ./ -t foo
$ trivy image foo

GitHub Actions で Trivy を実行する

Trivy を GitHub Actions で動かすためのアクションも公開されている。
README のサンプルに沿って、リポジトリ内の Dockerfile をチェックするワークフローファイルを追加する。

trivy.yml
name: trivy
on:
  pull_request:
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/[email protected]
      - name: Build an image from Dockerfile
        run: |
          docker build ./ -t my-image
      - name: Run Trivy vulnerability scanner
        uses: aquasecurity/trivy-[email protected] # 記事作成時点での最新版
        with:
          image-ref: 'my-image:latest'
          format: 'table'
          exit-code: '1'
          ignore-unfixed: true # 修正されていない脆弱性は無視する
          vuln-type: 'os,library'
          severity: 'CRITICAL,HIGH'

ワークフローを実行すると、ちゃんと脆弱性を検出できた。

スクリーンショット:GitHub Actions での Trivy の実行結果

検出された脆弱性に対しては、Dockerfile 内で apt-get upgrade してパッケージを最新にしておく。
これで修正されている脆弱性には対応できる。

Dockerfile
FROM node:16-slim
+ RUN apt-get update && apt-get -y upgrade \
+  && apt-get clean \
+  && rm -rf /var/lib/apt/lists/*

# 続く...