ModSecurity SecRule RESPONSE_BODY не работает - PullRequest
0 голосов
/ 02 мая 2019

У меня Ubuntu 18.10 с пакетами apache2, libapache2-mod-security2, modsecurity-crs с их конфигурацией по умолчанию, за исключением включения ведения журнала отладки ModSecurity и копирования modsecurity.conf-recommended и добавления SecRuleEngine On.

Я добавилновый SecRule в отдельный файл в /etc/modsecurity/

Содержимое /etc/modsecurity/sf4-modsec.conf содержит только одну строку:

SecRule RESPONSE_BODY "@rx <script" id:1000137,phase:4,deny,log,status:403

Я могу подтвердить, что это правило загружается так, как оно отображается вжурналы отладки с phase:1:

[02/May/2019:20:48:33 +0200] [localhost/sid#7f8e0d51a5c8][rid#7f8e108d20a0][/_profiler/empty/search/results][4] Recipe: Invoking rule 7f8e0d40d138; [file "/etc/modsecurity/sf4-modsec.conf"] [line "1"] [id "1000137"].
[02/May/2019:20:48:33 +0200] [localhost/sid#7f8e0d51a5c8][rid#7f8e108d20a0][/_profiler/empty/search/results][5] Rule 7f8e0d40d138: SecRule "RESPONSE_BODY" "@rx <script>" "phase:1,auditlog,id:1000137,deny,log,status:403"
[02/May/2019:20:48:33 +0200] [localhost/sid#7f8e0d51a5c8][rid#7f8e108d20a0][/_profiler/empty/search/results][4] Rule returned 0.
[02/May/2019:20:48:33 +0200] [localhost/sid#7f8e0d51a5c8][rid#7f8e108d20a0][/_profiler/empty/search/results][9] No match, not chained -> mode NEXT_RULE.
[02/May/2019:20:48:33 +0200] [localhost/sid#7f8e0d51a5c8][rid#7f8e108d20a0][/_profiler/empty/search/results][4] Recipe: Invoking rule 7f8e0d40f5a0; [file "/etc/modsecurity/crs/crs-setup.conf"] [line "845"] [id "900990"].

Тем не менее, он не появляется в журналах, если указано с phase:4 (я не смог найти строку с 1000137 в нем.)

Я бы ожидал, что это правило будет блокировать каждую страницу с <script> внутри HTML, но это не так, несмотря на то, что тег <script> на 100% находится в ответе.Однако установленные правила из набора OWASP CRS, кажется, работают безупречно.

Моя конфигурация обработки тела ответа:

SecResponseBodyAccess On
SecResponseBodyMimeType text/plain text/html text/xml
SecResponseBodyLimit 524288
SecResponseBodyLimitAction Reject

Я пытался перезапустить Apache с помощью sudo service apache2 restart несколько раз.

Я попытался отключить все правила OWASP CRS, но это все равно не помогло.Вот мой журнал отладки с фазой 4: https://pastebin.com/8aXk8hL0 (это довольно коротко)

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Я провел ночи, пытаясь выяснить, почему это не сработало.

Причина в технических ограничениях ModSecurity.Вы можете увидеть проблему здесь: https://github.com/SpiderLabs/ModSecurity/issues/1658

Если вы используете mod_rewrite вместе с Apache, невозможно применить правила фазы: 3 или фазы: 4, а также правила из указанных фаз.не выполняется вообще.

0 голосов
/ 03 мая 2019

Ваши правила - это правило фазы 1, оно должно быть правилом фазы 4 для просмотра тел ответов.

Фазы следующие :

  1. Заголовки запроса
  2. Тело запроса
  3. Заголовки ответа
  4. Тело ответа
  5. Вход

Таким образом, правило фазы 1 имеет доступ только к заголовкам запросов и обрабатывается до того, как тело запроса обрабатывается Apache, и до того, как Apache выполняет запрос, и ответ создается.

Однако, даже если вы переместите это правило в фазу 4, другие правила могут остановить эту фазу. Например, OWASP CRS v2 имеет optional_rules/modsecurity_crs_10_ignore_static.conf file со следующим правилом:

# HTML
SecRule REQUEST_FILENAME "\.(?:(?:cs|j)s|html?)$"  "phase:2,t:none,t:lowercase,setvar:tx.text_file_extension=1,allow:phase,nolog,id:'999005',severity:'6'"

Выполняется на этапе 2 и говорит, что все файлы, оканчивающиеся на .html (а также .js и .css, но, вероятно, здесь менее релевантные), пропускаются (поэтому пропустите оставшуюся часть этапа 2, а также этап 3 и этап 4 - фаза 5 - это особая фаза, которая всегда выполняется). Это будет означать, что ваше правило фазы 4 не выполняется для файлов .html.

Подобные правила используются из соображений производительности, поскольку эти файлы, если они не генерируются динамически, менее рискованны, поэтому нет необходимости запускать полный набор правил для них.

Если вы действительно хотите запустить правила фазы 4, вам нужно отключить это правило, либо 1) не включая этот файл, либо 2), явно исключив это правило с помощью следующей конфигурации:

SecRuleRemoveById 999005

Но тогда вы можете захотеть добавить другое правило, чтобы оно работало для файлов css и js.

И на этой ноте сканирование исходящих тел стоит дорого. Обычно входящие HTTP-запросы невелики (если вы не являетесь сайтом загрузки), но исходящие запросы часто будут большими, поэтому по умолчанию SecResponseBodyAccess отключено. Вы уверены, что хотите это сделать? Не уверен, что вы пытаетесь достичь, но могут быть более эффективные способы достижения вашей цели (например, с помощью политики безопасности контента).

...