概要
- 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.rb
のconfig.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