[素朴な手順]Cloudfrontに対してAWS WAFで地域制限をかけつつ特定IPからアクセス許可を入れてみました

2018.04.27

ベルリンのはんせです。

はじめに

Cloudfrontで地域制限(Geo Restriction)を使用して国別のアクセス許可をしているが、特定のIPは許可したいというお問い合わせを受けました。
CloudfrontのGeo restrictionでは対応方法が見当たらず(あったらごめんなさい)、AWS WAFを組み合わせることで対応できましたので、その確認結果をメモします。  

やること

  1. AWS WAFのWeb ACLの作成とCloudFrontへの紐付け
  2. Geo Matchのconditionおよびrule設定とACLへの紐付け  
  3. 地域制限の確認
  4. IP Matchのconditionおよびrule設定とACLへの紐付け  
  5. IP制限の確認

Cloudfrontの準備は割愛します。

やって見ます

Cloudfrontで以下のようなs3オリジンのテスト用ディストリビューションを用意します。  

1. AWS WAFのWeb ACLの作成とCloudFrontへの紐付け

AWS WAFでWeb ACLを作成していきます。   コンソール「Web ACLs」→「Create web ACL」から

  • 「Region」は「Global(CloudFront)」
  • 「AWS resource to associate」では、設定済のテスト用ディストリビューションが一覧表示に出てくるので、それを指定
  • 「Next」を押します
  • 次画面「Create Condtion」そのまま「Next」を押します。Conditionはあとで作成します。
  • 次画面「Create Rules」では「Default Action」を「Block all requests that don't match any rules」のみ選択して「Next」を押します。rulesも後で作成します。
  • 「Review and create」→「Confirm and create」で作成完了です。


↑CloudFrontに紐づいているだけのACL設定が作成されます。


↑この時点でアクセスすると、403が表示されるようになっています(全てをBlockしているから

2. Geo Matchのconditionおよびrule設定とACLへの紐付け  

Condtion作成

次に地域でマッチ(Geo Match)のConditionsを作成していきます。
コンソール「(Conditions)Geo Match」→「Create condition」から

  • 画像の通り、地域のフィルタリング設定を追加して作成します
  • 「Create」
  • ここではフィルタ条件を指定するだけで、許可・除外を指定しません。


↑日本とドイツに加え、カナダを追加し、Conditionを作成しました。

Rule作成

前項で作ったCondtionを元にするRuleを作成します。
コンソール「Rules」→「Create Rule」から

  • 「Rule type」は「Regular rule」
  • 「Region」は「Global(CloudFront)」
  • 「Add conditions」で先ほど作成したconditionを指定します。この時、
    • When a request
    • 「does」
    • 「originate from a geographic location in」
    • 「<作成したcondition名>」 とします
  • 「Create」で作成


↑Geo Match Conditionをフィルタするruleができました

ACLへの紐付け

作成したRuleをACLに紐付けし、Geo Match Condtion(この場合は日本・ドイツ・カナダ)をAllowします。
コンソール「Web ACLs」→「<作成したWeb ALC名>」を選択


↑「Rules」タブで、「Edit web ACL」をクリックします  

  • 「Rules」の一覧で「<前項で作成したRule名>」を選択し「Add rule to web ACL」をクリック
  • 追加されたRuleで「Allow」を選択します
  • 「Update」


↑テスト用Cloudfrontディストリビューションに紐付けられたACLに、地域制限が追加されました。

3. 地域制限の確認

前項までの設定で、地域制限で日本・ドイツ・カナダの地域をAllowしています。


↑そのため、この状態でベルリンオフィスからアクセスすると画像が表示されるようになっています。

ここで、ドイツからのアクセスを禁止します。
前項 2.で作成したGeo Match Conditionで、Filter 「Germany -DE」を除外します。

filterを除外したタイミングから、ドイツ地域はACL上でのallowの対象に含まれなくなり、数秒後に画像が見えなくなります。


↑見えなくなりました。
これで地域制限がかかりました(日本とカナダからしか見えない状態)。

4. IP Matchのconditionおよびrule設定とACLへの紐付け  

次に、ドイツ国内でも特定のIPからのリクエストついては許可するようにACL設定を追加します。

Condtion作成

IPマッチのConditionsを作成していきます。
コンソール「(Conditions)IP Addresses Match」→「Create condition」から

  • IPv4を指定して、許可したいIPレンジを入れます。
  • ここでは、「<クラスメソッドベルリンオフィスのIP>/32」で指定
  • 「Create」します

Rule作成

前項で作ったCondtionを元にするRuleを作成します。   コンソール「Rules」→「Create Rule」から

  • 「Add conditions」で先ほど作成したconditionを指定
    • When a request
    • 「does」
    • 「originate from an IP address in」
    • 「<作成したcondition名>」 とします
  • 「Create」します

ACLへの紐付け

前項と同じ要領で、ACLに紐付けして「allow」とします。

5. IP制限の確認

「4.」でIP制限の許可RuleをACLに紐付けしたタイミングで、ベルリンオフィスからアクセスすると、、、

ちゃんと画像が表示できました。ドイツ国内で別IPに変えてアクセスすると、表示が403となります。
これで設定完了です。 

さいごに

CloudfrontとAWS WAFを組み合わせて、リージョン制限をしながら個別のIP許可設定を入れてみました。

それではー。