Dragon Arrow written by Tatsuya Nakaji, all rights reserved animated-dragon-image-0164

rails5.2 'rack-attack' で セキュリティ対策

updated on 2019-03-21

イメージ

gem rack-attack[セキュリティ対策]を実装


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


rack-attackの設定ファイル

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アドレス確認】

や 

CMAN:【使用中のIPアドレス確認】

でグローバルIPを調べて、そのネットワークでアクセス制限をかけることができます(プライベートIPとグローバル IPは違うので注意!!)