BLOG

2019/11/21

AWS Global Accelerator経由のアクセスにWAFのIPフィルターを適用する

【目次】
1. はじめに
2. AWS Global Accelerator とは
3. ALB に紐付ける
4. 検証結果
5. おわりに

1. はじめに
2019/8/28 AWSからAWS Global Accelerator で Application Load Balancer エンドポイントを対象にしたクライアント IP アドレス保存のサポートを開始がリリースされました。ALB (Application Load Balancer) に GA(Global Accelerator) が配置された構成で、WAFで使用するIPフィルタリングが機能するかを検証しました。

2. AWS Global Accelerator とは
ローカルまたは世界中のユーザーに提供するアプリケーションの可用性とパフォーマンスを改善するサービスです。Application Load Balancer、Network Load Balancer、Amazon EC2 インスタンスなど、単一または複数の AWS リージョンのアプリケーションエンドポイントへの固定エントリポイントとして機能するスタティック IP アドレスを提供します。
AWS グローバルネットワークを使用してユーザーからアプリケーションへのパスを最適化し、TCP および UDP トラフィックのパフォーマンスを改善します。AWS Global Accelerator は、アプリケーションエンドポイントの状態を継続的に監視し、異常なエンドポイントを検出し、1 分以内に正常なエンドポイントにトラフィックをリダイレクトします。

ユーザー側の変更なしでエンドポイントの更新ができることや、経路最適化によるパフォーマンス向上が期待できます。災害対策やレイテンシーの影響をうけるサービス等で需要がありそうです。

公式情報は以下を参照してください。
https://aws.amazon.com/jp/global-accelerator/
https://aws.amazon.com/jp/global-accelerator/features/

3. ALB に紐付ける
まずは AWS Global Accelerator を作成していきましょう。
「Create Accelerator」を押下します。

名前を入力して IP address type でIPv4を選択します。


次に対象のポートとプロトコルを選択します。
今回は以下で進めます。
port : 80,443
protocol : TCP
Client affinity : デフォルト

エンドポイントグループでは今回は東京リージョンのALBに紐付けるので同様に東京リージョンを選択します。その他はデフォルトです。

エンドポイントは既存のALBを利用することにしました。「Endpoint type」で「Application Load Balancer」を選択して「Endpoint」に既存のALBを選びます。
「Preserve client IP」にデフォルトでチェックが入っていますが、これが今回のポイントであるクライアントIPアドレスの保持機能になります。

以上で設定は完了です。

4. 検証結果
まずはALBへの直接のアクセスと AWS Global Accelerator でアクセスしたものをALBのアクセスログで比べてみます。ALBには FQDN で、 AWS Global Accelerator へはIPアドレスでアクセスします。

結果
・ AWS Global Accelerator のIPアドレスへのアクセス

http 2019-11-01T07:00:11.711762Z app/XXXX/e70c78dba838c0ab 153.156.XXX.XXX:25324 10.1.1.67:80 0.009 0.003 0.000 200 200 436 469 "GET http://13.248.XXX.XXX:80/health HTTP/1.1" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" - - arn:aws:elasticloadbalancing:ap-northeast-1:358486443100:targetgroup/XXXX/f0870ad213e22824 "Root=1-5dbbd7fb-1ca82807de71d7b317d24d51" "-" "-" 0 2019-11-01T07:00:11.699000Z "waf,forward" "-" "-" "10.1.1.67:80" "200"

・ ALB の FQDN へのアクセス

http 2019-11-01T07:01:28.820837Z app/XXXX/e70c78dba838c0ab 153.156.XXX.XXX:25581 10.1.1.67:80 0.044 0.003 0.000 200 200 471 469 "GET http://XXXXXX.ap-northeast-1.elb.amazonaws.com:80/health HTTP/1.1" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" - - arn:aws:elasticloadbalancing:ap-northeast-1:358486443100:targetgroup/XXXX/f0870ad213e22824 "Root=1-5dbbd848-8987b080731e370036a91ec8" "-" "-" 0 2019-11-01T07:01:28.773000Z "waf,forward" "-" "-" "10.1.1.67:80" "200"

ALBのアクセスログに両方のアクセスが表示されましたので AWS Global Accelerator 経由も問題なくALBに届いているようです。

続いてアクセス元である「153.156.XXX.XXX」をBLOCKするフィルターをWAFに作成してALBにWAFを適用します。
※WAFのルール設定は過去のブログを参照してください。
https://www.wafcharm.com/blog/aws-waf-block-specific-ip-jp/

結果
・ AWS Global Accelerator のIPアドレスへのアクセス

http 2019-11-01T07:17:51.351074Z app/XXXX/e70c78dba838c0ab 153.156.XXX.XXX:27880 - -1 -1 -1 403 - 553 689 "GET http://13.248.132.169:80/health HTTP/1.1" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" - - arn:aws:elasticloadbalancing:ap-northeast-1:358486443100:targetgroup/XXXX/f0870ad213e22824 "Root=1-5dbbdc1f-9309a030b09cbc80cff4a7b0" "-" "-" -1 2019-11-01T07:17:51.338000Z "waf" "-" "-" "-" "-"

・ ALB の FQDN へのアクセス

http 2019-11-01T07:15:09.219543Z app/XXXX/e70c78dba838c0ab 153.156.XXX.XXX:27555 - -1 -1 -1 403 - 588 689 "GET http://XXXXXX.ap-northeast-1.elb.amazonaws.com:80/health HTTP/1.1" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" - - arn:aws:elasticloadbalancing:ap-northeast-1:358486443100:targetgroup/XXXX/f0870ad213e22824 "Root=1-5dbbdb7d-c9c77d42caaa39d06877f672" "-" "-" -1 2019-11-01T07:15:09.179000Z "waf" "-" "-" "-" "-"

WAFでブロックされていることが確認できました。

念のため別の AWS Global Accelerator でクライアントIPアドレスを保持しなかった結果も記載します。接続元のIPアドレスが AWS Global Accelerator で予約されたIPアドレスからのものになっていました。ですので、IPアドレスのフィルターは適用されず正常アクセスになっています。
※既存の AWS Global Accelerator エンドポイントの設定には「Preserve client IP」を編集する項目がなかったため、別の AWS Global Accelerator で同一の ALB へ紐付ける設定を行いました。
※マスクしていますが、赤文字のアクセスした AWS Global Accelerator のIPアドレスは異なります。クライアントIPアドレスは同一です。

・クライアントIPアドレスを保持していなかった場合

http 2019-11-01T08:03:50.939611Z app/XXXX/e70c78dba838c0ab 13.248.XXX.XXX:49408 10.1.1.67:80 0.043 0.001 0.000 200 200 436 469 "GET http://13.248.XXX.XXX:80/health HTTP/1.1" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" - - arn:aws:elasticloadbalancing:ap-northeast-1:358486443100:targetgroup/XXXX/f0870ad213e22824 "Root=1-5dbbe6e6-515e5ec072200370775a77a0" "-" "-" 0 2019-11-01T08:03:50.683000Z "waf,forward" "-" "-" "10.1.1.67:80" "200"

・クライアントIPを保持していた場合

http 2019-11-01T08:04:39.069937Z app/XXXX/e70c78dba838c0ab 153.156.XXX.XXX:34345 - -1 -1 -1 403 - 553 689 "GET http://13.248.XXX.XXX:80/health HTTP/1.1" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" - - arn:aws:elasticloadbalancing:ap-northeast-1:358486443100:targetgroup/XXXX/f0870ad213e22824 "Root=1-5dbbe717-d76cbc38f263b6f003c13b24" "-" "-" -1 2019-11-01T08:04:39.057000Z "waf" "-" "-" "-" "-"

5. おわりに
クライアントのIPアドレスが保持できるので、 AWS WAF を導入済みの ALB に AWS Global Accelerator を適用することも問題なさそうです。