はじめに
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.