はじめに
ModSecurity と OWASP CRS(Core Rule Set)で Web サイトを守っていると、WordPress の正しい操作が攻撃と見なされて止まることがあります。記事の「更新」や「公開」が 403 になる、管理画面の保存ができない、といった症状です。
CRS には、こうした誤検知を外すための公式の「WordPress 除外プラグイン」(coreruleset/wordpress-rule-exclusions-plugin)があります。私たちもこれを使っていますが、WordPress をサイトのルートではなく、サブディレクトリ(例:/blog/)に置いているサイトでは、そのままでは使いにくいことが分かりました。
そこで、サブディレクトリに置いた WordPress でも、その範囲だけで除外を効かせられるようにしたフォーク版を作り、公開しました。
何が困るのか
公式のプラグインは、有効にすると、そのサイト(ホスト)全体に WordPress 向けの除外がかかります。WordPress だけのサイトなら問題ありません。
ところが、次のようなサイトでは困ります。
- 1 つのドメインの中に、ほかの CMS(Joomla など)と WordPress が同居している
- /blog/ や /news/ など、サブディレクトリに WordPress を複数置いている
- 古いサイトの一部だけを WordPress で作っている
こうしたサイトでホスト全体に除外をかけると、WordPress ではない部分の守りまで緩んでしまいます。逆に、除外をかけないと WordPress の保存が止まります。
フォーク版でできること
設定ファイルで WordPress の入口のパス(例:/blog/)を指定すると、そのパスの下の要求にだけ、WordPress の除外が効くようになります。
- パスを指定しなければ、公式のプラグインと同じ動きです(指定したパスの外の要求には、プラグインが何もしません)
- 同じホストに WordPress が複数ある場合や、ほかの CMS と同居している場合にも使えます
- 除外の中身(どの規則を、どの項目から外すか)は公式のままです
設定の例:
# wordpress-rule-exclusions-config.conf に追記(/blog/ の下だけで除外を有効にする)
SecAction \
"id:9507011,\
phase:1,\
pass,\
nolog,\
setvar:'tx.wordpress-rule-exclusions-plugin_path=/blog/'"
入手先
- GitHub:https://github.com/futsure0/wordpress-rule-exclusions-plugin
- ライセンス:公式と同じ Apache License 2.0
- 動作を確かめた環境:ModSecurity v2(Apache)・libmodsecurity v3(nginx)、CRS v4.25.2、元にした公式プラグイン v1.2.0
使うときの注意
- 除外は、守りを一部緩める設定です。WordPress 本体・テーマ・プラグインの更新とあわせて使ってください
- 入れたあとは、ModSecurity のログで、意図しない要求が通っていないかを確かめてください
- 管理画面(/wp-admin/・wp-login.php)は、IP の制限や 2 段階認証などで、別に守ることをおすすめします
おわりに
この変更は、公式のプロジェクトへの提案(プルリクエスト)も検討しています。同じことで困っている方のお役に立てばうれしいです。不具合やご意見は、GitHub の Issue でお知らせください。
Futsure Co., Ltd.