CloudFront + AWS WAF(WebACL) のIP 制限ルール作り方

AWS,AWS WAF,AWS-Security,CloudFront

概要

  • 今回は、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」を選択

 

  • 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" になっていることが分かります。