さて、前回の続き。
- Ubuntu 22.04
- Apache 2.4.52
- ModSecurity (libapache2-mod-security2) 2.9.5-1
- OWASP ModSecurity Core Rule Set 3.3.2
- Nextcloud Hub 6 (27.1.2)
スマホのNextcloudアプリから画像ファイルをアップロードしようとすると、ModSecurity にブロックされて上手くいかない。
ログ(/var/log/apache2/modsecurity_audit.log)を見てみると…
--01fac117-B--
PUT /remote.php/dav/files/<UserName>/Documents/<Dir>/<FileName>.jpg HTTP/1.1
(中略)
--01fac117-H--
Message: Warning. Match of "within %{tx.allowed_request_content_type}" against "TX:content_type" required. [file "/usr/share/modsecurity-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf"] [line "956"] [id "920420"] [msg "Request content type is not allowed by policy"] [data "|image/jpeg|"]
…となっていて、「image/jpeg 形式のファイルの取り扱いは許可されていない。ルール920420に抵触している」と言われています。
前回、Nextcloud を邪魔しないように ModSecurity を設定した筈なのに。
いちおう確認してみると、やはり /usr/share/modsecurity-crs/rules/REQUEST-903.9003-NEXTCLOUD-EXCLUSION-RULES.conf には以下のようなルールが存在し、これが有効になっているので、画像アップロードは問題なく行える筈。
SecRule REQUEST_FILENAME "@contains /remote.php/webdav" \
"id:9003100,\
phase:2,\
pass,\
t:none,\
nolog,\
ctl:ruleRemoveByTag=attack-injection-php,\
ctl:ruleRemoveById=941000-942999,\
ctl:ruleRemoveById=951000-951999,\
ctl:ruleRemoveById=953100-953130,\
ctl:ruleRemoveById=920420,\
ctl:ruleRemoveById=920440,\
ver:'OWASP_CRS/3.3.2'"
/remote.php/webdav〜 へのアクセスの際は、ルールID:920420(コンテンツタイプの制限)などを無効にする、という設定です。
なのに何故。う〜ん。
頭を抱えつつログとルールを暫し眺めていたら気が付いたのですが、ログの方では、
/remote.php/dav/files/<UserName>/Documents/<Dir>/<FileName>.jpg HTTP/1.1
と、アクセスする先は /remote.php/dav になっています。でもルールの方を見てみると、
SecRule REQUEST_FILENAME "@contains /remote.php/webdav" \
「/remote.php/webdav へのアクセス時はルール92040を無効にする」と定義されています。
つまり、/remote.php/webdav〜 ではコンテンツタイプ制限が無効になっているけれど、 /remote.php/dav〜 では初期設定どおり image/jpeg を制限したままなので、画像をアップロードしたときにブロックされてしまう、ということではなかろうか。
なので、以下のようなルールを作成。
SecRule REQUEST_FILENAME "@contains /remote.php/dav" \ "id:90031,\ phase:2,\ pass,\ t:none,\ nolog,\ ctl:ruleRemoveByTag=attack-injection-php,\ ctl:ruleRemoveById=941000-942999,\ ctl:ruleRemoveById=951000-951999,\ ctl:ruleRemoveById=953100-953130,\ ctl:ruleRemoveById=920420,\ ctl:ruleRemoveById=920440,\ ver:'OWASP_CRS/3.3.2'"
これを、前回作成した /etc/modsecurity/modsec_local.conf に追加してファイルを保存。
REQUEST-903.9003-NEXTCLOUD-EXCLUSION-RULES.conf 内では、上記の ルール 9003100 の他に、9003105にも、
SecRule REQUEST_FILENAME "@contains /remote.php/webdav" \
という設定があり、9003116 にも
SecRule REQUEST_FILENAME "@rx (?:/public\.php/webdav/|/remote\.php/dav/uploads/)" \
という記述があります。
このふたつのルールも、webdav → dav に変更した上で新しい ID を振って、modsec_local.conf に追記しておいたほうが良いかもしれません。
設定が完了したら、いつものように文法チェック → Apache再起動。
Syntax OK ← …と出たら大丈夫
sudo systemctl restart apache2
はい、これでどうだ。
ひとまず、無事にファイルアップロードが完了するようになりました。
ModSecurity、めんどくさい…。
コメント