目次
1.はじめに
こんにちは、BeeXの糸山です。
本記事ではCloudFrontとWAFの組み合わせによるIP制限を検証してみます。
始めて構築した際に経験したのですが、IPv4のIPアドレスを許可したにも拘らずデフォルトルールにて拒否されてしまい接続できない事象がありました。詳細は「6.許可ルールを定義したのに拒否されてしまう場合」に書いています。
※本検証ではホワイトリスト方式のIP制限ルールを作成します。
2.AWS WAFとは
WAFとはWebApplicationFirewallの略で、脆弱性に対する攻撃から守ってくれるための仕組みです。独自のルールを定義することも可能ですが、AWS Marketplace セキュリティ販売者から提供されるマネージドルールも使用可能です。
AWS WAFが使用可能なリソースは以下になります。
全てのサービスでWAFが使用できるわけではないのでご注意ください。
- CloudFront ディストリビューション
- Amazon API Gateway REST API
- Application Load Balancer
- AWS AppSync GraphQL API
- Amazon Cognito ユーザープール
- AWS App Runner のサービス
- AWS Verified Access インスタンス
3.ブラックリスト方式とホワイトリスト方式の違い
WAFは脆弱性から守るための仕組みと説明しましたが、アクセス制御方式に「ブラックリスト方式」と「ホワイトリスト方式」という考え方があります。
ブラックリスト方式 | ホワイトリスト方式 |
あらかじめ定義されたIPのみを拒否 →WEBサーバのように不特定多数空のアクセスが来ることが予想される場合はブラックリスト方式が一般的です。 | あらかじめ定義されたIPのみを許可 それ以外を拒否 |
■ブラックリスト方式
・メリット
拒否したいIPなどが事前にわかっている場合は、ピンポイントに拒否することが可能
・デメリット
拒否の定義に存在しない新しい攻撃は検知することができず通ってしまうため、ルールの更新が必要
■ホワイトリスト方式
・メリット
特定のアクセスのみ許可し、それ以外を拒否するため不正なアクセスを防ぐことが可能
・デメリット
許可の定義が漏れていた場合、接続したいアクセスも拒否されてしまう
4.Web ACLsの作成
WAF&Shieldを開き、「WebACLs」を選択します。
リージョンを選択する箇所があるので「Global(CloudFront)」を選択します。
以下の内容で作成します。
Resource type : Amazon CloudFront distributions を選択してください。
Nextを押下します。
次の画面ではデフォルトアクションを「Block」にし、それ以外は特に作成せずそのまま先に進んでください。(後で作成します。)
Configure metricsは「Enable sampled requests」を選択してください。
無効化されている場合、リクエストの許可・拒否をコンソール上で確認できなくなります。
5. 許可ルールの作成
まず初めに対象のIPアドレスを含むIpSetを作成します。今回はホワイトリスト方式でアクセス制御を行いたいので、許可対象のIPアドレスを追加します。
検証では私の自宅のグローバルIPアドレス(IPv4)を追加して確認します。
IPSetsが作成できたら、許可ルールを作成します。
先ほど作成したWebACLsの画面から「Rules」を開き「Add my own rules and rule groups」を選択します。
Rule type :IP set
Action:Allowを選択します。
CloudFrontとWAFを関連付けます。
「Add AWS resources」を選択します
WAFを適用したいCloudFrontを選択します。
接続してみます
接続できました!
「Sampled requests」を確認してみると、作成したルールによってリクエストが許可・拒否されたことが確認できます。
6.許可ルールを定義したのに拒否されてしまう場合
今回の検証では1発でうまくいったのですが、IPv4のIPアドレス制限がうまくいかない事象があるので紹介します。
私も初めてWAFルールを適用した際にデフォルトアクションでなぜか拒否されてしまい、うまくいきませんでした。
※前提として、IPv4のIPアドレスのみ許可していたとします。
6.1 原因
WAFルールで間違いなくIPアドレスを許可しているのになぜかデフォルトアクションで拒否されてしまう事象について、私の場合はCloudFrontの設定で「IPv6が有効化されていた」ことが原因でした
WAFで拒否されてしまう際に確認いただきたいポイントは以下になります。
- 許可ルールに記載いたIPアドレスはIPv4だけか
- WAFの「Sampled requests」の画面で拒否された際のIPアドレスはIPv4形式のIPが表示されているか
- CloudFrontの設定でIPv6が有効化されているか
6.2 解決方法
IPv4経由の接続が拒否されてしまうケースの場合、CloudFrontの設定でIPv6を無効化してください。
もしくは、IPv6のIPアドレス用にIPSetsを作成して、ルールに追加して再度接続を確認してみてください。
7. さいごに
ドメイン取得、Lightsailによるウェブサーバ構築から、Ec2-ALB構成への移行、HTTPS接続化など連続した検証記事を書いてみましたが、今回のCloudFront+WAFの導入でいったん区切ろうと思います。
基本機能は網羅で来ているかと思うので、この記事がだれかの参考になればらうれしいです。
最後まで読んでいただきありがとうございました!