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/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'
ワークフローを実行すると、ちゃんと脆弱性を検出できた。
検出された脆弱性に対しては、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/*
# 続く...