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
で問題として検出する脆弱性の深刻度をCRITICAL
、HIGH
に指定している。