
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
endproductionだけ読み込む場合は 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は違うので注意!!)