Application Load BalancerのリスナールールによるIP制限

管理用ページなど特定のURLパスだけIP制限したいケースがありますが、セキュリティグループやNetwork ACLでは対応できません。Application Load BalancerのリスナールールによるIP制限をご紹介します。
2019.08.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

管理ページなど特定のURLパスだけIP制限したいケースがありますが、セキュリティグループやNetwork ACLでは対応できません。Application Load BalancerのリスナールールによるIP制限をご紹介します。

admin以下をIP制限

以下はEC2のドキュメントルート配下です。特定のIPアドレスからのみ、/admin/restrict-ip.htmlに接続可能にします。特定のIP以外からの接続の場合は、ALBのカスタムレスポンスでHTTP 403を返します。トップにはどこからでも閲覧できるindex.htmlを配置します。

$ tree .
.
├── admin
│   └── restrict-ip.html
└── index.html

1 directory, 2 files
$

ALBリスナールールによるIP制限

リスナールールの送信元IPとパスを組み合わせます。 特定のIPアドレスから/admin以下に接続した場合は、ターゲットグループにルーティングします。ターゲットグループにEC2を登録しておくことで、/admin/restrict-ip.htmlにアクセスできます。

/admin以下に指定したIPアドレス以外から接続があった場合は、ALBの固定レスポンスを返します。送信元IPに0.0.0.0/0を指定します。今回は「このページには特定のIPアドレスからしか接続できません」と返します。ステータスコードは403です。

デフォルトのルーティングは、ターゲットグループにします。こちらが適用されることで、トップのindex.htmlは誰にでも見える状態になります。

まとめると以下のようになります。

動作確認

許可されたIPアドレスから接続すると、restrict-ip.htmlの内容を確認できます。

$ curl -LI http://elb-dnsname/admin/restrict-ip.html -o /dev/null -w '%{http_code}\n' -s
200
$ curl http://elb-dnsname/admin/restrict-ip.html
<h1>管理者のIPアドレスにしか見えないページ</h1>
$

許可されていないIPアドレスから接続すると、ALBの固定レスポンスが表示されます。

$ curl -LI http://elb-dnsname/admin/restrict-ip.html -o /dev/null -w '%{http_code}\n' -s
403
$ curl http://elb-dnsname/admin/restrict-ip.html
<h1>このページには特定のIPアドレスからしか接続できません</h1>
$

最後に

Application Load BalancerのリスナールールによるIP制限をご紹介しました。特定のIPアドレスからの接続はターゲットグループにルーティングし、それ以外はALBの固定レスポンスを返す形にしました。特定パスのIPアドレス制限はAWS WAFでも可能です。AWS WAFと比較するとAWS WAFの料金が不要である点や、固定レスポンスを利用できる点で優れています。制限したいIPアドレスが多い場合はAWS WAFが適しているかと思います。

参考