Включите ведение журнала тела POST с помощью modsecurity.

Вопрос или проблема

Я работал над тем, чтобы получить логи тела POST-запросов с помощью modsecurity.

В файле modecurity.conf я включил
/usr/lib/apache2/modules/mod_authz_core.so

это мой полный файл modsecurity.conf:

SecRuleEngine DetectionOnly
SecRequestBodyAccess On
SecRule REQUEST_HEADERS:Content-Type "^(?:application(?:/soap\+|/)|text/)xml" \
     "id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML"

SecRule REQUEST_HEADERS:Content-Type "^application/json" \
     "id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON"

SecRequestBodyLimit 13107200
SecRequestBodyNoFilesLimit 131072
SecRequestBodyLimitAction Reject
SecRequestBodyJsonDepthLimit 512
SecArgumentsLimit 1000
SecRule &ARGS "@ge 1000" \
"id:'200007', phase:2,t:none,log,deny,status:400,msg:'Не удалось полностью разобрать тело запроса из-за большого количества аргументов',severity:2"

SecRule REQBODY_ERROR "!@eq 0" \
"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Не удалось разобрать тело запроса.',logdata:'%{reqbody_error_msg}',severity:2"

SecRule MULTIPART_STRICT_ERROR "!@eq 0" \
"id:'200003',phase:2,t:none,log,deny,status:400, \
msg:'Тело многочастного запроса не прошло строгую валидацию: \
PE %{REQBODY_PROCESSOR_ERROR}, \
BQ %{MULTIPART_BOUNDARY_QUOTED}, \
BW %{MULTIPART_BOUNDARY_WHITESPACE}, \
DB %{MULTIPART_DATA_BEFORE}, \
DA %{MULTIPART_DATA_AFTER}, \
HF %{MULTIPART_HEADER_FOLDING}, \
LF %{MULTIPART_LF_LINE}, \
SM %{MULTIPART_MISSING_SEMICOLON}, \
IQ %{MULTIPART_INVALID_QUOTING}, \
IP %{MULTIPART_INVALID_PART}, \
IH %{MULTIPART_INVALID_HEADER_FOLDING}, \
FL %{MULTIPART_FILE_LIMIT_EXCEEDED}'"

SecStreamInBodyInspection On
SecRule MULTIPART_UNMATCHED_BOUNDARY "@eq 1" \
    "id:'200004',phase:2,t:none,log,deny,msg:'Парсер многочастного запроса обнаружил возможную несоответствующую границу.'"

SecPcreMatchLimit 1000
SecPcreMatchLimitRecursion 1000

SecRule TX:/^MSC_/ "!@streq 0" \
    "id:'200005',phase:2,t:none,log,deny,msg:'Внутренняя ошибка ModSecurity: %{MATCHED_VAR_NAME}'"

SecResponseBodyAccess Off
SecResponseBodyMimeType text/plain text/html text/xml
SecResponseBodyLimit 524288
SecResponseBodyLimitAction ProcessPartial
SecTmpDir /tmp/
SecDataDir /tmp/
SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus "^(?:5|4(?!04))"
SecAuditLogParts ABCH
SecAuditLogType Serial
SecAuditLog /var/log/modsec_audit.log
SecArgumentSeparator &
SecCookieFormat 0
SecUnicodeMapFile unicode.mapping 20127
SecStatusEngine Off

Теперь логи фактически выводят только часть A, B, H, как ниже:

--7dd1fc75-A--
[12/Dec/2024:17:57:15.512829 +0000] Z1sj-0SllWNcXRhkj1sZUAAAAEo 

--7dd1fc75-B--
POST /logs HTTP/1.1

-7dd1fc75-E--

--7dd1fc75-H--
Apache-Error: [file "mod_authz_core.c"] [line 879] [level 3] AH01630: клиенту отказано в доступе из-за конфигурации сервера: /var/www/html/logs

Запрос, для которого я хочу проверить это тело, действительно получает 403, как вы можете видеть выше. Но я все равно хочу увидеть тело POST-запроса.

Здесь есть несколько вопросов по этому поводу, но я попробовал все. Может кто-то помочь мне залогировать тело POST-запроса.

Ответ или решение

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

1. Настройка логирования тела запроса

Ваш текущий конфигурационный файл ModSecurity в основном настроен корректно для обработки и логирования тела POST-запросов. Однако, учитывая, что вы не получаете необходимую информацию в логах, следует убедиться, что срабатывают нужные правила для логирования тела запроса.

Изменения в конфигурации

Добавьте или измените следующее правило в вашем конфигурационном файле:

SecRule REQUEST_BODY "@rx .+" \
    "id:200008, phase:2, t:none, log, msg:'POST Request Body: %{REQUEST_BODY}'"

Это правило обеспечивает логирование содержимого тела POST-запроса. Оно срабатывает на любой текст, который присутствует в теле запроса, и записывает его в логи с идентификатором 200008.

2. Убедитесь, что другие настройки не блокируют логи

Причины, по которым вы могли не видеть тела запроса в логах, могут включать:

  • Ошибки в конфигурации фильтров: Проверьте, что правила и константы, которые вы используете (например, SecRequestBodyAccess On), правильно настроены и не конфликтуют друг с другом.
  • Проблемы с правами доступа: Логи могут не генерироваться должным образом, если конфигурация сервера Apache ограничивает доступ к определенным ресурсам. Убедитесь, что у вашего сервера есть необходимые права для записи в каталог логов.

3. Аудит логирования

Убедитесь, что параметры аудита также настроены правильно для отображения информации о запросах в аудите. Вы уже указали SecAuditLogParts ABCH, но чтобы логгировать тело запроса, добавьте также ResponseBody.

SecAuditLogParts ABCHz

Таким образом вы добавите часть D, которая содержит информацию о теле ответа. Обратите внимание, что логгировать тело ответа можно только если SecResponseBodyAccess On.

4. Проверка результатов

После внесения изменений, перезапустите сервер Apache и отправьте POST-запрос на ваш сервер. Проверьте файл логов ModSecurity, чтобы увидеть, отображается ли тело запроса. Логи должны выглядеть примерно так:

--7dd1fc75-A--
[12/Dec/2024:17:57:15.512829 +0000] Z1sj-0SllWNcXRhkj1sZUAAAAEo 

--7dd1fc75-B--
POST /logs HTTP/1.1
POST Request Body: { "key": "value" }

--7dd1fc75-E--

--7dd1fc75-H--
Apache-Error: [file "mod_authz_core.c"] [line 879] [level 3] AH01630: client denied by server configuration: /var/www/html/logs

Заключение

Эти изменения должны помочь вам успешно включить логирование тела POST-запроса в ModSecurity. Если у вас остались вопросы или возникли другие проблемы, рекомендуется проверить и обновить документацию по вашей версии ModSecurity, а также логи Apache для выявления возможных ошибок конфигурации.

Оцените материал
Добавить комментарий

Капча загружается...