CloudFrontを経由して、ELB→EC2に構築したWebサーバにアクセス可能なIPアドレスを制限したい場合、Webサーバ側で制限するか、CloudFrontのエッジロケーションのIPと許可したいIPをセキュリティグループで制限する方法を取っていました。
しかし、最近リリースされたAWS WAFを使えば、アクセス元のIPアドレスで制限を掛けられるようなので、試してみました。
AWS WAFとは
AWSで提供している、Web Application Firewallです。
詳しくは以下の公式サイトを参照してください。
https://aws.amazon.com/jp/waf/
料金
リクエスト数に対する課金は100 万リクエスト単位なので、それ以下に収まるようなレベルであれば、設定するACLとルール数によって料金が変わってきます。
詳しくは以下の公式サイトを参照してください。
https://aws.amazon.com/jp/waf/pricing/
設定
準備
※事前にCloudFrontの設定が完了していることを前提とします。
AWS Management Consoleより、AWS WAFの画面に行き、"Get started"を選択します。
ACL名の設定
conditionの設定
今回はIP制限を掛けたいので、"Create IP match condition"を設定します。
condition名を入れ、制限したいIPアドレスを入力します。
Ruleの設定
続いてRuleを設定します。"Create rules"を選択します。
Rule名を入れ、先ほど設定したconditionを選択します。
続いて、Ruleにマッチした場合としなかった場合のActionを設定します。
今回は特定のIPアドレスのみを許可(それ以外は拒否)したいので、Order Noが振られている箇所のActionは"Allow"を、Default Actionの箇所は"Block all requests that don't match any rules"を選択します。
動作確認
では、実際にアクセスして動作を確認します。
まず、許可されているIPアドレスから、CloudFrontを経由してWebサーバにアクセス出来ることを確認します。
成功後、以下の様なSampled requestsが確認出来ました。
Matches ruleが、設定したrule名になっています。
また、許可しているIPアドレスからアクセスした場合は、Default Actionの方にマッチしています。
エラー画面は以下のような画面が返って来ました。
ERROR
The request could not be satisfied.
Request blocked.
Generated by cloudfront (CloudFront)
Request ID: hoge
特定のユーザーにのみ公開したい場合や、まだ開発中などで外部公開したくない場合などに便利そうです。