LIVESENSE ENGINEER BLOG

リブセンスエンジニアの活動や注目していることを発信しています

GitHub Actionsを使ってBrakemanを導入した話

はじめに

普段アルバイト事業部で主にバックエンドの開発をしている@ayumu838です。
最近はStaubのホーロー鍋を買って煮込み料理をよく作って食べています。
食欲の秋なので日々のカロリー摂取量は増加の一途を辿っているのが少し心配です。

ところで皆さんは、自身のRailsプロジェクトに対してセキュリティチェックを行っていますか?
この記事では、GitHub Actionsを使ってRailsプロジェクトに対してBrakemanを導入して、セキュリティチェックを行った時の話です。

Brakemanとは

ソースコードに対してSQLインジェクションやXSSなどの脆弱性がないかを解析してくれるGemです。
人間が目視で確認していても抜け漏れがあったり、新たに報告された脆弱性に気付きにくかったりするので、こういった自動で検知してくれるツールを導入することにしました。

brakemanscanner.org

導入方針

新規に導入するにあたり、以下の方針を立てました。

  • GitHub Actionsを使ってBrakemanを実行する
  • 変更したファイルについて検知された場合はCIを失敗扱いにする
  • CIで失敗した場合、どこに問題があるのかすぐにわかるようにする

新規で導入するにあたり、最初は何箇所か検知されることが予想されます。
そのため、検知してもCIを失敗扱いにはせずにマージはできるようにしたいと考えました。
しかしこの方針だと、検知はされたものの、いつまでも修正されないまま放置されてしまう可能性があります。
そこで、変更したファイルについて検知された場合はCIを失敗扱いにするようにしました。

また、どこに問題があるかをすぐにわかるようにするために、reviewdogを使って、検知された箇所をアノテーションを使いPR内のコメントで表示するようにしました。

導入方法

まずはGemfileに追加し、bundle installを実行します。

group :development, :test do
  :
  gem 'brakeman', require: false
  :
end

次に、GitHub Actionsの設定を行います。

reviewdogのbrakeman actionを参照して、以下のように設定します。

まずは、全てのファイルを検知し、CIを失敗扱いにしないようにします。
その場合の設定は以下の通りです。

- uses: reviewdog/action-brakeman@v2
  with:
    brakeman_version: gemfile # Gemfile.lockにあるバージョンを使う
    filter_mode: nofilter # 全部のファイルを検知する
    level: info
    reporter: github-pr-review
    fail_on_error: false # CIを失敗扱いにしない

その次に、変更したファイルのみ検知を行い、CIを失敗扱いにするようにします。

- uses: reviewdog/action-brakeman@v2
  with:
    brakeman_version: gemfile
    level: warning
    filter_mode: file # 変更したファイルのみ検知する
    reporter: github-pr-review
    fail_on_error: true # CIを失敗扱いにする

最終的に全体の設定は以下のようになりました。

brakeman:
  permissions: # PRのコメントを書くため権限を付与する
      contents: read
      pull-requests: write
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4
    - uses: ruby/setup-ruby@v1
      with:
        ruby-version: ${{ env.RUBY_VERSION }}
        bundler-cache: true
        - uses: reviewdog/action-brakeman@v2
      with:
        brakeman_version: gemfile
        filter_mode: nofilter
        level: info
        reporter: github-pr-review
        fail_on_error: false
    - uses: reviewdog/action-brakeman@v2
      with:
        brakeman_version: gemfile
        level: warning
        filter_mode: file
        reporter: github-pr-review
        fail_on_error: true

こちらの設定で実際に実行すると以下のようにPRのコメントが作成されます。

また自分の変更ではない箇所については、PRのFiles Changedの中のUnchanged files with check annotationsに表示されます。

※ ブログ用に開発者ツールでファイル名を変えています

終わりに

業務後のチャットでセキュリティについて話をしてた時に、ふと思いついたので実際に導入してみました。
GitHub Actionsとreviewdogを使うことによって、PRのコメントに簡単に検知された箇所が表示されるようになるのは便利ですね。