Mod_Securityで特定のルールを無視する設定(Nextcloudでの偽陽性を排除)
Nextcloudにmod_securityを導入するに当たり、気をつけなければならないのがファイルの閲覧や登録、入力処理中にMod_securityが不審な処理として判断してしまうこと(偽陽性)です。
そこで、
- 偽陽性と思われるログの調査
- 調査時の補助線引き
- 偽陽性になるルールを無視する設定
を行います。
ログ確認
/var/log/nextcloud_error.log
から、以下のようなログを見ました。
[Wed Sep 11 16:35:02.048442 2024] [security2:error] [pid 32762:tid 32762] [client aaa.bbb.ccc.ddd:56994] [client aaa.bbb.ccc.ddd] ModSecurity: Warning. Operator GE matched 5 at TX:inbound_anomaly_score. [file "/usr/share/modsecurity-crs/rules/RESPONSE-980-CORRELATION.conf"] [line "92"] [id "980130"] [msg "Inbound Anomaly Score Exceeded (Total Inbound Score: 5 - SQLI=0,XSS=0,RFI=0,LFI=0,RCE=0,PHPI=0,HTTP=0,SESS=0): individual paranoia level scores: 5, 0, 0, 0"] [ver "OWASP_CRS/3.3.5"] [tag "event-correlation"] [hostname "nextcloud.hoge.com"] [uri "/ocs/v2.php/apps/user_status/api/v1/heartbeat"] [unique_id "ZuFIJU_udFaqxqrJvRLaPQAAAAA"]
ここで見たいのは
- クライアントのIPアドレス
- どのようなルールIDを
- どのぐらい検知したか
です。
ログ確認のワンライナー
これらを確認するため、copilotの助けを借りてawkスクリプトを生成します。
awk '/ModSecurity/ {
ip = gensub(/.*\[client ([0-9.]+):.*/, "\\1", "g", $0);
rule_id = gensub(/.*\[id "([0-9]+)"\].*/, "\\1", "g", $0);
print rule_id, ip;
}' /var/log/nextcloud/nextcloud_error.log | sort | uniq -c
これを実行したところ、Mod_Securityがエラーとして検知したログの中から
36 911100 127.0.0.1
267 911100 aaa.bbb.ccc.ddd
65 920420 aaa.bbb.ccc.ddd
36 949110 127.0.0.1
267 949110 aaa.bbb.ccc.ddd
36 980130 127.0.0.1
267 980130 aaa.bbb.ccc.ddd
という結果を確認しました。127.0.0.1はローカルアドレス、aaa.bbb.ccc.dddも自分がアクセスしてきたIPアドレス。この間、自分がしていたのはNextcloudの設定変更やファイルの閲覧のみです。
Mod_securityが検知したルールIDを「偽陽性」と判断し、処置していきます。
Mod_Securityで特定のルールを検知させない処理
Apacheのバーチャルサイトで設定しているという形です。
設定ファイルの修正
- ファイルのバックアップ
sudo cp -ci /etc/apache2/sites-available/nextcloud.conf /path/to/backup/directory/nextcloud.conf.$(date +%Y%m%d)
設定ファイルやバックアップディレクトリは自分の環境に合わせます。
- バックアップ確認
diff -u /path/to/backup/directory/nextcloud.conf.$(date +%Y%m%d) /etc/apache2/sites-available/nextcloud.conf
エラー無く、差分も表示されていなければバックアップは成功です。
- ファイル修正
/etc/apache2/sites-available/nextcloud.conf
を以下のように修正していきます。(要root権限)
# Mod_security
## 最初は検知モード
SecRuleEngine DetectionOnly
## 偽陽性と判断したID
SecRuleRemoveById 911100
SecRuleRemoveById 920420
SecRuleRemoveById 949110
SecRuleRemoveById 980130
- ファイル修正確認
diff -u /path/to/backup/directory/nextcloud.conf.$(date +%Y%m%d) /etc/apache2/sites-available/nextcloud.conf
SecRuleRemoveById ID
で、これにマッチするパターンは無視します。
- 差分例
## 最初は検知モード
SecRuleEngine DetectionOnly
+
+## 偽陽性と判断したID
+SecRuleRemoveById 911100
+SecRuleRemoveById 920420
+SecRuleRemoveById 949110
+SecRuleRemoveById 980130
+
</VirtualHost>
設定ファイルの設定反映
- 構文確認
sudo apache2ctl configtest
Syntax OK
を確認します。
- 設定反映
sudo systemctl restart apache2.service
- Apache稼働確認
systemctl status apache2.service
active(running)
を確認します。
動作確認
ターミナルで
tail -f /var/log/nextcloud/nextcloud_error.log
としてエラーログを流します。(エラーログは自分の環境に合わせます)
- 上記処理を行ったNextcloudにアクセスして操作をしていきます。
- 処理を行ったIDが検知されないことを確認します。