こんにちは、サーバーサイドエンジニアのいわむ(@k_iwamu)です。
エンジニアとしてサービスを作っていると、特定のIPからのみ利用できるAPIや管理画面を作る機会があるかと思います。
IP制限をかける方法はいくつかあると思いますが、
今回、AWSのApplication Load Balancer(以下ALB)のリスナールール使って特定のURLのみIP制限をかけることがとても簡単にできたので紹介します。

ALBのリスナールールとは
ALBのリスナールールとは、ALBがリクエストをルーティングする際のルールを定義したものです。ルーティングしたい優先度、条件(IF)、アクション(THEN)で構成されています。

今回、条件では「パス」と「IP制限」、アクションでは「転送」と「固定レスポンス」を利用します。
設定方法
今回の目的は「/admin/*のURLを社内IPからのアクセスに制限し、他のURLはどのIPからも利用可能な状態にすること」として設定していきます。
設定ページへの移動
まず、指定のALBを選択し、リスナータブを選択します。そのあと、一番右にある「ルールの表示/編集」を選択します。

下のような画面が表示されると思います。今は全てのアクセスをターゲットグループに転送している状態ですね。 ここから設定を加えていきます。

設定を行う
以下の表のように3つリスナーグループを設定します。
| 順番 | 条件 | 転送先 |
|---|---|---|
| 1 | 送信元IPが社内 & URLが/admin/* | ターゲットグループに転送する |
| 2 | URLが/admin/* | 固定レスポンス(status code 401)を返す |
| 2 | URLが/* | ターゲットグループに転送する |
1つ目の設定では、社内IPかつURLが/admin/*のリクエストは、ターゲットグループに転送しています。この設定で社内IPから利用できるようになります。

2つ目の設定では、URLが/admin/*のリクエストは、固定レスポンス(status code 401)を返すようにしています。1つ目のルールで社内IPから利用できるようにしているので、この設定を追加することで社内IP以外は全てアクセスできないようにできました。

3つ目の設定では、全てのURLが利用できるようにしています。しかし1つ目と2つ目のルールが優先されるので、/admin/*に対して制限がかかっていることに影響はありません。

以上の設定で完了です。この設定だけで/admin/*だけ社内IPからしかアクセスできないようにすることができます。
こちらが完成したページになります。

最後に
ALBのリスナールールを応用して特定のURLだけIP制限を行う方法を紹介しました。 紹介したようにとても簡単な設定できるので、IP制限を実装する時の1つの選択肢としてかなり有効だと思っています。
また、ここでは触れませんが、「今回紹介した方法 + アプリケーション側でさらに認証」など、多層でセキュリティを強化する設計にも用いることができますので、ぜひご検討してみてください。
積極採用中!!
子育て家族アプリFammを運営するTimers inc.では、現在エンジニアを積極採用中!
急成長中のサービスの技術の話を少しでも聞いてみたい方、スタートアップで働きたい方など、是非お気軽にご連絡ください!
採用HP: http://timers-inc.com/engineerings
プロダクトマネージャーも積極募集中です!