Вопрос или проблема
Я защищал свой корень /www паролем, используя файлы .htaccess
и .htpasswd
, и теперь я хотел бы узнать, возможно ли записывать недействительные попытки аутентификации. Я сначала подумал, что как успешные, так и недействительные попытки, включая предоставленный пароль, будут записываться в /var/log/apache2/error_log
, но, похоже, что в этот файл записывается только имя пользователя.
Мой сервер работает на apache 2.2.21
на osx 10.7.4
.
Почему вы хотите это сделать? Как отметил mricon, запись паролей в открытом виде крайне не рекомендуется, даже для отладки.
Может быть, mod_security
можно использовать так, как вам нужно, записывая HTTP-заголовки. Однако пароли не передаются в открытом виде браузером, поэтому вам нужно декодировать закодированную в Base64 последовательность.
Смотрите директивы SecAuditLog
и SecAuditLogParts
здесь.
Возможно, это больше подходит для ваших целей: Защита HTTP Auth от атак грубой силы
Я искал в интернете и наткнулся на хорошее объяснение, как это осуществить.
Сначала файл .htaccess
:
# скрипт, который будет сохранять недействительные попытки входа
ErrorDocument 401 /logging.php
AuthName "Мой сайт защищен паролем"
AuthUserFile /<FULLPATH>/.htpasswd
AuthType Basic
Require valid-user
# Установить переменную окружения REMOTE_USER при ошибке 401
RewriteEngine On
RewriteBase /
RewriteCond %{ENV:REDIRECT_STATUS} ^401$
RewriteRule .* - [E=REMOTE_USER:%{ENV:REDIRECT_REMOTE_USER}]
Затем сам скрипт, который будет вести учет:
if (isset($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])):
$fp = fopen(MYLOGFILE, 'a+');
$password = $_SERVER['PHP_AUTH_PW'];
$username = $_SERVER['PHP_AUTH_USER'];
$time = date('y-m-d/H:i:s');
$request = $_SERVER['REDIRECT_URL'];
fwrite($fp, $time . "\t" . $request . "\t" . $username . "https://serverfault.com/" . $password . "\r\n");
fclose($fp);
endif;
ob_start();
header("HTTP/1.1 401 Authorization Required",1);
header("Status: 401 Authorization Required",1);
echo '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head><title>401 Authorization Required</title></head><body>
<h1>Authorization Required</h1>
<p>Этот сервер не смог подтвердить, что вы имеете право
получить запрашиваемый документ. Либо вы предоставили неверные
учетные данные (например, ошибочный пароль), либо ваш
браузер не понимает, как предоставить
необходимые учетные данные. </p>';
exit();
Вышеуказанное работает прекрасно и сохраняет все недействительные имена пользователей и пароли в указанном файле журнала. У меня не получилось заставить работать пример ниже, но он дал мне несколько идей, как действовать дальше.
Каждая строка в выходном файле будет содержать нечто подобное:
13-01-01/12:12:16 - /www/ - username/password
Моя установка apache2 имеет такие сообщения журнала о неудачных попытках:
доступ к / не удался, причина: проверка идентификатора пользователя 'qwdsad' не настроена
Вы можете установить fail2ban, чтобы отфильтровать эти сообщения из журналов и предпринять что-то для их предотвращения.
Каждая строка в выходном файле будет содержать нечто подобное: 13-01-01/12:12:16 - /www/ - username/password
Не работает…
Мой журнал:
192.168.65.192 - user [25/Oct/2024:22:03:47 +0500] "GET / HTTP/1.1" 401 767 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36"
Ответ или решение
Логирование недействительных попыток входа с использованием .htaccess
и .htpasswd
— это важная задача для обеспечения безопасности веб-сервера. Ниже представлена подробная информация о том, как реализовать эту функциональность на сервере Apache 2.2.21, работающем на OSX 10.7.4.
Общий обзор процесса
Для того чтобы вести учет недействительных попыток аутентификации, вам необходимо:
- Настроить файл
.htaccess
для отображения специфической страницы ошибки при неудачных попытках входа. - Создать PHP-скрипт, который будет обрабатывать записи логов, включая недействительные логины и пароли.
Шаг 1: Настройка .htaccess
Вы можете изменять файл .htaccess
, чтобы он передавал данные о неудачных попытках. Пример конфигурации:
ErrorDocument 401 /logging.php
AuthName "My Password Protected Site"
AuthUserFile /<FULLPATH>/.htpasswd
AuthType Basic
Require valid-user
RewriteEngine On
RewriteBase /
RewriteCond %{ENV:REDIRECT_STATUS} ^401$
RewriteRule .* - [E=REMOTE_USER:%{ENV:REDIRECT_REMOTE_USER}]
В данном примере используется директива ErrorDocument
, чтобы перенаправить пользователя на logging.php
при неудачной аутентификации.
Шаг 2: Создание PHP-скрипта для логирования
Создайте файл logging.php
, который будет обрабатывать и записывать недействительные попытки входа:
<?php
if (isset($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])) {
$fp = fopen('MYLOGFILE', 'a+'); // Укажите полный путь к лог-файлу
$username = $_SERVER['PHP_AUTH_USER'];
$password = $_SERVER['PHP_AUTH_PW'];
$time = date('Y-m-d H:i:s'); // Используйте полный формат даты
$request = $_SERVER['REDIRECT_URL'];
// Запись лога: время запроса, URL и учетные данные
fwrite($fp, "$time\t$request\t$username/$password\r\n");
fclose($fp);
}
// Отправка HTTP 401 Unauthorized
header("HTTP/1.1 401 Authorization Required", true, 401);
exit('<!DOCTYPE HTML><html><head><title>401 Authorization Required</title></head>
<body><h1>Authorization Required</h1>
<p>This server could not verify that you are authorized to access the document requested.</p>
</body></html>');
?>
Этот скрипт будет записывать каждую недействительную попытку входа в указанный лог-файл в формате:
2024-01-01 12:12:16 /www/ username/password
Безопасность лога
Вы должны быть внимательны к безопасности логов, особенно к тому, как храните пароли. Логирование паролей в открытом виде крайне не рекомендуется, так как это создает потенциальные уязвимости. Рассмотрите возможность записи только имен пользователей и применяйте методы хеширования, если это возможно.
Альтернативные методы
Как уже обсуждалось, вы можете рассмотреть возможность использования модуля mod_security
. Этот модуль может более эффективно контролировать аутентификацию и логирование. Например, используя директивы SecAuditLog
и SecAuditLogParts
, вы сможете настроить более детализированное логирование попыток доступа.
Дополнительные инструменты
Для мониторинга и защиты от взломов, рекомендуем использовать инструменты, такие как Fail2Ban, которые могут анализировать логи и автоматически блокировать IP-адреса, с которых происходят подозрительные попытки входа.
Заключение
Логирование недействительных попыток входа — это многоуровневая задача, требующая баланса между безопасностью и функциональностью. Подходы, описанные выше, позволят вам эффективно отслеживать несанкционированные попытки доступа, сохраняя при этом внимание к безопасности вашего веб-приложения.