rack-attackでRailsアプリにアクセス制限を設ける

はじめに

アプリのリリースに対して、決して避けられないのが敵意のあるアタックです。これを遮断することを目的としたgemがrack-attackでございます。

この手の作業はより低いレイヤーで専用のミドルウェアを利用して行う場合が多いと思います。ですが、herokuなどのPaaS環境下では、管理対象のレイヤーを増やしても大変ですから、こちらのgemでサクッと解決するのも素敵だと思います。

実装

rack-attackをインストールします。

gem install rack-attack

config/application.rbの設定でmiddlewareにrack-attackを登録します。

config.middleware.use Rack::Attack

最後にconfig/initializers/rack-attack.rbへ設定を書きます。rack-attackの動作については、基本的にこちらのファイルに記述します。

rack-attackには以下の使い方(メソッド)が用意されています。

  • safelist
  • blocklist
  • throttle
  • track

safelistは特定の通信の許可を記述します。blocklistはsafelistの逆です。throttleは一定量の通信が発生した場合のみ、対象の通信を制限します。また、trackはアクセスに対する走査と通知(ログ出力など)に使われます。

管理者用のログインについては自社からのみアクセスを許容しつつ、ユーザ用のログインに対しては一定以上のログイン試行が行われた場合、所定のアクセス禁止時間を設ける、といった内容になります。

上記の処理にあたり、アクセスに関するデータはデフォルトでRails.cache(ローカルなメモリ)に保存されます。こちらは設定を変更することで、外部のredisやmemcachedに変更することが可能となります。

Rack::Attack.cache.store = ActiveSupport::Cache::RedisStore.new('redis://xxx.xxx.xxx.xxx:6379/0/cache')

この手の処理をRubyのコードを利用して柔軟に記述できる点が素晴らしいと思います。

Rails

Posted by poison