Вопрос или проблема
Я работал над тем, чтобы получить логи тела 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 для выявления возможных ошибок конфигурации.