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も無事作成されました。

Issue

まとめ

アクションが再利用できるってのは本当に便利ですね!!

かわかみしんいち。島根県津和野町在住のフリーランスエンジニア。複合現実(Mixed Reality)と3DUXでおもちゃを作るのが趣味。 https://github.com/ototadana