WAF(Web Application Firewall)としてmod_securityを導入したWebサーバで、
Redmineを動かす際、ハマった点等まとめました。
mod_securityによってRedmineの様子がおかしいときの傾向と特定方法
- フォームやファイル送信後にInternal Server Error(500)が表示される。
- (当たり前だけど)mod_securityはApacheにリクエストが到着した時に処理されるので、Redmineのlog/production.logを見ても何も記録されていない。
投稿前にプレビューをしていると、問題の文字列を含む本文が(プレビューの)正常処理として記録されていたりして混乱する。
- apacheのerrorログで、該当URIに関するModSecurityの文字がないか確認する。
- ↑があれば続いてauditログを確認
auditログ所在は/etc/httpd/conf/modsecurity.conf内をauditで検索する
- auditログを該当URIで検索し、同じ識別子で記録された一連のグループの中から、
誤判定されたルールのIDを控える。
識別子がa84cdd54の例
--a84cdd54-B--
POST /RedmineのURI/issues HTTP/1.1
Host: example.com
(中略)
--a84cdd54-H--
Message: Access denied with code 44 (phase 2). Match of "eq 0" against "MULTIPART_UNMATCHED_BOUNDARY" required. [file "/etc/httpd/conf.d/mod_security.conf"] [line "39"] [id "200003"] [msg "Multipart parser detected a possible unmatched boundary."]
ルールIDは**[id "200003"]**の部分
後はルールIDをもとに適切に除外する等の対策をする。
例1:ファイルサイズによってアップロードに失敗する時
- Redmineの設定パネルから添付ファイルのアップロード上限サイズを設定しても反映されない
- 画面の表記と異なるファイルサイズまでしかアップロードできない
mod_securityのSecRequestBodyLimitによって上限サイズが制限されている場合がある。
対策
httpd.conf等に
<IfModule mod_security2.c>
..略..
#SecRequestBodyLimit 5242880 #5MBを
SecRequestBodyLimit 52428800 #50MBに
..略..
</IfModule>
httpd.confのバーチャルホストやLocation/Directoryディレクティブ内に書いてもOK。
例2:「--」等、特定の文字列が含まれる本文が、Internal Server Errorとなる
テキストメールと同じように区切り線の意味で使おうとする人が良く引っかかる。
フォームのマルチパート(バイナリデータを含むリクエスト)を拒否する設定が、
本文中の「--」をHTTPヘッダーの
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarys.....
が含まれていると誤判定する模様。
対策
例1と同様に、httpd.conf等にredmineディレクトリ以下等に除外設定を行う
auditログのルールIDが[id"200003"]だった場合の例
<IfModule mod_security2.c>
SecRuleRemoveById 200003
</IfModule>
参考リンク