
AWS WAFを使って接続できるIPアドレスを制限してみた
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
おはようございます、加藤です。
社員向けで特定のIPアドレスのみアクセスさせたいWebサイトってありますよね。
さらに、パブリックなWebサイトだととしても開発環境や開発中は制限したいという要件はよくあると思います。
今回はAWS WAFを使ったIPアドレスベースでのアクセス制限方法をご紹介します。
検証環境
AWS WAFの動作を検証するための環境を作成します。

以下のAWSリソースを使用しました。
- AWS WAF
- Amazon CloudFront
- Elastic Load Balancing
- 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用
下記のブログが参考に、というかそのまま使用できます。ブログとはヘッダーの値が異なるので注意してください。
CloudFront用
AWS WAFのWebACL作成ウィザードから作成しています。

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

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

| 項目 | 値 |
|---|---|
| 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

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

| 項目 | 値 |
|---|---|
| Name | match my global |
| Rule type | Regular Rule |
| Region | Global(CloudFront) |
When a request [does] [originate from an IP address in] [my-global-1]

最後に作成したルールが正の時、Allow、
デフォルトのアクションをBlockに設定します。
許可したIPアドレスからは以下のように表示されます。

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

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

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






