Вопрос или проблема
Я работал над тем, чтобы получить журналирование тела POST-запроса с помощью ModSecurity.
В файле modsecurity.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:'Парсер многочастных данных обнаружил возможную непр matched границу.'"
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, вам необходимо убедиться, что конфигурация модуля корректна и настроена на захват информации о теле запроса. Вы уже сделали множество шагов в этом направлении, но давайте подробно разберем ваш сценарий.
Пошаговое руководство по настройке ModSecurity для логирования тела POST-запросов
-
Проверка включения обработки тел запросов
Вы уже включили опции
SecRequestBodyAccess On
и установили лимиты для тела запросов с помощьюSecRequestBodyLimit
иSecRequestBodyNoFilesLimit
. Это правильные шаги для обработки тела POST-запросов. -
Настройка правил для логирования
Вам необходимо убедиться, что модуль ModSecurity настроен на логирование тел запросов. Для этого можно использовать следующие правила. Добавьте или проверьте их наличие в вашем файле конфигурации
modsecurity.conf
:SecRule REQUEST_BODY "@rx .*" \ "id:300000, phase:2, t:none, log, logdata:'%{REQUEST_BODY}', msg:'POST Request Body logged.'"
Это правило будет ловить все POST-запросы и логировать их тела, когда они будут обработаны на фазе 2.
-
Проблемы с конфигурацией Apache
Из ваших логов видно сообщение об ошибке 403, что может указывать на проблемы с правами доступа. Убедитесь, что в вашем конфигурационном файле Apache, а также в файле
.htaccess
(если используется), разрешены соответствующие действия для URL-адреса, на который отправляется POST-запрос. Проверьте раздел<Directory>
и параметрыRequire all granted
. Например:<Directory "/var/www/html/logs"> Require all granted </Directory>
Проблема с 403 может предотвратить выполнение других правил, поэтому важно убедиться, что серверная конфигурация разрешает доступ к этому маршруту.
-
Анализив логов
После того, как вы внесете изменения, очистите логи ModSecurity и протестируйте отправку POST-запроса снова. Проверьте файл журнала
/var/log/modsec_audit.log
, где должны отображаться тела запросов:--7dd1fc75-A-- [12/Dec/2024:17:57:15.512829 +0000] Z1sj-0SllWNcXRhkj1sZUAAAAEo --7dd1fc75-B-- POST /logs HTTP/1.1 --7dd1fc75-C-- { "example": "data" } --7dd1fc75-E-- --7dd1fc75-H--
-
Общий аудит конфигурации
Если логирование по-прежнему не срабатывает, убедитесь в том, что Apache и модуль ModSecurity правильно загружены и активны. Проверьте зависимости и совместимость версий.
Заключение
Соблюдая указанные выше шаги, вы должны иметь возможность корректно настроить логирование тела POST-запросов в ModSecurity. Полученные логи помогут вам более эффективно отслеживать и диагностировать проблемы с запросами на вашем веб-сервере. Не забывайте, что ясность и точность ваших правил могут существенно повлиять на качество логирования.