こんにちは、ZealsでバックエンドエンジニアとしてRailsを使って開発をしている鈴木です。
Zealsでは、セキュリティ対策の一環としてBrakemanを使用しております。
今回はなぜ、Brakemanを導入することに至ったかの理由とBrakemanの導入、実際に活用してうまくいったノウハウを紹介させていただきます。
Railsのセキュリティ対策について調べている方や、Brakemanをどのように活用していくか調べている方の参考になれば幸いです。
そもそもBrakemanとは
Brakemanとはソースコードに、SQLインジェクションなどの脆弱性がないかを解析してくれるライブラリです。 SQLインジェクションなどの有名な脆弱性だけでなく、解析してくれる項目が20種類以上もあります。
これだけ解析をしてくれるため、URLを設定する際に危険なサイトのURLを登録できてしまう脆弱性に気づくことができました。現在のサービスの運営上では問題になっていませんが、将来的に大きなインシデントとなる可能性があります。
もちろん、 コードレビューだけでは気づけない箇所も指摘してくれますので、セキュリティに強いアプリケーションを開発していく上では必須のツールです。
実行についても、以下のようにコマンド一発で解析してくれるため非常に簡単です。
brakeman
実行すると、以下のように解析した結果を表示してくれます。
もちろん、Brakemanは他のGemと同様に簡単にインストールできます。
グローバルにGemをインストールする場合は、以下のコマンドを実行してください。
gem install brakeman
Gemfile にを用いる場合は以下のように記述してください。
group :development do gem 'brakeman', :require => false end
Brakemanを導入した経緯
Zealsはクライアントである企業様の大切な情報を扱うアプリケーションです。 そのため、セキュリティ対策を万全にする必要があります。
今後より多くの機能を追加し事業を成長させる上で、セキュリティ強化は重要なテーマとなります。 そうなった場合に、数万行のコードをエンジニアがすべて解析することは、現実的ではありません。
そういった脆弱性の診断を効率的にするために、今回Brakemanを導入しました。
Brakeman活用までの流れ
1.Brakemanの実行結果をエクスポートし、脆弱性の調査および相談
最初のフローとして、Brakemanを用いた脆弱性の調査、相談をしていきます。
実行結果を見るために、その都度コマンドラインで実行するしていくのは非効率的です。
Brakemanには解析した結果を、HTMLなどにエクスポートしてくれる便利機能があります。
解析結果をエクスポートするためには、以下のコマンドを実行するだけOKです。
brakeman -o brakeman.html
Zealsでは、エクスポートされたHTMLを資料として、脆弱性の調査や相談を社内外のエンジニアと共同で行いました。
脆弱性を調査した箇所の一例としては、冒頭に説明した「URLを設定するところで危険なサイトのURLを登録できてしまう」という脆弱性です。こちらに関しては、コードレビューの時点では気づくことができませんでした。
詳細な内容としては、「アプリケーションの公開範囲が将来toC向けに広がった場合、不正なデータを登録される可能性がある」というものです。
エクスポートしたHTMLをブラウザで開くと、このような画面が表示されます。
ここでの指摘内容の例として、以下のようにBrakemanが指摘してくれています。
- RemoteFollowControllerのcreateメソッドで、ユーザーが入力した値をもとにリダイレクトする可能性がある
- そのため、オープンリダイレクトにつながってしまう可能性がある
2.脆弱性についての調査
Brakemanは、現在は脆弱性でなくとも、将来的に脆弱性となりえる箇所まで指摘してくれます。
脆弱性と指摘されたコードについても、何かの理由があってそのような実装になっている場合もありますので、その背景も調査してドキュメントに残しておくと、後から振り返ることができ非常に便利です。
ドキュメントがあることで第三者への脆弱性報告の資料として使えたり、実装方針について相談する資料にもなり、とても役に立ちました。
3.脆弱性の対応についてチームで方針を決定
調査した脆弱性ごとに対応方法を選択し、修正していく方針となりました。
しかし、すぐに修正可能な方法を採用すると、処理に時間がかかりサービスが使いづらくなる脆弱性対策が存在します。 そのため、「脆弱性対策として処理時間をどれぐらいかけて良いか」をもとに対応方法を考え、チーム内で相談と調査をしていきました。
先に調査を行ったことで、脆弱性対策によって処理が遅くなることが事前にわかり、実装の手戻りを防いだり、工数の見積を正確にした上で対策を進めることができたという点が非常に良かったですね。
4 話した優先度や対応方針に従って修正
チーム内で決定した優先度や対応方針に従って、プロダクトコードに修正を加えます。
Brakemanは、アプリケーション内でのユーザー入力の操作内容をもとに脆弱性を判断しているため、問題ない仕様でも指摘される場合があります。
そのような場合は、Brakemanの指摘を無視するコマンドを実行します。
以下のコマンドを実行すると、警告を無視する設定が可能です。
brakeman -I
上記のコマンドを実行すると、以下の実行画面が表示されます。
最初に、警告を無視するignore設定をするファイル名を何にするか質問されます。
特にこだわりがなければ、デフォルトのままで問題ないのでEnterを押します。
次に、どの対話形式で進めていくかを確認されますが、最初は全件対応で問題ないので1 を入力してください。
さらに、挙げられた脆弱性ごとに、内容を無視するかを確認されます。
主に実行するコマンドは以下のコマンドです。
- n :ignoreをする際、ノートにignoreする理由を書くことが可能です
- iでもignore可能ですが、あとから見返すとignoreした理由が不明になるため、nの使用を推奨します
- s:何もせずにスキップします
- u:ignoreを取り消します
今後やっていきたいこと
CIを使ってBrakemanを実行していきます(Zealsでは、CIにCircle CIを利用しています)。
当然ですが、一度Brakemanの対応が終わった後にも、新しい脆弱性が生まれる可能性があります。
新しい脆弱性が生まれないようにするため、CIツールでBrakemanを実行し継続的に脆弱性を確認したほうが良いでしょう。
Zealsでは今後、初動の脆弱性対応の完了後、 CircleCIを用いたBrakeman運用をしていく予定です。
さいごに
Zealsでは、今後もより良いサービスをお客様に届けるために、有益なツールを使い様々な開発を行ってまいります。
有益なツールを使った開発や、より良い開発方法を一緒に探求していけるエンジニアの方を募集しております。興味があれば、ぜひご応募ください。