LoginSignup
8
9

More than 3 years have passed since last update.

【Rails】brakeman設定からCircleCIで動かすまで

Last updated at Posted at 2020-03-07

brakemanとは

Ruby on Railsアプリケーション用の静的セキュリティ脆弱性解析スキャナーです。
使うことのデメリットはないので、デフォルトで設定しましょう。

環境

インストール

Gemfile
group :development do
  gem 'brakeman'
end

コマンド実行例

ヘルプ(オプションなどを表示)

$ bundle exec brakeman --help

全てのチェックを行う

$ bundle exec brakeman -A

警告のうち、無視してよい項目を指定するファイルを作成する

コメント(無視してよい理由)も書けるので、きちんと書いておきましょう。
デフォルトでは config/brakeman.ignore にファイルが作られます。

$ bundle exec brakeman -I

// -A と合わせて使う時は -IA とします。
$ bundle exec brakeman -IA

オプション指定例

$ bundle exec brakeman -5 -A -w1

-5 Railsのバージョンを指定。無くても自動検出してくれるので通常は指定不要です。Rails4 や 6 の場合は、それぞれ -4 や -6 を指定します。
-A 全ての項目をチェックします。
-w1 チェックする項目のレベル設定で、1〜3まで指定可能です。1は全警告を出力し、3は重要度の高い警告のみ出力します。

実際の運用(CircleCI上で動かす時)では -A -w1 を指定しています。

CircleCIでbrakemanを動かす

このCircleCIの設定 で以下の箇所を参照してください。

  • run_brakeman
  • brakeman_job

警告例

Missing Encryption - ForceSSL

Confidence: High
Category: Missing Encryption
Check: ForceSSL
Message: The application does not force use of HTTPS: `config.force_ssl` is not enabled
File: config/environments/production.rb
Line: 1

production.rbconfig.force_sslの設定がされていない」という内容ですが、多くの環境ではLoad BalancerでSSLの暗号化/復号化を行うので、そういう場合はignore listに入れましょう。

Unscoped Find - UnscopedFind

Confidence: Weak
Category: Unscoped Find
Check: UnscopedFind
Message: Unscoped call to `Foo#find`
Code: Foo.find(params[:id])
File: app/controllers/foos_controller.rb
Line: 100

brakemanのdocument に説明があります。
以下、翻訳(意訳)です。
偽陽性が高いので、対応の必要がなければignore listに入れましょう。

別のモデルに属するモデルは、通常スコープクエリ(scoped query)を介してアクセスする必要があります。
たとえば、User belongs_to Accountというアソシエーションの場合、これは安全ではない範囲指定された検索である可能性があります。

Account.find(params[:id])

アクションによっては、攻撃者が自分以外のアカウントにアクセスできる可能性があります。
代わりに、現在ログインしているユーザーのスコープを設定する必要があります。

current_user = User.find(session[:user_id])
current_user.accounts.find(params[:id])
8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9