世界を旅して暮らしたい放浪エンジニアブログ

Rails開発でDos攻撃を防ぐためにrack-attackを導入しよう

「今更改めて Ruby On Railsの開発を行う 〜 Part10」です。Dos攻撃を防ぐためにrack-attackというgemを導入していきます。

[ 目次 ]

はじめに

こんにちは、香港に住んでいるWEBデベロッパーのなかむ(@nakanakamu0828)です。

この記事は過去に運用していたブログからの移行記事になります。

今回はkickstarter/rack-attackというgemを利用してDos攻撃に対する対策を取りたいと思います。nginxなどWEBサーバー側での対策が必要だと思いますが、Saasのサービスなどを利用している場合、WEBサーバー側で設定することができません。今回はアプリケーションサーバーとなるRails側の対策を行なっていきます。

※ そもそもSaasのサービス側で対策は入っていると思います。

rack-attack インストール

まずはGemfileにrack-attackの設定を追加します

# Gemfile
gem 'rack-attack'

続いてbundle installコマンドを実行し、ライブラリをインストールしてください。

$ bundle install
or
$ bundle install --path=vendor/bundle

※ 環境に合わせてプロジェクト配下にインストールするかどうかでコマンドを選択してください。

セットアップ

config/application.rbでrack-attackを有効化します。
class Application < Rails::Applicationの中に以下の行を追加してください。

# config/application.rb
config.middleware.use Rack::Attack

config/initializers/rack_attack.rbを作成し設定を行います。

# config/initializers/rack_attack.rb

class Rack::Attack
  # your custom configuration...
end

アクセス制限 : ブラックリスト設定

# 1.2.3.4からのアクセスを拒否する
Rack::Attack.blocklist('block 1.2.3.4') do |req|
  '1.2.3.4' == req.ip
end

# BadUAが含まれたUserAgentからのログイン画面アクセスを拒否する
Rack::Attack.blocklist('block bad UA logins') do |req|
  req.path == '/login' && req.post? && req.user_agent == 'BadUA'
end

例えば、管理画面のアクセス制限や対象外の国からのアクセスを防ぐのに利用できます。

アクセス制限 : ホワイトリスト設定

Rack::Attack.safelist('allow from localhost') do |req|
   '127.0.0.1' == req.ip || '::1' == req.ip
end

アクセス制限 : アクセス回数による制御

# 同一IPアドレスからのリクエストを5回/秒に制限
Rack::Attack.throttle('req/ip', limit: 5, period: 1.second) do |req|
  req.ip
end

# 同一IPアドレスからのリクエストを100回/分に制限
Rack::Attack.throttle('req/ip', :limit => 100, :period => 1.minutes) do |req|
  req.ip
end

アタックや過度なクローリングの対策として組み込んでみましょう。
他にも制限された際のレスポンスを変更したり、トラッキングしたりできるようです。実際に利用した確認してみてください。

今回の成果物は こちら になります。
rack-attackの設定部分はコメントアウトしています。利用したい内容に変更してご利用ください。

前のページ

次のページ

Profile

なかむ🇭🇰Webデベロッパー

なかむ🇭🇰Webデベロッパー

香港在住4年目になるWEBエンジニアのなかむです。 現在は、LaravelやRailsを利用したWEB開発を中心にエンジニアをしています。 顧客は全て日本の企業になります。リモート開発にて各企業様の支援を行なっております

プロフィール詳細はこちら

Latest Posts