AWS Application Load Balancingのリスナールール機能を使ってラフにIPアドレス制限する
はじめに
おはようございます、加藤です。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のリスナールールで詳細な制御ができないため回避できません。
やり方
やり方は単純でまず、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