はじめに
CloudFront→ALB→サーバーという構築において、パス/admin/users.phpへのIPアドレスでのアクセス制限をする簡易な方法について説明します。
結論を言うと、ALBのリスナールールで送信元IPアドレスを判定し、アクセス制御できます。
他の方法として、WAFやサーバーのapacheやnginxによるアクセス制御は、ありますが、WAFだとお金がかかる、サーバーだとSSH接続など手間がかかりますので、ALBのコンソールで設定できる方法が適切だと考えます。
ちなみにサーバーでのIP制限の方法も記事にまとめていますので、参考になればと思います。
構成図
ALBのルール
以下のように設定しました。
送信元IPが111.111.111.111の場合のみ、パスadmin/users.phpにアクセスできます。
リスナールールには、X-Forwarded-Forが111.111.111.111としています。
X-Forwarded-Forとは
X-Forwarded-For (XFF) ヘッダーは、 HTTP プロキシ又はロードバランサーを通過してウェブサーバーへ接続したクライアントの、送信元 IP アドレスを特定するために事実上の標準となっているヘッダーです。
クライアントとサーバーとの間でトラフィックに何かが介在すると、サーバーのアクセスログにはプロキシ又はロードバランサーのアドレスしか残りません。
クライアントの元 IP アドレスを記録するために、 X-Forwarded-For 要求ヘッダーが使用されます。
今回X-Forwarded-For使用した理由
CloudFrontやALBを通してサーバーにアクセスすると、サーバーから見た送信元IPは、ALBのものになってしまいます。
同様に、ALBから見たクライアントIPは、CloudFrontになってしまいます。
それを解決するために、HTTP HeaderのX-Forwarded-For に送信元IP を記録して、サーバーやALBではその値を見ることで送信元IPを取得できるようになります。
参考

