【Rails】Brakemanでセキュリティチェックをする
はじめに
お疲れ様です!
おおくまです!
今回は、「【Rails】Brakeman でセキュリティチェックをする」ということで、gemのBrakemanについてまとめてみました!
少しでも皆様の参考になりますと幸いです!
対象読者
注意点
環境
Brakeman とは?
BrakemanはRuby on Railsで書かれているアプリケーションのセキュリティ脆弱性を静的解析するためのgemです!
Brakemanを実行することで、アプリケーションのコードをスキャンし、セキュリティ上の問題がある可能性のある箇所を特定し、警告してくれる、とても便利なツールです!
ターミナルで実行し、都度チェックすることも出来ますが、CircleCIに組み込むことで、チェックし忘れることがなくなるので、非常に便利です!
Brakemanは、様々な観点からセキュリティ脆弱性を解析してくれます!
Brakemanがどんな種類の警告をしてくれるかは以下のサイトをご確認ください!
Unscoped Find
Brakemanが警告してくれるものの1つにUnscoped Findというものがあります!
別のモデルに属するモデルには、通常、スコープ指定されたクエリを介してアクセスする必要があります!
例えば、User
モデルとPost
モデルで次のような関係があるとします!
has_many :posts, dependent: :destroy
belongs_to :user
次のようにPost
モデルにアクセスしている場合、安全ではない検索方法の可能性があります。
Post.find(params[:id])
show
アクションなら大丈夫な場合もあるかもしれませんが、edit
アクションや、update
アクションでは、他人のPost
レコードにアクセスできてしまいます。
それを防ぐために、現在ログインしているユーザーというスコープを設定する必要があります。
current_user.posts.find(params[:id])
このようなスコープの設定し忘れをチェックしてくれるのが、BrakemanのUnscoped Findという項目です!
CircleCI で Unscoped Find を検出する
インストール
group :development do
gem 'brakeman'
end
bundle install
まずは、Brakemanをインストールします。
コマンド例
ヘルプ
bundle exec brakeman --help
全てのチェックを実行
bundle exec brakeman -A
警告をスキップする項目を設定するファイルを作成する
bundle exec brakeman -I
-Aと組み合わせる
bundle exec brakeman -IA
特定のファイルのチェックをスキップする
bundle exec brakeman --skip-files app/controllers/posts_controller.rb
特定のチェック項目のみをチェックする
bundle exec brakeman -t UnscopedFind
CircleCI に導入する
CircleCIのセットアップ方法や、Brakemanの実行方法に関しては、下記の記事を参考にしてください!
さいごに
今回は、BrakemanのUnscopedFindにのみスポットを当てましたが、本来は全てのチェック項目でアプリケーションを解析してもらい、セキュリティがしっかりとしたアプリケーションに修正することが大切です!
1つ1つチェック項目を理解し、意識して今後コードを書いていきたいと思います!
最後まで読んでいただき、ありがとうございました!
参考文献
Discussion