Rack::Access で IP アドレス制限

Rails アプリケーションで IP アドレス制限が必要になった際には、基本的に上位のリバースプロキシ(Apache とか Nginx とか)で行うことが多いと思いますが、一方で Rails 本体で制限をかけなければならないこともあります(Heroku だとか)

でもそれを Rails の controller 層とかで実装するのはちょっと嫌ですよね。特にビジネスロジックではないことが多いですし。

というわけで、IP アドレス制限を Rack Middleware 層で実装した Rack::Access というモジュールを使ってみました。これは GitHub - rack/rack-contrib: Contributed Rack Middleware and Utilities に含まれています。使い方は Gemfile に書いて bundle して config/application.rb に設定を書いて完了です。

Gemfile:

gem 'rack-contrib', :require => 'rack/contrib'

config/application.rb

config.middleware.use "Rack::Access", '/' => [ '127.0.0.1',  '192.168.1.0/24' ]

これで 127.0.0.1 あるいは 192.168.1.0/24 以外からのアクセスには Forbidden を返すようになります。

当然、実行環境によって異なる制限をかけることになると思います。それぞれ environments/ 以下に書いてもいいと思うのですが、面倒なので自分は YAML に書きました。

config/application.rb

config.middleware.use "Rack::Access", YAML.load(open(Rails.root + "config/access.yml", &:read))[Rails.env]

config/access.yml

localnet: &localnet
  /:
    - 127.0.0.1
    - 192.168.1.0/24

development:
  <<: *localnet

test:
  <<: *localnet

production
  /:
    - xxx.xxx.xxx.xxx # 公開対象アドレス

動的に制限を変更するという使い方をしたければもう少し複雑にしなければいけませんが(一応できるはず)、イントラ向けアプリなどではこの程度で十分ではないでしょうか。

もちろん Rack middleware なので、 Rails 以外のアプリケーションでも同様に使えるのがいいですね。