🔒

【Rails】Brakemanでセキュリティチェックをする

2024/03/16に公開

はじめに

お疲れ様です!
おおくまです!

今回は、「【Rails】Brakeman でセキュリティチェックをする」ということで、gemBrakemanについてまとめてみました!

少しでも皆様の参考になりますと幸いです!

対象読者

注意点

環境

Brakeman とは?

BrakemanRuby on Railsで書かれているアプリケーションのセキュリティ脆弱性静的解析するためのgemです!
Brakemanを実行することで、アプリケーションのコードをスキャンし、セキュリティ上の問題がある可能性のある箇所を特定し、警告してくれる、とても便利なツールです!
ターミナルで実行し、都度チェックすることも出来ますが、CircleCIに組み込むことで、チェックし忘れることがなくなるので、非常に便利です!

Brakemanは、様々な観点からセキュリティ脆弱性を解析してくれます!
Brakemanがどんな種類の警告をしてくれるかは以下のサイトをご確認ください!
https://brakemanscanner.org/docs/warning_types/

Unscoped Find

Brakemanが警告してくれるものの1つにUnscoped Findというものがあります!
別のモデルに属するモデルには、通常、スコープ指定されたクエリを介してアクセスする必要があります!
例えば、UserモデルとPostモデルで次のような関係があるとします!

app/models/user.rb
has_many :posts, dependent: :destroy
app/models/post.rb
belongs_to :user

次のようにPostモデルにアクセスしている場合、安全ではない検索方法の可能性があります。

app/controllers/posts_controller.rb
Post.find(params[:id])

showアクションなら大丈夫な場合もあるかもしれませんが、editアクションや、updateアクションでは、他人のPostレコードにアクセスできてしまいます。
それを防ぐために、現在ログインしているユーザーというスコープを設定する必要があります。

app/controllers/posts_controller.rb
current_user.posts.find(params[:id])

このようなスコープの設定し忘れをチェックしてくれるのが、BrakemanUnscoped Findという項目です!

https://brakemanscanner.org/docs/warning_types/unscoped_find/

CircleCI で Unscoped Find を検出する

インストール

Gemfile
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の実行方法に関しては、下記の記事を参考にしてください!

https://qiita.com/muscle_coding/items/5f1c224d5bc5fe2bf8d9

https://qiita.com/piggydev/items/d3d34139a4f7be1c6e2d

https://qiita.com/piggydev/items/8addbc04982dcd40c076

さいごに

今回は、BrakemanUnscopedFindにのみスポットを当てましたが、本来は全てのチェック項目でアプリケーションを解析してもらい、セキュリティがしっかりとしたアプリケーションに修正することが大切です!
1つ1つチェック項目を理解し、意識して今後コードを書いていきたいと思います!
最後まで読んでいただき、ありがとうございました!

参考文献

https://brakemanscanner.org/

https://github.com/presidentbeef/brakeman

https://qiita.com/momo1010/items/af0023b2d065a82f715d

https://qiita.com/muscle_coding/items/5f1c224d5bc5fe2bf8d9

https://qiita.com/piggydev/items/d3d34139a4f7be1c6e2d

https://qiita.com/piggydev/items/8addbc04982dcd40c076

https://techblog.gmo-ap.jp/2021/12/06/rails-brakeman/

https://opemo.hatenablog.com/entry/2019/03/14/215228

GitHubで編集を提案
株式会社リンクエッジ

Discussion