LoginSignup
1
1

More than 3 years have passed since last update.

【Rails】rack-attack gemでアクセス制限。CSSやJSなどの静的ファイルへのアクセスはカウントしない方法

Last updated at Posted at 2020-03-04

概要

  • rack-attack gemを使ってみた記事

前提

  • こちらの記事を存分に参考にしています。
    (本記事の途中までほぼ写経ですorz)

背景

  • CSSやJSなどの静的ファイルへのアクセスをカウントしない方法を探して時間がかかったので、記事にしました。

rack-attackの設定の流れ

gemインストール

Gemfileに下記を追加する

# DoS攻撃対策
gem 'rack-attack'

bundle installを実施する

bundle install

設定

起動時に読み込む

  • developmentとproductionの両方で読み込む
module YourApp
  class Application < Rails::Application
    省略
    # security
    config.middleware.use Rack::Attack
  end
end

rack-attackの設定ファイル

config/initializers/rack-attack.rbファイルを作成して編集します。
設定は、同一IPから1分間あたりに60回のリクエストがあった場合は、そのIPからのアクセスを制限するという設定です。

class Rack::Attack
  throttle('req/ip', limit: 60, period: 1.minutes do |req|
    req.ip
  end
end

確認

rails dev:cache

こちらのコマンドを入力することで、tmp/caching-dev.txtが作成されます。

このファイルが存在すると、config/environments/development.rbconfig.action_controller.perform_caching = trueになり、キャッシュが有効になってリクエスト元のipが記録され、rack-attackが機能するようになります。

なお終了するときは、再度rails dev:cacheを実行してください。

動作テスト

development環境でrailsアプリを起動して、任意のページで再読み込みを(command+r)を60回してください。
そうして、画面にRetry laterと表示されると、rack-attackの設定は成功です。

静的ファイルをリクエスト制限に含めない方法

CSSやJS、画像などのassetsをリクエスト制限に含めないように設定しないと、rack-attackでアクセス数としてカウントされ、期待より早くthrottleの遮断が行われてしまいます。

設定自体は簡単で以下のように追記するだけで可能です。

class Rack::Attack
  throttle('req/ip', limit: 60, period: 1.minutes) do |req|
    req.ip unless req.path.start_with?('/assets') # 追記
  end
end
1
1
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
1
1