Ограничение попыток по учётным записям

HydraBeginner
Практиковаться сейчас

Введение

Gearroom выдаёт оборудование местным мастерам. Участники входят, чтобы прочитать свои сведения о получении, возврате и упаковке. Ограничение входа должно приостанавливать повторный подбор паролей, но текущий счётчик общий для всех. Ошибки одного участника могут помешать другому начать работу.

Создайте небольшой повторяемый тест с Hydra, привяжите счётчик к учётной записи и продемонстрируйте защиту вместе с обычным доступом. Результат — действующая политика, настоящая аутентификация и неизменённые записи о выдаче, а не отчёт. Блокировать разрешено только указанного синтетического тестового участника. Для контрольного участника используйте только известный правильный пароль; не меняйте сервер, учётные записи и исходные записи.

Нужны базовый ввод в терминале, распознавание путей и переключение вкладок. Необходимые параметры Hydra, поля формы, кавычки оболочки и структура политики JSON объясняются здесь. Подготовленный терминал Workstation и сайт Equipment Desk — два интерфейса одного изолированного учебного контейнера. Этот модуль запускается независимо от других работ. Все люди, пароли и записи — локальные синтетические учебные данные.

Отведите около 55 минут с учётом чтения и обычных ошибок. Это авторская оценка, не результат замеров среди начинающих. Небольшое ограничение — три ошибки за 30 секунд и затем блокировка на 12 секунд — учебное условие, а не рекомендация для рабочей среды.

Подтвердите вход двух участников

На этом шаге откройте записи двух известных участников до проверки ограничения. Успешная аутентификация означает, что сервер принял конкретную личность; она определяет, какую запись вы можете видеть.

Откройте Equipment Desk. Выберите Review brief в верхней навигации. Разрешённый тестовый участник — member, пароль Member24. Обычный контрольный участник — reference, пароль Reference24. Это известные данные, искать пароли не требуется.

Настоящая форма входа с полями Member ID и Password

Используйте два подписанных поля и кнопку Sign in. Строка под формой показывает настоящий путь POST и передаваемые имена полей.

Выберите Member sign-in, введите тестовые данные и нажмите Sign in. Ожидайте Signed in as member. Выберите Open your record. Проверьте выдачу LN-204, Mina Park, Compact projector kit, получение Thursday 14:00, возврат Monday 10:00 и примечание о кабеле HDMI в боковом кармане. Выберите Sign out.

Исходная выдача тестового участника и примечание об упаковке

Сопоставьте Member и Record с оборудованием, получением, возвратом и примечанием. Успешный вход сам по себе не доказывает целостность исходной записи.

Снова выберите Member sign-in, используйте контрольные данные и откройте Open your record. Проверьте LN-119, Theo Bell, Portable audio recorder и примечание о ветрозащите. Снова выберите Sign out. Это разные записи, и сохранить обе — часть задачи. После успешного входа браузер обычно автоматически сохраняет cookie — выданный сервером идентификатор сеанса. Выход завершает этот сеанс.

Переключитесь на Workstation. Настроенный начальный каталог — /home/labex/project/login-limits. Команда pwd показывает текущий каталог:

pwd

Ожидается /home/labex/project/login-limits. Если вы перешли в другое место, cd меняет каталог:

cd /home/labex/project/login-limits

cat показывает файл. Прочитайте подготовленную политику:

cat policy.json

Это JSON — структурированный текст с именами полей в двойных кавычках. Двоеточия связывают имена со значениями, запятые разделяют поля, фигурные скобки окружают объект. Сейчас key равен global, поэтому один счётчик может включать разные учётные записи. failed_attempts, window_seconds и cooldown_seconds задают согласованные три ошибки, окно 30 секунд и блокировку на 12 секунд. entry_groups перечисляет подготовленные пути входа; в этом модуле сохраняйте это сопоставление. Группы входов вы исследуете в следующей независимой работе.

deskctl — подготовленная команда ограниченного обслуживания. Действие status читает настоящую активную политику, не выполняя вход, не очищая счётчики и не меняя сервис:

deskctl status

Активная политика должна совпадать с файлом. Редакция обозначает используемую сейчас политику. Последующее изменение файла не изменит активную политику, пока вы её не примените.

Наблюдайте проблему общего счётчика

На этом шаге отправляйте только предоставленные неверные пароли для разрешённого тестового участника, затем наблюдайте, как глобальный счётчик отклоняет и контрольного участника.

Оставайтесь в Workstation. Прочитайте полный файл разрешённых кандидатов:

cat wrong-passwords.txt
NotThis11
NotThis22
NotThis33
NotThis44
NotThis55

Все пять намеренно неверны для тестовой учётной записи. Не добавляйте настоящие данные и не проверяйте многократно другую запись. Hydra создаст ограниченное число попыток; это не соревнование скорости и не поиск пароля.

127.0.0.1 — адрес обратной петли учебного контейнера; порт 8080 ведёт к подготовленному локальному сервису, а не внешнему сайту. Основная форма отправляет запрос POST на /signin. POST передаёт именованные поля в теле. Здесь это username и password, разделённые &. Аргумент Hydra http-post-form состоит из трёх частей через двоеточие: путь, поля и условие ответа. ^USER^ и ^PASS^ — подстановки Hydra. S=Signed in as требует текст настоящего успешного ответа; ограниченная или отклонённая страница не должна считаться рабочим входом.

Параметры Hydra: -I игнорирует старое приглашение восстановления в рабочем каталоге, -l member фиксирует одного пользователя, -P указывает предоставленный файл паролей, -s — порт, -t 1 — одного исполнителя. Один исполнитель упрощает наблюдение небольшой последовательности, но не создаёт ограничение на сервере. Последний аргумент в одинарных кавычках остаётся одним аргументом даже с пробелами и &.

Следующий блок также использует curl, HTTP-клиент терминала. Он отделён от браузера и не переиспользует его сеанс автоматически. --data задаёт поля POST; -s скрывает индикатор, -o сохраняет тело, -w выводит статус HTTP. \n в кавычках добавляет перевод строки после статуса. Одинарные кавычки сохраняют &, пробелы и %{http_code} для curl, не позволяя оболочке их интерпретировать. Эти два диагностических входа используют известные правильные пароли.

Сначала дождитесь естественного истечения прежних попыток. deskctl wait наблюдает готовность, не сбрасывает счётчики и не добавляет попыток:

deskctl wait

Выполните следующие три команды вместе одним блоком. Они получают оба диагностических ответа во время 12-секундной блокировки, поэтому читать между командами не нужно:

hydra -I -l member -P wrong-passwords.txt -s 8080 -t 1 127.0.0.1 http-post-form '/signin:username=^USER^&password=^PASS^:S=Signed in as'
curl -s -o test-login.html -w 'Test member HTTP %{http_code}\n' --data 'username=member&password=Member24' http://127.0.0.1:8080/signin
curl -s -o reference-login.html -w 'Reference member HTTP %{http_code}\n' --data 'username=reference&password=Reference24' http://127.0.0.1:8080/signin

Hydra должна сообщить 0 valid password found, поскольку все кандидаты неверны. Обе диагностические строки должны показать HTTP 429. Код 429 означает ограничение попыток, а не неверный пароль. Curl может нормально завершиться при отказе HTTP, поэтому читайте статус и сохранённое тело, а не принимайте код выхода за аутентификацию. В этом сценарии третья отклонённая попытка запускает блокировку; последующие ограничиваются до проверки пароля.

grep ищет текст. Параметр -o показывает только совпавшие слова, без окружающей страницы HTML:

grep -o 'Too many attempts' reference-login.html

Правильный контрольный пароль тоже отклонён. В этом и состоит проблема сервиса: глобальный счётчик останавливает новый вход другого участника.

Прочитайте существующие события сервера:

deskctl events

Найдите member на /signin с результатами rejected, threshold, затем limited, после которых вход reference отмечен limited. Это реальные решения сервера, а не интерпретация вывода Hydra. История остаётся доступной после блокировки; ловить кратковременную страницу не требуется.

Если диагностика запоздала, дождитесь окончания deskctl wait и повторите тот же небольшой блок из трёх команд. При ошибке синтаксиса или подключения Hydra сначала исправьте аргумент в кавычках, адрес 127.0.0.1, порт 8080 или указанный путь, затем оценивайте результат. Ошибка подключения не доказывает успешную защиту. HTTP 400 указывает неверные поля формы, 404 — неверный путь. Исправляйте обычные ошибки без сброса среды.

Примените политику по учётным записям

На этом шаге измените только ключ счётчика, чтобы каждому участнику соответствовало независимое ограничение. Сохраните учебные значения и сопоставление входов.

Оставайтесь в Workstation. Следующая команда заменяет локальный policy.json. cat > policy.json записывает текст в файл; > перезаписывает существующий файл. Here-document передаёт строки до завершающего маркера EOF. Кавычки в 'EOF' сохраняют содержимое буквально. Маркер должен находиться отдельно на строке без начальных пробелов:

cat > policy.json <<'EOF'
{
  "key": "account",
  "entry_groups": {
    "/signin": "loans",
    "/mobile/signin": "loans"
  },
  "failed_attempts": 3,
  "window_seconds": 30,
  "cooldown_seconds": 12
}
EOF

Меняется только key: account группирует попытки по переданному идентификатору участника, а не объединяет все записи. Уменьшение порога до нуля, удаление учётной записи или отказ всем не сохранят нормальную работу.

Примените файл подготовленной управляющей командой:

deskctl apply policy.json --wait

apply проверяет файл и явно меняет действующую политику. --wait перед применением изменённой политики ждёт естественного конца текущей блокировки или частичного окна ошибок. Частичное окно может завершаться до 30 секунд. Во время ожидания старая политика остаётся активной. Команда не перезапускает сервис, не удаляет историю и не очищает активные счётчики. Повторное применение той же политики ничего не меняет и не разблокирует учётную запись.

При первом изменении ожидайте ok: true, changed: true и новую редакцию с key, равным account. Если этот же правильный файл уже применён, changed: false — нормальный результат.

deskctl status

Читайте действующую политику, а не только файл. Ошибка JSON обычно означает пропущенную запятую, кавычку или скобку: сравните файл с полным блоком, исправьте и примените снова. Неверная политика не меняет действующую. Не перезапускайте сервер и не редактируйте его реализацию ради прохождения проверки.

Докажите защиту и нормальное восстановление

На этом шаге проверьте действующую политику, сохраните доступ контрольного участника и подтвердите естественное восстановление ограниченного тестового участника.

Оставайтесь в Workstation. Начните с естественно завершившихся состояний счётчиков:

deskctl wait

Повторите весь блок. Пути, известные диагностические пароли и набор неверных кандидатов прежние; изменился активный ключ счётчика:

hydra -I -l member -P wrong-passwords.txt -s 8080 -t 1 127.0.0.1 http-post-form '/signin:username=^USER^&password=^PASS^:S=Signed in as'
curl -s -o test-login.html -w 'Test member HTTP %{http_code}\n' --data 'username=member&password=Member24' http://127.0.0.1:8080/signin
curl -s -o reference-login.html -w 'Reference member HTTP %{http_code}\n' --data 'username=reference&password=Reference24' http://127.0.0.1:8080/signin

Ожидайте ноль находок Hydra, Test member HTTP 429 и Reference member HTTP 200. Защищаемая запись всё ещё ограничена, а независимая контрольная может аутентифицироваться. Одного HTTP 200 недостаточно: проверьте личность в сохранённом теле:

grep -o 'Signed in as reference' reference-login.html
grep -o 'Too many attempts' test-login.html

Прочитайте решения новой редакции:

deskctl events

Должны быть порог и ограниченный вход member вместе с аутентифицированным входом reference. Только события текущей политики подтверждают исправление. История старой глобальной политики сохраняется, но не доказывает новую. Если вы остановились между командами и пропустили блокировку, дождитесь естественного конца и повторите тот же ограниченный блок; не расширяйте кандидатов и не очищайте счётчики.

Теперь дождитесь окончания блокировки тестового участника:

deskctl wait

Переключитесь на Equipment Desk. Выберите Member sign-in, используйте member / Member24, затем Sign in и Open your record. Должны сохраниться LN-204, Mina Park, Compact projector kit и все исходные сведения. Этот новый вход показывает восстановление после естественного окончания. Выберите Sign out, затем Member sign-in с reference / Reference24 и снова откройте LN-119. Подтвердите рекордер и примечание о ветрозащите, затем выйдите.

Наконец выберите Visitor guide. Публичная информация о получении остаётся доступной. Ваши входы curl в терминале и этот браузер используют отдельные сеансы; прежний ответ curl автоматически не авторизует браузер. Если запись возвращает 403, войдите через настоящую форму и используйте Open your record. Исправьте обычную опечатку в пароле или пути вместо перезапуска VM.

Ваш policy.json теперь соответствует реальной политике по учётным записям. У сервера есть настоящие доказательства текущей редакции: повторные ошибки, ограниченная попытка с правильным паролем, обычная контрольная аутентификация в тот же период и естественно восстановленный тестовый вход, при сохранении обеих исходных записей. Оценка читает существующие факты и публичные страницы; она не добавляет недостающие входы, не сбрасывает ограничения и не завершает восстановление за вас. Это контролируемое обучение с одним процессом доказывает заявленное локальное поведение, а не полноценную промышленную защиту от всех атак на аутентификацию.

Резюме

Ограниченной последовательностью Hydra вы обнаружили глобальный счётчик, применили политику по учётным записям без перезапуска или сброса сервиса и проверили отказ вместе с доступностью. Тестовый участник оставался ограниченным даже с правильным паролем, другой смог аутентифицироваться, а естественное окончание блокировки восстановило доступ к неизменённым записям. Результат подтверждают текущая политика и реальные решения сервера, а не пустой результат Hydra или один зелёный статус.