CloudFront + AWS WAF(WebACL) のIP 制限ルール作り方
概要
- 今回は、CloudFront を使用する構成で、送信元のIP アドレスによるアクセス制限を行う方法を紹介します。
- ALB の場合はセキュリティグループ、API Gateway の場合はリソースポリシーによって、IPアドレスによるアクセス制限を設定することが可能です。しかし、CloudFront の場合、IPアドレスによるアクセス制限を設定することができません。CloudFront + AWS WAF(WebACL)を組み合わせることで、CloudFrontにおいてもIP アドレスによるアクセス制限を実現することができます。
CloudFront を準備する
- 先ず、CloudFront を準備してください。ここでは、CloudFront およびオリジンを構築する方法は省略します。
- 今回使用するCloudFront には、オリジンにAPI Gateway – Lambda を配置しており、curl を実行すると下記の様に
Hello from Lambda!
が返ります。
niikawa@niikawa1:~$ curl https://d1vmj58jrb59di.cloudfront.net/dev
"Hello from Lambda!"
AWS WAF(WebACL) を作成する
- AWSマネジメントコンソールからWAF & Shieldを選択します。
- 「Create web ACL」を選択します。
- 以下、Web ACL detailsの設定を行います。
- Resource type に「CloudFront distributions」を指定
- Nameを指定
- Descriptionを指定
- 以下、Associated AWS resourcesの設定を行います。
- 「Add AWS resources」を選択
- Nameに作成済みのCloudFrontのディストリビューション名を選択、「Add」を選択
- 「Next」を選択
- 以下、Add rules and rule groupsの設定を行います。
- Rulesの指定なし
- Default actionは「Block」を選択
- 「Next」を選択
- Set rule priorityの設定を行いません。
- 必要に応じて、Configure metricsの設定を行います。
- Reviewにて、設定を確認後、「Create web ACL」を選択します。
WebACL にIP 制限ルールを作成する
IP set を作成する
- 左メニューのIP setsを選択します。
- リージョンに「Global (CloudFront)」を選択、「Create IP set」を押します。
- 以下、IP set detailsの設定を行います。
- IP set nameを指定
- Descriptionを指定
- Regionに「Global (CloudFront)」を選択
- IP versionに「IPv4」を選択
- IP addressesに許可するIPアドレスを指定(例: 10.0.0.0/32)
- 「Create IP set」を選択
独自ルールを作成する
- WebACLを選択、Rulesタブを選択します。
- 「Add rules」の「Add my own rules and rule groups」を選択します。
- 以下、Ruleの設定を行います。
- Rule typeに「Rule builder」を選択
※Rule typeに「IP set」を選択する方法もありますが、「Rule builder」の方が細かい指定が可能。 - Rule NameにRule名を指定
- Typeに「Regular rule」を選択
- If a requestに「matches the statement」を選択
※上記以外にAND, OR, NOT の条件が作成可。例えば、IP set とヘッダ,クエリやURI Pathの指定がAND条件で一致するなど。 - Statement を設定する。
- Inspectに「Original from an IP address in」、IP setに先ほど作成したIP setを選択
- IP address to use as the originating addressに「Source IP address」を選択
※アクセスの経路にプロキシがある場合は、「IP address in header」の「X-Forwarded-For」を指定する。 - ActionのActionに「Allow」を選択
- 「Add Rule」を選択
- Rule typeに「Rule builder」を選択
- Set rule priority にて、priority を設定。「Save」を選択します。
CloudFront に対する疎通テスト
- 許可されているIPアドレスからテストします。
niikawa@niikawa1:~$ curl https://d1vmj58jrb59di.cloudfront.net/dev
"Hello from Lambda!"
- 許可されていないIPアドレスからテストします。
niikawa@niikawa1:~$ curl https://d1vmj58jrb59di.cloudfront.net/dev
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>ERROR: The request could not be satisfied</TITLE>
</HEAD><BODY>
<H1>403 ERROR</H1>
<H2>The request could not be satisfied.</H2>
<HR noshade size="1px">
Request blocked.
We can't connect to the server for this app or website at this time. There might be too much traffic or a configuration error. Try again later, or contact the app or website owner.
<BR clear="all">
If you provide content to customers through CloudFront, you can find steps to troubleshoot and help prevent this error by reviewing the CloudFront documentation.
<BR clear="all">
<HR noshade size="1px">
<PRE>
Generated by cloudfront (CloudFront)
Request ID: __4vWtfwz9QJ9FNbORhVE9mF44fHcNKG06W3wTjIHctCVAXRedUAjQ==
</PRE>
<ADDRESS>
</ADDRESS>
</BODY></HTML>
- 疎通テスト後、WebACL のOverview 画面に、Sampled requests の結果が表示されました。以下の通りです。
- 許可されていないIP アドレスは、"Action" が “BLOCK" となり、許可されているIPアドレスは「niikawa-wafrule-for-IPFilter」のルールが適用され、"Action" が “ALLOW" になっていることが分かります。