inSmartBank

AI家計簿アプリ「ワンバンク」を開発・運営する株式会社スマートバンクの Tech Blog です。より幅広いテーマはnoteで発信中です https://note.com/smartbankinc

action_ip_filter gemをリリースしました

こんにちは。スマートバンクでソフトウェアエンジニアをしております @moznion です。
表題の通り、action_ip_filterというgemを公開いたしましたのでそのご報告です。

これは何 / モチベーション

Ruby on RailsのController内の個別のactionに対し、アクセス元IPアドレスによるアクセス制限を課すことができるgemです。

例えば以下のように使うことができます:

class AdminController < ApplicationController
  include ActionIpFilter::IpFilterable

  filter_ip "192.0.2.0/24", "198.51.100.1", only: [:index, :show]

  def index
    # `192.0.2.0/24` あるいは `198.51.100.1` からのアクセスのみ許可する
  end

  def show
    # #indexと同様の制限が適用される
  end

  def public_action
    # 制限無し
  end
end

ActionIpFilter::IpFilterable を include すると filter_ip というメソッドが生えてくるので、そこに「許可するIPアドレス(複数指定可能)」を指定すると所望の制限を適用することが可能です (そのほかにもオプションが存在するのでREADMEを参照ください)。

こうした、「エンドポイントに対するIPアドレス制限」を実現する際に真っ先に選択肢に挙がるのは rack-attack であると思うのですが、rack-attackはrack middlewareであるという特性上すべてのリクエストに対してアクセス制限のロジックを適用します。
そのため「全体のうち一部のエンドポイントにだけ制限を適用したい」というようなユースケースでは、本来処理する必要の無い大半のエンドポイントへのアクセスであっても余計な制御ロジックが実行されてしまうためオーバーヘッドが気になるということがありました *1
そうした背景からaction_ip_filterではrack middlewareではなくRailsのconcernとして実装するというアプローチを採用しました。こうすることにより、実際にアクセス制限を課したいエンドポイントへのアクセスが発生した時にだけ制限ロジックが実行されるようになるため、より効率的に処理することが可能となります。

また、コントローラー内に宣言的な形でIPアドレス制限を記述できるのでわかりやすいという利点もあるかと思っています。テストも書きやすいですしね *2

id:r7kamuraさんから上記のようなおたよりも頂いていました。ありがとうございます。
その後追記したREADME *3 にも記載したのですが、確かに rate_limit で実現可能な機能ではある一方で rate_limit はあくまでrate limittingを行うパーツであるということや、背後にキャッシュストアを要求するという理由から今回は独立した意図を持ったgemとして作成したという次第でした。

同感です。

off-topic: 今回のお楽しみ

action_ip_filterではお楽しみ要素として、rbs-inlineSteepを導入してみました。

rbs-inlineは現在もスマートバンク社内のプロダクトで利用されているのですが、Steepまでは入れられていなかったので良い機会・良いプロジェクト規模ということで使ってみた次第です。CIでもSteepによる型チェックを導入しています。

型情報が脳内スタックに乗り切る程度の規模のライブラリではあるので開発時にバリバリの恩恵を得られているかというと微妙なところですが、型チェックがあるというのはそれだけで安心感があって良いですね。ライブラリを利用する側が型による便益を得られるかどうか、というところが気になる所です *4

試験的に導入してみることによってSteepの使いごこちや癖、限界のようなところをキャッチアップできたのは良かったです。ゆくゆくは良い感じに社内の商用プロダクトにも導入していきたいですね。

むすび

actionレベルでのIPアドレス制限をする際には今回のaction_ip_filterのことをそっと思い出して、そして使っていただけると嬉しいです。

このライブラリは元々社内で実際に実動していた機能をpublicなgemに切り出したものになります。一般性が高く、便利そうなパーツは公開してコミュニティに還元できると嬉しさがありますね。スマートバンクが大事にしている価値観であるところの “Be Open” にも通じるものがあります。

スマートバンクでは “Be Open” 精神を大切にしているエンジニアを募集しています。
採用情報はこちら! smartbank.co.jp

*1:rack-attackはrack app全体に対してIPアドレス制限の適用をする、及びDDoS攻撃から保護するという目的のものであると思うので、今回のユースケースはrack-attackのスイートスポットからは若干外れているようにも思います

*2:なお、テストを書くためのヘルパーも同梱しています

*3:https://github.com/smartbank-inc/action_ip_filter?tab=readme-ov-file#why-not-rails-native-rate_limit

*4:使ってくださった方がいましたら感想を教えてください

We create the new normal of easy budgeting, easy banking, and easy living.
In this tech blog, engineers and other members will share their insights.