Настроить страницу ошибок, чтобы показать журнал modsecurity
Я искал способ, чтобы информация о сообщении правила (которое было сработало) появлялась в файлах журнала ошибок и / или аудита и отправлялась обратно клиенту в заголовках ответов. Я понимаю, что есть фаза "msg", но она не отправляет обратно клиенту в ответных заголовках информацию, поэтому она мне не помогает. Я хочу видеть информацию о журнале на странице ошибок в HTML, что я могу сделать? спасибо за помощь, Влади.
2 ответа
Это плохая идея сообщить клиенту, что именно пошло не так. Хакер может использовать это для обхода вашей системы безопасности. Гораздо лучший подход - это сочетание mod_unique_id
и настраиваемые страницы ошибок. Шаги, чтобы следовать:
- включить
mod_unique_id
с вашей конфигурацией apache - создайте настроенные страницы ошибок для интересующих вас кодов возврата http (пример ниже)
- включить тех, кто в вашей конфигурации Apache (
ErrorDocument 403 /<url_path_to>/403.php
для этого примера)
Вот пример для страницы ошибки 403, давайте назовем ее 403.php
(и нет, чисто статическая страница не будет работать):
<?php
$protocol = $_SERVER['SERVER_PROTOCOL'];
header("$protocol 403 Forbidden");
header("Status: 403 Forbidden");
header("Connection: close");
$msg = $_SERVER["UNIQUE_ID"];
?>
<HTML><HEAD>
<TITLE>You have no access to this resource (403)</TITLE>
</HEAD><BODY>
<P>An error occured. Please tell the admin the error code: <?php echo $msg; ?></P>
</BODY></HTML>
Это просто очень сокращенный вариант без стилевого оформления и т. Д. (Возможно, вы захотите улучшить его), но я, между прочим, оставил его простым для понимания. $msg
напечатает уникальный код Клиент может сообщить вам этот код, и вы можете использовать его для поиска точной строки в вашем журнале ошибок, где вы увидите, какое правило вызвало его и т. Д.
Если вы не хотите использовать внешние данные (mod_perl, mod_php и т. Д.), Потому что, например, вы используете внешний обратный прокси-сервер и не хотите раскрывать большую поверхность для атаки, вы можете использовать SSI (Server Side Include), поскольку apache поддерживает SSI внутренне с помощью mod_include.
Просто загрузите mod_include, затем добавьте это в свои виртуальные хосты:
# Custom 403 HTML error with base64 encoded date + uniqueid on response
<Directory /var/www/html/common/_Errors>
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
Options +Includes
</Directory>
ErrorDocument 403 /common/_Errors/403.shtml
<Location "/common/_Errors/403.shtml">
# don't block redirected error page due rule to correlation
SecRuleRemoveById 980130
</Location>
Затем создайте HTML-файл /var/www/html/common/_Errors/403.shtml, содержащий что-то вроде этого:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>Your request was denied.</p>
<!--#config timefmt="%Y-%m-%d %H:%M:%S" -->
<p><pre><!--#set var="ERR" value="${DATE_LOCAL} - ${UNIQUE_ID}" --></pre></p>
<p><pre><!--#echo encoding="base64" var="ERR" --></pre></p>
</body></html>
При желании вы можете изменить #config timefmt в соответствии с форматом даты и времени.
SSI на mod_include создаст HTML-ответ, расширяющий переменную ERR с помощью DATE_LOCAL и UNIQUE_ID, и закодирует вывод как строку base64. Достаточно, чтобы я получил уникальный идентификатор для сработавшего правила и его дату.