こんにちは、D's Baseです。
AWSでIP制限をかける方法は多数ありますが、
「EC2上のWP管理画面(≒特定URL)にIP制限をかける場合、どの方法が適しているのか」
を調査しました。
本記事では
・どの方法を使って制限をかけるのが良いのか
・制限をかける方法
を記載します。
例としてWordPressを使っていますが、
・WP特有のカスタマイズなどは行っていない
・WP = EC2上で動いているサイト、という前提で記載しています。
構成図
今回、IP制限をかけるインフラの構成の概要は以下とします。
- 要点
- WPはEC2上で動いている
- EC2の前にELBが配置されている
- ELBの前にCloudFrontが配置されている
- この構成だとEC2に届くアクセス元IPはCloudFrontのものになる
要件
- 管理画面のログインURLには、特定のIPのみアクセスできるようにする
- ホワイトリストに登録したいIPが複数ある
- 複数のIPを簡単に管理したい
- CloudFrontへのアクセスに対してIP制限をかけたい
- CloudFront以降だとIPが変わってしまうため
結論
今回の要件お場合、AWS WAF でIP制限をかけるのが、最も適していました。
理由は下記になります。
WAFを選んだ理由
- URL単位でIP制限がかけられる
- 制限の拡張が容易
- ホワイトリストに登録するIP、および制限をかけたいURIがリスト形式で管理できる
- 任意のAWSリソース(CloudFront,ELB...)を選んで制限がかけられる
- つまりCloudFrontをWAFの対象とすることで、アクセス元IPがCloudFrontのものに変わる前に制限がかけられる
WAFのデメリット
サービスの利用料金がかかることが挙げられます。
料金は
・サイトへのアクセス量
・制限の複雑さ
で変化します。
■参考
月毎で200万リクエスト程度のサイトにIP制限をかけた場合は月額1,000円程度
料金の詳細は公式を参照
AWSでIP制限をかける手段
AWSでIP制限をかける手段と、今回の要件ではなぜそれが適さない方法だったのかの理由です。
ELB(リスナールール)
- できること
- 接続元IP、HTTP、HTTPS、ドメイン、URLを条件に制限できる。
- 今回の要件に合わなかった理由
-
ELBでもURL毎のIP制限が可能だが、以下の理由で保守が大変と思ったため
- ELBが複数ある場合、1台づつ設定を反映させる必要がある(設定が一元管理できない)
- 許可したいIPのリスト管理ができない
-
ELBでもURL毎のIP制限が可能だが、以下の理由で保守が大変と思ったため
セキュリティグループ
- できること
- プロトコル(HTTP,TCP,UDP...)単位で制限できる
- AWSリソース(EC2,ELB...)単位で制限がかけられる
- ホワイトリスト形式の制限のみ対応
- 今回の要件に合わなかった理由
- URL単位で制限できない
ACL
- できること
- プロトコル(HTTP,TCP,UDP...)単位で制限できる
- サブネット単位で制限がかけられる
- セキュリティグループと違い、ブラックリスト形式の制限にも対応
- 今回の要件に合わなかった理由
- URL単位でIP制限できない
nginx (webサーバ)
- できること
- 接続元IP、ドメイン、URLを条件に制限できる。
- アプリケーション単位で制限ができる
- 今回の要件に合わなかった理由
- nginxにアクセスが届く時点だと、接続元IPがCloudFrontのIPに変わっているため
WPの.htaccess
nginxと同様。
WAFで特定URLにIP制限をかける方法
作成したい制限の概要
ホワイトリストに登録するIPセットを登録する
- AWS WAFコンソールの左メニューからIP setsを選択
- リージョンはGlobalを選択
- ここはIP制限をかけたいリソースによって変わる。今回はCloudFrontに対して制限をかけるのでGlobalにする
- Create IP set選択してIPセットを作成
IP制限をかけたいURIセットを登録する
- AWS WAFコンソールの左メニューからRegex pattern setsを選択
- リージョンはGlobalを選択
- Create Regex pattern setsを選択して制限をかけたいURIセットを作成
Web ACLを作成する
Web ACL(Web Access Control List)は、
IPやURIなどによる制限をまとめおく箱のようなイメージです。
- AWS WAFコンソールの左メニューからWeb ACLsを選択
- 以下を入力
- 次画面のAdd rules and rule groupsでは、このWeb ACLに追加するRuleを作成できる
- Ruleとは、IP制限やURI制限などのアクセスに対する制限を指している
- Ruleの追加は後から追加するのでこの時点では何もしない
- Default ActionにはAllowを選択する
- 次ページのSet rule priorityは、追加したRuleの優先順位を設定できる
- Ruleを設定していないので何もせずに次へ
- 次ページのConfigure metricsは、ログの設定ができる
- 具体的には以下の設定
- 「作成したRuleのデータをCloudWatchに貯めるか」
- 「このWebACLに当たったリクエストを解析してグラフ表示などできるようにしておくか」
- 具体的には以下の設定
- 好みで設定して、次ページでこれまでの設定を確認し、WebACLを作成
Web ACLにIP制限のRuleを追加する
- AWS WAFコンソールの左メニューからWeb ACLsを選択
- 先ほど作ったWeb ACLを選択
- Ruleタブにて、add my own rules and rule groupsを選択
- 以下設定を入力
- Rule typeにはIP setを選択
- Nameには任意のルール名を入力
- IP setには最初に登録したIPセットを選択
- ここで作ったはずのIPセットが出てこない場合は、リージョンを間違えている可能性がある
- ActionはAllowを選択
- Add Ruleを選択し次ページへ
- 次ページのSet rule priorityは、追加したRuleの優先順位を設定できる
- この時点ではRuleは1つしか無いので何もせずSaveする。
Web ACLにURI制限のRuleを追加する
-
Ruleタブにて、add my own rules and rule groupsを選択
-
以下設定を入力
- Rule typeにはRule builderを選択
- Nameには任意のルール名を入力
- if arequestにmaches the statementを選択
- inspetにURI Pathを選択
- Mache typeにはMaches pattern form regex pattern setを選択
- Regex pattern setに最初に登録したURIセットを選択
- ActionはBlockを選択
-
次ページのSet rule priorityでは、何もせずSaveする。
Capacityについて
画像ではURI制限のCapacityが25になっているが、これは優先度とは関係ありません。
Capacityは、そのWebACLが持てるRuleの処理量のようなもので、
数値が大きいほど処理量が多くなります。
Capacityが1500を超えるRuleの追加はできません。
※AWSに申請すれば拡張は可能らしい。
詳しくは公式ドキュメントを参照
https://docs.aws.amazon.com/waf/latest/developerguide/how-aws-waf-works.html#aws-waf-capacity-units
設定を確認する
- 最後にRuleタブにて想定通りの設定になっているか確認する
- 以下事項を確認
上記でAWSのIP制限の対応は完了です。
D’s Baseでは、“アプリケーション開発” に携わるディレクターのノウハウ共有や、ディレクターとエンジニアが少しでも仕事が進めやすくなるような情報を発信していきます。