🌊

AWS Application Load Balancingのリスナールール機能を使ってラフにIPアドレス制限する

2022/05/31に公開

はじめに

おはようございます、加藤です。AWSのApplication Load Balancing(以降、ALB)はAWS WAFに対応しているので、それを使ってアクセス元のIPアドレス制限をすることができます。
また、ALBにはリスナールールという機能があります。これはソースIPアドレスやHTTPヘッダーなどに基づいてリクエストの振り分けができます。よってALB単体でもアクセス元のIPアドレス制限が行えます。

しかし、CloudFront(以降、CF)+ALBという構成ではソースIPアドレスはCFのアドレスになってしまうため、アクセス元のIPアドレス制限が単体ではできません。ですが、CFはX-Forwarded-For ヘッダーに対応しているので、これを使うことでWAFを使わなくともアクセス元のIPアドレス制限ができます。

注意

X-Forwarded-Forヘッダーはユーザーが付け足すことができるのでIPアドレスが知られている場合は容易に突破されます。
下記記事で紹介されているように適切にパースすれば偽装を回避できますが、ALBのリスナールールで詳細な制御ができないため回避できません。

こんばんは、X-Forwarded-For警察です - エムスリーテックブログ

やり方

やり方は単純でまず、CF+ALBの構成を作ります。そしてリスナールールでHTTPヘッダー: x-forwarded-forがIPアドレスと部分一致するようにルールを定義します。値にはワイルドカードが指定できるので*${IP_ADDRESS}*というような書き方になります。

cURLコマンドで指定したIPアドレスからアクセスできること、x-forwarded-forヘッダーを指定したときにアクセスできてしまうことを確認します。

curl http://${CF_DOMAIN}
curl -H "x-forwarded-for":"${IP_ADDRESS}" http://${CF_DOMAIN}

また、AWS CDKで構築したサンプルをこちらのリポジトリで公開しています。

intercept6/cdk-cloudfront-ipaddress-filter

あとがき

最近だとALBの前段にCFを置く事はあまりありませんが、認証付きの管理者画面などをログインフォームすら見せたく無いときとかにちょうど良いかもしれない。
toBビジネスなどで制限したい場合やIPアドレスのみで制御する場合はこの仕組みじゃ無くてWAFで制限する様にしましょう。

Discussion