0.はじめに
AWS EC2 AMIMOTO で WordPress サイトを構築して、
CloudFront やら ALB やら AWS WAF を適用していたんですが、
- SSL 化済みの WordPress サイトに CloudFront を適用してみる - Qiita
- CloudFront 適用済みの WordPress サイトに ALB を適用してみる - Qiita
- CloudFront 適用済みの WordPress サイトに ALB を適用後、ALB - WordPress 間を HTTP(80番) で通信させてみる - Qiita
- CloudFront 適用済みの WordPress サイトに AWS WAF も適用してみる - Qiita
海外からの特定 URL (/wp-login.php & /wp-cron.php) へのアクセスが大量にあり、サーバー負荷が上昇していたので、AWS WAF を使ってアクセス制限してみました。
1.CloudWatch Logs でのアクセスログの確認
- CloudWatch Logs にサーバーのアクセスログをエクスポートしているので、Cloudwatch Logs インサイトでログを確認します。
-
fields @timestamp, @message
-
| sort @timestamp desc
| filter (@logStream="i-***") and (@message not like "ELB-HealthChecker")
*
* AWS CloudWatch で、Amazon Linux のパフォーマンスとログの監視をしてみる - Qiita
- /wp-login.php や /wp-cron.php への大量のアクセスが確認できます。
- アクセス元の IP アドレスをいくつか確認 (dig等) すると、海外からのアクセスであることが確認できました。WordPress においては、一般的な攻撃のようですね。
ということで、
今回は、海外からの /wp-login.php や /wp-cron.php へのアクセスを AWS WAF を使って制限します。
なお、現在 CloudFront と ALB の2箇所に AWS WAF が設定されていますが、CloudFront 側の AWS WAF に設定を追加します。
2.Geo match コンディションの作成
- 以下のページの手順を参考に、コンディションを作成します。
- ※各種設定
- Location type : Country
- Location : Japan - JP
- [素朴な手順]Cloudfrontに対してAWS WAFで地域制限をかけつつ特定IPからアクセス許可を入れてみました | DevelopersIO
- ※各種設定
- 作成後の設定は、こんな感じ。
3.String and regex match コンディションの作成
- 以下のページの手順を参考に、コンディションを作成します。
- ※各種設定
- Name : ※任意
- Region : Global (CloudFront) ※今回は、CloudFront の AWS WAF の設定なので
- Type : Regex match
- Part of the request to filter on : URI
- Transformation : None
- Regex patterns to match to request : Create regex pattern set
- 「Create pattern set and add filter」ボタンを押下するのを忘れないこと!!
- AWS WAFを使って、特定のURLへの接続をブロックしてみた | DevelopersIO
- AWS WAFが正規表現と地域条件をサポートしました | DevelopersIO
- ※各種設定
- 作成後の設定は、こんな感じ。
- Regex pattern sets の設定は、こんな感じ。
4.新しくルールを作成し、作成した各コンディションの設定を追加
- 以下のページの手順を参考に、ルールを作成し、作成した各コンディションを設定します。
- ※各種設定
- Rule type : Regular rule
- Region : Global(CloudFront) ※今回は、CloudFront の AWS WAF の設定なので
- Add conditions
- When a request
- does not
- originate from a geographic location in
- 作成した Geo match コンディション名
- When a request
- does
- match at least one of the filters in the string match condition
- 作成した String and regex match コンディション名
- When a request
- [素朴な手順]Cloudfrontに対してAWS WAFで地域制限をかけつつ特定IPからアクセス許可を入れてみました | DevelopersIO
- ※各種設定
- 作成後の設定は、こんな感じ。
5.Web ACL に作成した新しいルールの設定を追加
- 以下のページの手順を参考に、ルールを作成し、作成した各コンディションを設定します。
- ※各種設定
- Order : 新しく作成したルール
- Rule type : Regular
- Action : Block
- [素朴な手順]Cloudfrontに対してAWS WAFで地域制限をかけつつ特定IPからアクセス許可を入れてみました | DevelopersIO
- ※各種設定
- 作成後の設定は、こんな感じ。
6.AWS WAF の設定を確認
- 以下のサイト等を利用して、AWS WAF の設定が効いているか確認します。
- URL を入力し、「START TEST」ボタンを押下します。
- ステータスコード 403 が帰ってきていることを確認します。
99.ハマりポイント
- 今回は、それ程ハマったところは無かったんですが…。
- String and regex match conditions のところで、Regex pattern sets がうまく設定されなかったりして、ちょっと手間取りました。
- Regex pattern sets だけを先に作成し、その後に String and regex match conditions を作成出来ればやりやすい気がしますが、String and regex match conditions の作成の手順の中でしか、新しく作成出来ないみたいです。削除や編集は View regex pattern sets から出来るんですが…。
XX.まとめ
今回もクラスメソッドさんの記事に、おんぶにだっこで、助けて頂きました。
本当にありがたいですね。
🙇♂️
ご参考になれば♪