AWS WAFを利用してCloudFrontのELBオリジンへ直接アクセスを制限してみた

2017.06.04

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

はじめに

AWSチームのすずきです。

ELBの前段にCloudFrontを設置した環境では、CloudFrontとオリジンのELB間の通信はインターネット経由で行われます。

ELBのIPやDNS名を知った利用者による、CloudFrontを経由しないELBへの直接アクセスが望ましくない場合には、 CloudFrontのカスタムヘッダを利用したアクセス制限が可能です。

今回、AWS WAFを利用し、CloudFrontのカスタムヘッダを利用したアクセス制限を行う機会がありましたので、紹介させていただきます。

追記

2019年3月のアップデートにより、ALBのリクエストルーティングで同等の設定が可能となりました。併せてご確認ください。

CloudFront専用のALBをリクエストルーティングで設定してみた

環境

  • CloudFrontはカスタムオリジンとしてAWS東京リージョンのELBを指定
  • ELBはALB(アプリケーションロードバランサ)を利用
  • ALB配下のEC2、OSはAmazonLinux、Webサーバとして、httpd(Apache)をデフォルト状態で利用
  • ALBの前段にAWS WAFを設置し、特定のCloudFrontを経由しないアクセスを禁止

cloudfront-waf-alb-01

設定

CloudFront

  • オリジン設定のカスタムヘッダ設定として、ヘッダ名「x-pre-shared-key」、値は「sesame-ouvre-toi」を指定しました。
  • 実環境でアクセス制限に利用する場合、カスタムヘッダの値は推測されにくい文字列の利用をお勧めします。

cloudfront-waf-alb-02

AWS WAF

  • CLoudFrontで定義したカスタムヘッダをもつリクエストのみ、アクセスを許可する設定を行います。

ACL設定

  • Web ACLを作成します
  • 任意のACL名称と、アクセス制限対象となるELB(ALB)を指定します

cloudfront-waf-alb-03

Conditions設定

  • String match、ヘッダ文字列の判定設定を作成します

cloudfront-waf-alb-04

  • HTTPヘッダ「x-pre-shared-key」、その値が「sesame-ouvre-toi」に一致するフィルタを定義します

cloudfront-waf-alb-05

cloudfront-waf-alb-06

cloudfront-waf-alb-07

ルール作成

  • 先に定義した、CloudFrontのカスタムヘッダを判定するConditionsを指定します。

cloudfront-waf-alb-09

  • CloudFrontのカスタムヘッダを有す場合は許可(Allow)、それ以外のデフォルトアクションは禁止(Block)する設定を行います。

cloudfront-waf-alb-10

動作確認

CloudFront

  • CloudFront(カスタムヘッダ設定済み)経由のアクセスは可能です。

cloudfront-waf-alb-11

ELB直接

  • ELBのDNS名を直接指定した場合、AWS WAFによりアクセス禁止となりました

cloudfront-waf-alb-12

まとめ

CloudFront、ELB間の通信、公開されているAWSのIP範囲情報を利用し、 ELBのセキュリティグループとして公開先をCloudFrontのみに限定する事が可能な時期もありましたが、 2017年6月現在、CloudFrontのエッジロケーションの追加や、IPV6対応などにより、 セキュリティグループではCloudFrontのIP範囲を全て網羅する事は難しくなっています。

2016年12月に利用可能となった、AWS WAFとALBを利用する事により、 CloudFrontのカスタムヘッダによるアクセス制限を実現できました。

今回設定したAWS WAF、ACLとルールの月額費用は6$、100万リクエスト毎に0.6$で利用する事が可能です。

EC2上で動作するWebサーバ(Apache、Nginxなど)の設定変更が難しい、ヘッダチェックに伴うEC2の負荷が懸念されるといった場合には、AWS WAFをお試しください。

参考リンク

CloudFrontのELBオリジンへ直接アクセスする通信を制限する方法

AWS公式ドキュメント