GitHub Actions で Docker イメージの脆弱性チェックを行います。 Trivy アクション が使えるのでとても簡単です。
さらに「脆弱性が検出されたら自動的に Issue を作成する」ということもやってみたいと思います。 こちらはGitHub Script アクションを使うと便利です。
設定内容
1.起動タイミングの指定
on.schedule.cron で起動時間指定ができます。 起動時間はいつものクーロンタブ形式です。
on:
workflow_dispatch:
schedule:
- cron: '0 2 * * 1'
あわせて、任意のタイミングで起動テストをできるようにするために workflow_dispatch も指定しておきます。
2.脆弱性チェック
Dockerイメージ脆弱性チェックのステップは以下になります。
- name: 脆弱性チェック
uses: aquasecurity/trivy-action@master
with:
image-ref: 'docker.io/ototadana/nlp-jp:latest'
format: 'table'
exit-code: '1'
ignore-unfixed: true
vuln-type: 'os,library'
severity: 'CRITICAL,HIGH'
パラメタ等はTrivyアクションの説明 にあるサンプル記述をほぼそのまま持ってきてます。image-ref に指定している Docker イメージは私が何年か前に作ったイメージです。最初に作成したときから全くメンテしていないので、きっと脆弱性がたくさん出てくれるはず…
3.Issue作成
Issue 作成のステップは以下になります。
- name: Issue作成
if: failure()
uses: actions/github-script@v3
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
const { GITHUB_SERVER_URL, GITHUB_REPOSITORY, GITHUB_RUN_ID } = process.env
github.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: 'Dockerイメージに脆弱性が発見されました',
body: `詳細: ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}`,
})
記述ポイント:
- if: failure() で失敗したときだけ起動する
- script 中の github.issues.create() で Issue を作成する
- create の body には、アクション実行結果のURLを指定する。
- URLの組み立てに使用する環境変数は process.env で取得する。
このあたりの詳細については、以下のドキュメントが参考になります。
全体
全体通しで書くとこんな感じです。
on:
workflow_dispatch:
schedule:
- cron: '0 2 * * 1'
jobs:
build:
name: Build
runs-on: ubuntu-18.04
steps:
- name: 脆弱性チェック
uses: aquasecurity/trivy-action@master
with:
image-ref: 'docker.io/ototadana/nlp-jp:latest'
format: 'table'
exit-code: '1'
ignore-unfixed: true
vuln-type: 'os,library'
severity: 'CRITICAL,HIGH'
- name: Issue作成
if: failure()
uses: actions/github-script@v3
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
const { GITHUB_SERVER_URL, GITHUB_REPOSITORY, GITHUB_RUN_ID } = process.env
github.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: 'Dockerイメージに脆弱性が発見されました',
body: `詳細: ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}`,
})
ものすごくあっさりと書けますね。
実行結果
実行してみると、予想通りエラーとなりました。
ちなみに検出された脆弱性の数はこんな感じ… (多すぎでしょ 💦)
docker.io/ototadana/nlp-jp:latest (debian 8.5)
==============================================
Total: 481 (HIGH: 327, CRITICAL: 154)
Issueも無事作成されました。
まとめ
アクションが再利用できるってのは本当に便利ですね!!