Trivy で Docker イメージの脆弱性をチェックする
Today I Learned
Trivy は、Docker コンテナイメージなどの脆弱性を診断できるツールで、次の特徴をもっている。
- Docker コンテナイメージの OS のパッケージの脆弱性を検出する
- コンテナ上で動くアプリケーションが依存するライブラリの脆弱性を検知する
- コンテナイメージ以外にも、ファイルシステムや AWS アカウントのセキュリティをチェックする
Ref. TrivyでAWSアカウントのセキュリティスキャンができるようになりました
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'
ワークフローを実行すると、ちゃんと脆弱性を検出できた。
検出された脆弱性に対しては、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/*
# 続く...