updated on 2019-03-21
Gemfileに下記を追加する
# for security gem 'rack-attack' # production環境だけで良い人はこれ # group :production do # gem 'rack-attack' # end
bundle install実施
bundle install
config/application.rb
module YourApp
class Application < Rails::Application
省略
# security
config.middleware.use Rack::Attack
end
end
productionだけ読み込む場合は config/environments/production.rb
Rails.application.configure do config.middleware.use Rack::Attack end
config/initializers/rack-attack.rb
を設定ファイルとして作成する
class Rack::Attack # 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.blocklist('自分以外は認証画面拒否') do |req| req.path == '/login_path' end # ホワイトリスト設定 Rack::Attack.safelist('ローカルホストと自分を許可') do |req| '127.0.0.1' == req.ip || '::1' == req.ip || ENV["ip_address"] == req.ip end # 同一IPアドレスからのリクエストを300回/分に制限 Rack::Attack.throttle('req/ip', limit: 300, period: 5.minutes) do |req| req.ip end # アタックや過度なクローリングの対策になる https://blog.nakamu.life/posts/rails-dos-rack-attack/ end
ちなみにgemなしでも実装してみます。
articles_controller
class ArticlesController < ApplicationController before_action :restrict_remote_ip, only: [:edit, :create] ... PERMIT_ADDRESSES = ['127.0.0.1', '::1', ENV["ip_address"]].freeze def restrict_remote_ip # ローカルか自分のipアドレス unless PERMIT_ADDRESSES.include?(request.remote_ip) render text: 'サービスが見つかりません', status: 503 end end
:edit, :createアクションを自分以外ブロックする機能が実装できました。めでたしめでたし。
ちなみに...
や
でグローバルIPを調べて、そのネットワークでアクセス制限をかけることができます(プライベートIPとグローバル IPは違うので注意!!)