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/checkout@v3
      - name: Build an image from Dockerfile
        run: |
          docker build ./ -t my-image
      - name: Run Trivy vulnerability scanner
        uses: aquasecurity/trivy-action@v0.7.1 # 記事作成時点での最新版
        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/*

# 続く...