AWS WAFを使って接続できるIPアドレスを制限してみた

おはようございます、加藤です。
社員向けで特定のIPアドレスのみアクセスさせたいWebサイトってありますよね。
さらに、パブリックなWebサイトだととしても開発環境や開発中は制限したいという要件はよくあると思います。
今回はAWS WAFを使ったIPアドレスベースでのアクセス制限方法をご紹介します。

検証環境

AWS WAFの動作を検証するための環境を作成します。

以下のAWSリソースを使用しました。

  1. AWS WAF
  2. Amazon CloudFront
  3. Elastic Load Balancing
  4. Amazon EC2

構成説明

なぜ、このような構成を組むのか説明します。
まず、WAFが対応しているリソースはCloudFrontとALBです。この為、EC2上のWebサイトに対して制限をかけるならばALBの利用は必須となります。
CloudFrontは必須ではありませんが、今回はパブリックなWebサイトの開発環境や開発中といった状況も想定しているので構成に組み込みました。

11.AWS WAF はどのようなサービスをサポートしますか? AWS WAF は Amazon CloudFront および Application Load Balancer (ALB) にデプロイできます。これは Amazon CloudFront の一部である場合は Content Distribution Network (CDN) の一部となってエッジロケーションにあるリソースおよびコンテンツを保護することができ、Application Load Balancer の一部である場合は ALB の背後で実行中のオリジンウェブサーバーを保護できます。
よくある質問 - AWS WAF(Web アプリケーションファイアーウォール)| AWS

やってみた

EC2,ELB,CF(CloudFront)の構築

今回の本質ではないので、構築内容を箇条書きします。

  • EC2インスタンスを構築
    • Webサーバを構築
  • ELB(ALB)を構築
  • ELBのターゲットに作成したEC2インスタンスを設定
  • CFを構築
    • Origin Custom Headerに設定を入れる
  • CFのオリジンに作成したELBを設定

Origin Custom Header

Header Name Value
x-pre-shared-key access-from-cf

WAF

ELB用

下記のブログが参考に、というかそのまま使用できます。ブログとはヘッダーの値が異なるので注意してください。

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

CloudFront用

AWS WAFのWebACL作成ウィザードから作成しています。

waf-ipaddress001

項目
Web ACL name blogwaf-cf
Region Global(CloudFront)
AWS Resource to associate 作成したCloudFront

waf-ipaddress002

今回はIPアドレスに対して制御を行うのでIP match conditionsを使います。

waf-ipaddress003

項目
Name my-global-1
Region Global(CloudFront)
IP Version IPv4
Address 自分のグローバルIPアドレス

自分のIPアドレスを登録します。下記URLで簡単にチェックできます。

  • ブラウザの場合
    • https://checkip.amazonaws.com
  • CLIの場合
    • curl -s https://checkip.amazonaws.com

今回は1つだけIPアドレスを定義しましたが、1つのグループ内に複数のIPアドレスを登録することができます。 また、IPアドレスは以下のCIDRでしかまとめて入力することができません、ご注意ください。

  • /8
  • /16
  • /24
  • /32

waf-ipaddress004

作成したIPアドレスは値でしかなく、条件を持っていません。
その為、条件を定義するルールを作成します。
IPアドレスに一致した時を正とするように設定します。
1つのIPアドレスグループ内に複数のIPアドレスがある場合はどれかに一致すれば正、つまりOR条件です

waf-ipaddress005

項目
Name match my global
Rule type Regular Rule
Region Global(CloudFront)

When a request [does] [originate from an IP address in] [my-global-1]

waf-ipaddress006

最後に作成したルールが正の時、Allow、
デフォルトのアクションをBlockに設定します。

許可したIPアドレスからは以下のように表示されます。

waf-ipaddress007

許可されていないIPアドレスからは以下のように表示されます。

waf-ipaddress008

ELBのDNS名に直接アクセスした場合は以下のように表示されます。

waf-ipaddress009

あとがき

しっかりとIPアドレス制限できました!ALBに対するWAFは未対応のリージョンもあるのでご注意ください。
未対応の場合は、EC2内作業が発生してしまいますがWebサーバでx-pre-shared-keyの値をチェックして弾くこともできます。必要に応じて検討ください。