bundler-auditとGitHub Actionsを使ってRubyのgemの脆弱性を定期チェックする

2024/04/24に公開

こんにちは、PharmaX エンジニアの尾崎(@FooOzaki)です。

本記事ではRubyのgemの脆弱性をbundler-auditを利用してチェックする手法をご紹介します。
また、併せてGitHub Actionsでスケジュール実行する方法もご紹介します。

bundler-auditについて

bundler-auditはGemfile.lockを脆弱性データベースと照合し、gemに既知の脆弱性が見つかると警告をしてくれます。

具体的には以下のような形で脆弱性があるgemをリストアップしてくれます。

$ bundle exec bundler-audit
Name: gem_file_name
Version: x.x.x
Advisory: CVE-2024-xxxx
Criticality: Medium
URL: https://xxxxxxxx
Title: xxxxxx
Solution: upgrade to >= x.x.x

bundler-auditの導入とローカルでの実行

導入自体はgemfileに以下のように追記して bundle install すればOKです。

group :development do
  gem 'bundler-audit'
end

ローカルで実行するときは以下のコマンドで実行できます。脆弱性があった場合は exit code 1 で終了します。
bundle-audit check --update

基本はこれだけで事足りると思いますが、詳細はリポジトリを確認いただければと思います。
https://github.com/rubysec/bundler-audit

GitHub Actionsでの実行

続いてbundle auditコマンドをGitHub Actions上で実行してみましょう。

はじめにGitHub Actionsのymlファイルは以下の通りです。
.github/workflows/schedule-audit.yml

name: schedule-audit
on:
  schedule:
  - cron: '00 0 * * *'
jobs:
  audit:
    container:
      image: ruby:3.3.0
    timeout-minutes: 10
    name: verify bundle libraries
    runs-on: ubuntu-latest
    steps:
      - name: develop checkout
        uses: actions/checkout@v4
        with: 
          ref: develop
      - name: Install bundler-audit
        run: gem install bundler-audit
      - name: Bundler Audit
        run: bundle audit check --update

実行のトリガーは以下のように設定していますが、タイムゾーンがUTCなのでこの設定だと毎朝9時に実行する設定となります。

on:
  schedule:
  - cron: '00 0 * * *'

続いて、実行環境についてですが実際のアプリの実行環境で実行しても良いと思いますが、rubyの実行環境があれば動きます。

jobs:
  audit:
    container:
      image: ruby:3.3.0
    timeout-minutes: 10
    name: verify bundle libraries
    runs-on: ubuntu-latest

特にブランチを指定しなければGitHubのデフォルトブランチで動くので、bundler-auditを動かすブランチを指定したい場合は以下の形で指定してあげてください。

    steps:
      - name: develop checkout
        uses: actions/checkout@v4
        with: 
          ref: develop

最後に実行ステップですが、bundler-auditをインストールした上でcheckコマンドを実行します。
脆弱性があった場合は exit code 1 で終了するため、GitHub ActionsもFailして検知が可能となります。

    steps:
      - name: Install bundler-audit
        run: gem install bundler-audit
      - name: Bundler Audit
        run: bundle audit check --update

脆弱性を無視する方法

.bundler-audit.yml ファイルで無視したい脆弱性を指定することで無視することが可能です。
特に影響のない脆弱性や依存関係などですぐにあげれない場合はこちらの方法で無視していただければと思います。

ignore:
  - CVE-2024-xxx
  - CVE-2024-yyy

終わりに

今回はbundler-auditとGitHub Actionsを使ってRubyのgemの脆弱性を定期チェックするを紹介しました。参考になれば幸いです!

PharmaX では、様々なバックグラウンドを持つエンジニアをお待ちしております。
もし、興味をお持ちの場合は、私のXアカウント(@FooOzaki)にお気軽にメッセージいただけますと幸いです!

PharmaXテックブログ

Discussion