Joomla の管理画面の保存が 403 になる問題に、CRS の「Joomla 除外プラグイン」を作って公開しました

はじめに

ModSecurity と OWASP CRS(Core Rule Set)でサイトを守っていると、Joomla の管理画面で記事やモジュールを保存したときに、「Forbidden(403)」で止まることがあります。

CRS には WordPress や Drupal 向けの公式の除外プラグインがありますが、Joomla 向けのものはありません。そのため、これまではサイトごとに除外の設定を書いていました。

そこで、Joomla の管理画面のための除外を、CRS のプラグインの形にまとめて公開しました。先日公開したWordPress 除外プラグインのサブディレクトリ対応版に続く、2 つ目のプラグインです。

何が止まっていたのか

Joomla の管理画面では、記事の本文やカスタム HTML のモジュールに、ふつうの HTML を書いて保存します。この HTML が、CRS の規則に攻撃と誤って判断されることがあります。

  • 見出しや文字に style を付けた HTML が、XSS(クロスサイトスクリプティング)の規則に当たる
  • 「</strong>(下記参照)」のように、閉じタグのすぐ後ろに「(」が続く文が、コマンド実行の規則(932130)に当たる

後者は 1 回当たっただけで止まる規則なので、XSS の規則を外しただけでは保存できません。

プラグインがすること

除外は、できるだけ狭い範囲だけにかけます。

  • 管理画面(administrator/index.php)への POST だけ
  • Joomla のログインのセッションの Cookie がある要求だけ
  • 記事・モジュール・カテゴリ・サイトの設定の、本文の欄だけ
  • 外すのは、XSS の規則と 932130 だけ

ほかの欄、ほかの規則(SQL インジェクションやコマンド実行など)、GET の要求、サイトの表側は、これまでどおり CRS が検査します。

セッションの Cookie は、名前を決め打ちせず「Joomla のセッションの形をしているか」で見ます。そのため、Joomla の secret を変えたときや、サイトを足したときにも、設定を直す必要がありません。なお、この Cookie の条件は守りの境目ではありません。本当の守りは、Joomla 自身のログインと CSRF のトークンです。

使い方

Joomla をサブディレクトリに置いている場合は、設定ファイルで入口のパスを指定します。

# joomla-rule-exclusions-config.conf(/cms/ に Joomla がある場合)
SecAction \
    "id:9532020,\
    phase:1,\
    pass,\
    nolog,\
    setvar:'tx.joomla-rule-exclusions-plugin_path=/cms/'"

ルートに置いている場合は、プラグインを入れるだけで使えます。Host ごとに設定する例も、設定ファイルに書いてあります。

入手先

  • GitHub:https://github.com/futsure0/joomla-rule-exclusions-plugin
  • ライセンス:Apache License 2.0
  • 動作を確かめた環境:ModSecurity v2(Apache)・libmodsecurity v3(nginx)、Joomla 3.10 / 3.17
  • 規則の ID の範囲(9,532,000〜9,532,999)は、CRS のプラグインの登録簿に予約を申し込んでいます

使うときの注意

  • 対象は Joomla 3.x の標準の画面です。ほかの拡張機能(独自の欄を送るエディターなど)は対象外なので、必要に応じて個別に除外を足してください
  • 入れたあとは、ModSecurity のログで、意図しない要求が通っていないかを確かめてください
  • 管理画面(/administrator/)は、IP の制限や 2 段階認証などで、別に守ることをおすすめします

おわりに

WordPress 版とあわせて、ModSecurity と CRS を使うサイトの運用に役立てていただければうれしいです。不具合やご意見は、GitHub の Issue でお知らせください。

Futsure Co., Ltd.