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

Другие вопросы по тегам