WordPress をサブディレクトリに置いたサイトでも使える、CRS「WordPress 除外プラグイン」のフォーク版を公開しました

はじめに

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/'"

入手先

使うときの注意

  • 除外は、守りを一部緩める設定です。WordPress 本体・テーマ・プラグインの更新とあわせて使ってください
  • 入れたあとは、ModSecurity のログで、意図しない要求が通っていないかを確かめてください
  • 管理画面(/wp-admin/・wp-login.php)は、IP の制限や 2 段階認証などで、別に守ることをおすすめします

おわりに

この変更は、公式のプロジェクトへの提案(プルリクエスト)も検討しています。同じことで困っている方のお役に立てばうれしいです。不具合やご意見は、GitHub の Issue でお知らせください。

Futsure Co., Ltd.