Мне нужно войти в систему, когда пользователь не может войти в веб-приложение. К сожалению, это веб-приложение не может сделать это из коробки, и я не могу его изменить.
Сейчас экспериментирую с mod_security. Моя идея состоит в том, чтобы отслеживать POST-запрос, извлекать имя пользователя, а затем проверять, перенаправляется ли пользователь на страницу с ошибкой входа в систему.
У меня есть:
<Location /login.php>
# Sanitize password variable value
SecAction nolog,phase:2,sanitiseArg:password
SecRule REQUEST_BODY "username=(.*)&password" "capture,log,logdata:'login submitted: user %{TX.1}'"
</Location>
и
<Location /loginfailed.php>
# Filter und log redirects to loginfailed
SecRule RESPONSE_BODY "loginfailed.php" "phase:4,t:none,log,logdata:'login failed: %{TX.1}'"
</Location>
Но, конечно, "TX.1" уже сброшен, когда мне это нужно во второй раз.
Может ли кто-нибудь подсказать, как это решить?
Спасибо!
Если веб-приложение не включает информацию об имени пользователя в перенаправлении (например, в строке запроса /loginfiled.php?username=foobar
или в файле cookie) не будет возможности извлечь имя пользователя из /loginfailed.php
запрос. Информация просто не для извлечения. HTTP не имеет состояния, поэтому, когда клиент отправляет username=foo
в теле запроса POST, и это приводит к перенаправлению 302, последующий запрос на /loginfailed.php
ничего не знает о предыдущем запросе.
Если это веб-приложение использует перенаправление 307 вместо 302 или 303, последующий запрос на /loginfailed.php
будет запрос POST со всеми теми же данными. Я ожидал, что это маловероятно.
Загляните в файлы cookie или в хранилище сеансов и посмотрите, есть ли там имя пользователя. (Я не уверен, что mod_security
может читать хранилище сеансов, но если вы знаете, что оно есть, я уверен, что вы что-то поймете.)
Возможно, вам повезет больше с CustomLog
для регистрации того, была ли попытка входа успешной или неудачной во время исходного запроса, а не последующего запроса:
LogFormat "%h %t \"%r\" %>s %{Location}o %{PHPSESSID}C %{UNIQUE_ID}e" loginslog
CustomLog "/var/log/apache2/logins.log" loginslog
или вы можете просто добавить Location:
заголовок и уникальный идентификатор ваших обычных журналов с %{Location}o %{UNIQUE_ID}e
. mod_security
включает уникальный идентификатор во все свои журналы, чтобы вы могли легко сопоставить другой.
Создание последовательного журнала всех имен пользователей, которые не смогли войти в систему, - это вопрос поиска всех Location:.*/loginfailed.php
линии из logins.log
а затем сопоставление уникальных идентификаторов с именами пользователей в вашем существующем журнале на основе mod_security.