概要
Redmineでファイルをアップロードしようとした際、ModSecurity (WAF) によってブロックされ、エラーになる事象が発生しました。
その原因と事象解決のメモです。
環境
- Ubuntu 24.04
- Apache 2.4
- RedmineをApacheのMod_Passangerで稼働
- Redmine 5.1
- ModSecurity v2 / OWASP Core Rule Set (CRS)
事象の確認
環境をWebArenaからXServerに移行した直後。
Redmineのチケットでファイルをアップロードしようとすると、ファイルアップロードのプログレスバーが完了せず、アップロードできません。
原因の特定
こういうときの答えはたいがい、エラーログに書かれているのでそれを確認します。
見つけたログ(IPアドレスやホスト名は改変済み):
[Wed Aug 13 12:47:21.713637 2025] [security2:error] [pid 11190] [client AAA.BBB.CCC.DDD:40404] ModSecurity: Request body no files data length is larger than the configured limit (131072). [hostname "hoge.example.com"] [uri "/uploads.js"] [unique_id "aJwKye92u8EKc4H_FxCb5QAAABQ"], referer: https://hoge.example.com/issues/123
Request body no files data length is larger than the configured limit (131072)
これは、「ファイル以外のリクエストデータ(no files data
)のサイズが、設定された上限値(131072
バイト = 128KB)を超えています」という意味です。
Redmineは、ファイルをアップロードする際、ファイルそのものとは別に、チケットの題名や説明といったテキスト情報も同時にサーバーへ送信します。このテキスト情報の合計サイズが、ModSecurityのデフォルトの上限値である128KBを超えてしまったため、攻撃と誤認され、ブロックされる。
というのがAI(Gemini)の回答。
既にApacheのバーチャルサイトの.confファイルには
SecRequestBodyInMemoryLimit 524288000
SecRequestBodyLimit 524288000
と記述していますが、サーバの入れ替えと同時にModSecurityのCRSをアップデートしたことで設定が足りなかったようです。
ここまで分かれば、解決まであと少し。
対処手順
設定ファイルのバックアップ
ModSecurityのメイン設定ファイルで、SecRequestBodyNoFilesLimit
の上限値を設定で上書きしていきます。
- エラーを起こしているバーチャルサイトの.confファイルのバックアップ
sudo cp -pi /etc/apache2/site-available/redmine.conf /path/to/backup/directory/redmine.conf.$(date +%Y%m%d)
.confの名前やバックアップディレクトリは自分の環境に合わせます。
- バックアップ確認
diff -u /path/to/backup/directory/redmine.conf.$(date +%Y%m%d) /etc/apache2/site-available/redmine.conf
差分がなければ(エラーがなければ)バックアップ成功。
上限値を修正する
上述した設定ファイルを以下のように修正。
修正前(例):
SecRequestBodyInMemoryLimit 524288000
SecRequestBodyLimit 524288000
修正後(例):
SecRequestBodyInMemoryLimit 524288000
SecRequestBodyLimit 524288000
SecRequestBodyNoFilesLimit 524288000
両方の値を同じにしておくと、管理が分かりやすくなります。
なお、500MBとしているのは一時的に大きなファイルを置くこともあるからです。上限値は自分の運用方針やストレージ量に合わせましょう。
修正確認
- ファイル修正後の差分
diff -u /path/to/backup/directory/redmine.conf.$(date +%Y%m%d) /etc/apache2/site-available/redmine.conf
- 差分例
SecRequestBodyInMemoryLimit 524288000
SecRequestBodyLimit 524288000
+SecRequestBodyNoFilesLimit 524288000
と、追記した行が出てくることを確認します。
設定反映&動作確認
- confファイルの構文確認
sudo apache2ctl configtest
Syntax OK
を確認します。
- Webサービス(Apache)再起動
sudo systemctl restart apache2.service
- Webサービス(Apache)再起動確認
systemctl status apache2.service
Running(active)
を確認します。
- 動作確認
Redmineのチケット作成/編集画面でファイルが正常にアップロードできるようになれば対処完了です。
まとめ
新環境の構築時、最新のCRSを導入したため、旧環境をそのまま引き継いだというのが直接的な原因でした。
こういう罠があちこちに潜んでいるので、何かあったらログを見て事象を確かめるのが事象解消の近道です。
コメントを残す