最終ゴール
github actionでtrivyにより脆弱性診断を行い、脆弱性への対応を恒常化させる。
(脆弱性診断をCIに組み込むのは最悪リリースブロッキングになる可能性もあるので、チームの状況によって適宜アレンジして取り込んでください。)
trivyとは
脆弱性の検知をしてくれるOSS
Docker imageに対しても診断可能でOS/libレベルのチェックを行ってくれる
CIへの組み込み
こちらのライブラリでgithub actionが提供いただいているのでこちらを活用する
Docker imageのbuildにはこちらを利用
↓ミニマムのサンプル
name: Scan with Trivity
on: push
jobs:
trivy:
runs-on: ubuntu-latest
env:
ACTIONS_RUNTIME_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- uses: actions/checkout@v4
- uses: docker/setup-buildx-action@v3
- uses: docker/build-push-action@v6
with:
push: false
load: true
tags: test-${{ github.sha }}
cache-from: type=gha
cache-to: type=gha,mode=max
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
with:
image-ref: "test-${{ github.sha }}"
exit-code: "1"
ignore-unfixed: true
severity: "CRITICAL,HIGH"
各ステップの説明
docker/setup-buildx-action
docker buildxを利用することでキャッシュを使えるようにする
docker/build-push-action
- push: false
- Docker registryへのpushは不要(ローカルスキャンのため)なのでfalseを指定
- load: true
- ローカルのDockerにimageをロードする(ローカルでDocker imageを参照できるようにする)
- tags
- 一意の名前を付与する(後述のtrivityで指定するimageと合わせる)
- cache-from / cache-to
- キャッシュを行うための設定
aquasecurity/trivy-action
- image-ref
- docker/build-push-actionのtagsと名前を合わせる
- exit-code: 1
- 脆弱性が発生した場合はエラーにする(Securityとして登録するだけなどの場合はなしでOK)
- デフォルト0で脆弱性が出てもCIが通ってしまうので注意(用途に合わせる)
- ignore-unfixed: true
- 修正が出ていないものはスキップする
- severity: "CRITICAL,HIGH"
- 好みに合わせてエラーにする脆弱性レベルを指定
つまづきポイント
ライブラリで修正パッチがまだ出ていないがCIがずっと落ちてしまう
ignore-unfixed
を指定することで修正パッチが出ていない問題はスキップできる(根本的な解決ではないのでCIとして継続チェックを入れるのであれば必須になりそう)
RATELIMIT問題への対応
FATAL Fatal error init error: DB error: failed to download vulnerability DB: database download error: oci download error: failed to fetch the layer: GET https://ghcr.io/v2/aquasecurity/trivy-db/blobs/sha256:11c57f2012b2ac112256f94aa404e1feb7e1b7a5787598946b87149115cdb43d: TOOMANYREQUESTS: retry-after:
脆弱性のマスターデータ取得の時にratelimitに引っかかる問題が発生する
↓こちらのissueに回避方が書いてあり
envで ACTIONS_RUNTIME_TOKEN
にGITHUB TOKENを入れると回避できるらしい(今の所発生していない)