CloudFront と AWS WAF 適用済みの WordPress (AMIMOTO) サイトで、海外からの特定 URL (/wp-login.php & /wp-cron.php) へのアクセスを制限してみる

# ０．はじめに

AWS EC2 AMIMOTO で WordPress サイトを構築して、

* [AMIMOTO AMI を使って、WordPress を立ち上げて、接続先を RDS に変更してみる \- Qiita](https://qiita.com/kusokamayarou/items/58d550b82b960c321c3a)

CloudFront やら ALB やら AWS WAF を適用していたんですが、

* [SSL 化済みの WordPress サイトに CloudFront を適用してみる \- Qiita](https://qiita.com/kusokamayarou/items/21e4bcdaa7c8dd8523ab)
* [CloudFront 適用済みの WordPress サイトに ALB を適用してみる \- Qiita](https://qiita.com/kusokamayarou/items/1229bed12462eee48e68)
* [CloudFront 適用済みの WordPress サイトに ALB を適用後、ALB \- WordPress 間を HTTP\(80番\) で通信させてみる \- Qiita](https://qiita.com/kusokamayarou/items/edffa0f1159f60a2ce82)
* [CloudFront 適用済みの WordPress サイトに AWS WAF も適用してみる \- Qiita](https://qiita.com/kusokamayarou/items/099a97fc0edc493e22fb)

海外からの特定 URL (/wp-login.php & /wp-cron.php) へのアクセスが大量にあり、サーバー負荷が上昇していたので、AWS WAF を使ってアクセス制限してみました。

# １．CloudWatch Logs でのアクセスログの確認
1. CloudWatch Logs にサーバーのアクセスログをエクスポートしているので、Cloudwatch Logs インサイトでログを確認します。
    * <pre><code>fields @timestamp, @message
| sort @timestamp desc
| filter (@logStream="i-***") and (@message not like "ELB-HealthChecker")</code></pre>
    * ![FireShot Capture 083 - CloudWatch Management Console - ap-northeast-1.console.aws.amazon.com.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161939/03897e32-b69d-819f-58e1-ae207b92130d.jpeg)
    * [AWS CloudWatch で、Amazon Linux のパフォーマンスとログの監視をしてみる \- Qiita](https://qiita.com/kusokamayarou/items/b59d34b0ee0f8ff544c1)
1. /wp-login.php や /wp-cron.php への大量のアクセスが確認できます。<br><br>
1. アクセス元の IP アドレスをいくつか確認 (dig等) すると、海外からのアクセスであることが確認できました。WordPress においては、一般的な攻撃のようですね。
    * [WordPressで攻撃を受けやすいファイルとそのセキュリティー対策まとめ](https://nelog.jp/attacked-php-files)
    * [WordPressのセキュリティ対策 xmlrpc\.phpとwp\-cron\.phpの無効化 \| モバイル・スマホWeb・WordPressのSEO塾\.com](https://www.seojuku.com/blog/wp-security-xmlrpc-cron.html)
    * [海外からWordPressにイタズラされるので、不正アクセス対策をしました。 \| 正論紅茶](https://www.tank-sakurai.com/wpsecurity/#wp-cronphp)
    * [WordPressの負荷軽減を本気でやってみたら負荷が1/3になった \| 9ineBB](https://9-bb.com/wordpress-fuka/)

ということで、
今回は、海外からの /wp-login.php や /wp-cron.php へのアクセスを AWS WAF を使って制限します。

なお、現在 CloudFront と ALB の２箇所に AWS WAF が設定されていますが、CloudFront 側の AWS WAF に設定を追加します。

# ２．Geo match コンディションの作成
1. 以下のページの手順を参考に、コンディションを作成します。
    * ※各種設定
        * Location type : Country
        * Location : Japan - JP
    * [\[素朴な手順\]Cloudfrontに対してAWS WAFで地域制限をかけつつ特定IPからアクセス許可を入れてみました ｜ DevelopersIO](https://dev.classmethod.jp/cloud/waf-cloudfront-geographic-match-and-ip-match/)
1. 作成後の設定は、こんな感じ。
    * ![FireShot Capture 085 - AWS WAF & Shield - console.aws.amazon.com.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161939/88b914cc-72a8-3341-0104-da25eed74a2d.jpeg)

# ３．String and regex match コンディションの作成
1. 以下のページの手順を参考に、コンディションを作成します。
    * ※各種設定
        * 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
        * <b><font color="red">「Create pattern set and add filter」ボタンを押下するのを忘れないこと!!</font></b>
    * [AWS WAFを使って、特定のURLへの接続をブロックしてみた ｜ DevelopersIO](https://dev.classmethod.jp/cloud/aws/aws-waf-url/)
    * [AWS WAFが正規表現と地域条件をサポートしました ｜ DevelopersIO](https://dev.classmethod.jp/cloud/aws/aws-waf-support-regex-and-geo-match/)
1. 作成後の設定は、こんな感じ。
    * ![FireShot Capture 087 - AWS WAF & Shield - console.aws.amazon.com.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161939/c52b6218-33e6-8436-ea01-4c75f585010a.jpeg)
1. Regex pattern sets の設定は、こんな感じ。
    * Regex pattern strings
        * `.*/wp-cron.php`
        * `.*/wp-login.php`
    * ![FireShot Capture 088 - AWS WAF & Shield - console.aws.amazon.com.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161939/54e35fac-86db-f124-e3ac-63974df88be1.jpeg)

# ４．新しくルールを作成し、作成した各コンディションの設定を追加
1. 以下のページの手順を参考に、ルールを作成し、作成した各コンディションを設定します。
    * ※各種設定
        * 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 コンディション名
    * [\[素朴な手順\]Cloudfrontに対してAWS WAFで地域制限をかけつつ特定IPからアクセス許可を入れてみました ｜ DevelopersIO](https://dev.classmethod.jp/cloud/waf-cloudfront-geographic-match-and-ip-match/)
1. 作成後の設定は、こんな感じ。
    * ![FireShot Capture 086 - AWS WAF & Shield - console.aws.amazon.com.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161939/85ff02e6-3ba0-0869-f1ff-ccaf3b08a7e6.jpeg)

# ５．Web ACL に作成した新しいルールの設定を追加
1. 以下のページの手順を参考に、ルールを作成し、作成した各コンディションを設定します。
    * ※各種設定
        * Order : 新しく作成したルール
        * Rule type : Regular
        * Action : Block
    * [\[素朴な手順\]Cloudfrontに対してAWS WAFで地域制限をかけつつ特定IPからアクセス許可を入れてみました ｜ DevelopersIO](https://dev.classmethod.jp/cloud/waf-cloudfront-geographic-match-and-ip-match/)
1. 作成後の設定は、こんな感じ。
    * ![FireShot Capture 090 - AWS WAF & Shield - console.aws.amazon.com.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161939/2e7afa99-3b18-aebf-345e-9b5335a959f0.jpeg)

# ６．AWS WAF の設定を確認
1. 以下のサイト等を利用して、AWS WAF の設定が効いているか確認します。
    * [WebPageTest \- Website Performance and Optimization Test](https://www.webpagetest.org/easy.php)
    * [IE NetRenderer \- Internet Explorer Compatibility Check \-](https://netrenderer.com/)
    * [Browserling \- Live interactive cross\-browser testing](https://www.browserling.com/)
1. URL を入力し、「START TEST」ボタンを押下します。
    * ![FireShot Capture 092 - WebPageTest - Website Performance and Optimization Test - www.webpagetest.org.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161939/a512e733-e800-b01b-cb37-23fa254a73ef.jpeg)
1. ステータスコード 403 が帰ってきていることを確認します。
    * ![FireShot Capture 093 - WebPageTest Test Result - Dulles _ www.gen...t.com_wp-login.php - 05__ - www.webpagetest.org.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161939/58ab4b1f-91c8-0256-68f9-ab0e0fb56add.jpeg)

# ９９．ハマりポイント

* 今回は、それ程ハマったところは無かったんですが…。
<br><br>
* 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 から出来るんですが…。

# ＸＸ．まとめ

今回もクラスメソッドさんの記事に、おんぶにだっこで、助けて頂きました。
本当にありがたいですね。
🙇‍♂️

ご参考になれば♪