どうもこんにちは
シタテルでエンジニアをしている朝野です。
主に、セキュリティーや開発インフラを担当しています。
シタテルではRuby on Railsを使っているプロダクトがいくつかあるのですが、そこでのセキュリティ施策の1つとしてBrakemanというGemを使っています。
セキュリティチェック用のGemとしては有名どころですが、理解の確認も兼ねてまとめてみました。
Brakemanとは
Railsのソースコードを解析し、SQLインジェクションやXSS等の脆弱性になりかねない危険なコードを見つけ出すGemです。
brakeman | RubyGems.org | your community gem host
Brakeman — Rails Security Scanner
インストール
Gemなので、
$ gem install brakeman
とするか、Gemfileに
gem ‘brakeman’, require: false
と書いて bundle install
すればOKです。
実行
$ bundle exec brakeman
で実行でき、ソースコード内を確認してくれます。
オプションもいろいろあるのですが、現在は
-A
すべての種類の脆弱性を検査
-w1
すべてのレベルの脆弱性を検査
-z
脆弱性が見つかった場合の終了コードを0以外に
というオプションを使っています。
-A
と -w1
はセキュリティのため、 -z
はCircleCIのためです。
脆弱性が見つかった時ビルド失敗になり、開発中のブランチで脆弱性が見つかっていたらmergeできなくなるわけです。
ちなみにその他オプションはこちら。
ただ毎回オプションを打つのも面倒なので、設定ファイルにまとめてしまうと便利です。-C
をつけて実行すれば、同時につけたオプションに相当する設定ファイルの内容が出力されます。
$ bundle exec brakeman -A -w1 -z -C
---
:run_all_checks: true
:min_confidence: 2
:exit_on_warn: true
これを config/brakeman.yml に保存しておけば自動でその設定が読み込まれるので、オプションをつけなくてよくなります。
ちょっと楽ですね。
警告に対応しないとき
Brakemanを実行して出力された脆弱性を修正していくことになります。
ただ、修正のしようがないときやそのままでも問題ないときというのもたまにあります。
そんな場合は safe_methods と brakeman.ignore の設定が役に立ちます。
safe_methods は実行時のオプションの一つで、名指ししたメソッドは安全だからチェックしなくていいよ!とするものです。
例えば、config/brakeman.yml に
:safe_methods:
- :display_hoge
- :change_fuga
と書けば、 display_hoge
と change_fuga
のメソッド内はスキャンされません。
brakeman.ignore は無視する警告のリストです。
brakemanは
$ brakeman -I
と -I
オプションで実行すると対話モードになるのですが、
------------------------------
Actions:
i - Add warning to ignore list
n - Add warning to ignore list and add note
s - Skip this warning (will remain ignored or shown)
u - Remove this warning from ignore list
a - Ignore this warning and all remaining warnings
k - Skip this warning and all remaining warnings
q - Quit, do not update ignored warnings
? - Display this help
-------- 1/1 -----------------
Confidence: Weak
Category: Cross-Site Scripting
Message: Unescaped model attribute
Code: display_hoge(Item.hoge)
File: app/views/some/path/edit.html.haml
Line: 19
Action: (i, n, k, u, a, s, q, ?)
というふうに見つかった脆弱性をどうするか聞いてきます。
ここで i
を入力すればその脆弱性を無視リスト(デフォルトでは config/brakeman.ignore
)に追加できます。
無視リストに入れられた警告は、以降出力されなくなります。
このように不要な警告をスルーする手もちゃんとあるのがbrakemanのよくできているところですが、うっかり対象から外した部分に危険なコードを書き足してしまわないように注意しなければいけないですね。
と、ざっとまとめてみました。
最初からセキュリティを意識してコーディングするのがまずは重要ですが、このようなチェックがあると安心がアップしますね。