Перебор паролей при входе в GLPI: как блокировать атаки с помощью Security Guard

Security Guard, бесплатный для клиентов NexTool, блокирует перебор паролей в GLPI: веб-вход, API, CalDAV и восстановление пароля — по пользователю, по IP или по обоим.

В этой статьеРазделов: 10

Любая страница входа, доступная из интернета, получает попытки подобрать пароль, и страница GLPI — не исключение. По умолчанию GLPI не ограничивает, сколько раз можно ошибиться с паролем. Security Guard, модуль NexTool, бесплатный для клиентов NexTool, подсчитывает неудачи при веб-входе, в API, в CalDAV и при восстановлении пароля, временно блокирует тех, кто превысил лимит, и показывает всё на панели, не храня имя пользователя в открытом виде.

Проблема: перебор паролей при входе в GLPI

Перебор (brute force) — самая простая атака из всех: робот пробует комбинации логина и пароля, пока не угадает. Известные разновидности — credential stuffing (утёкшие с других сервисов пароли, которые проверяются в вашем GLPI) и password spraying (один распространённый пароль, например Mudar@123, проверяется сразу на множестве учётных записей). В GLPI хранятся заявки, инвентаризация, договоры и персональные данные тех, кто создаёт заявки. Скомпрометированная учётная запись специалиста открывает доступ ко всему этому.

В чистом GLPI веб-вход принимает попытки бесконечно. Риск можно снизить на периметре (WAF, fail2ban, читающий лог веб-сервера), но эти решения ничего не знают о GLPI: они не понимают, была ли попытка успешной, не отличают пользователя от IP и часто по ошибке блокируют прокси всей компании. Не хватало защиты внутри самого GLPI, которая понимает реальный результат входа.

Как работает Security Guard

При включённой защите модуль проверяет каждую попытку аутентификации в перечисленных ниже каналах, записывает результат — Успех, Неудача, Отказ (блокировка), Пропущено или Ожидание MFA — и сверяет его с заданными вами правилами. Когда правило срабатывает, следующие попытки по этому ключу получают HTTP 429 в формате, понятном клиенту: страница временной блокировки в браузере, JSON в API и текст в CalDAV — пока не истечёт срок или администратор не снимет блокировку. Пока блокировка активна, отклонённые попытки не становятся событиями: они только увеличивают счётчик блокировки.

  • Веб-вход: форма в /front/login.php.
  • REST API (v1): initSession с логином и паролем, Basic Auth или user_token. С user_token пользователя нет, поэтому учитываются только правила по IP. В GLPI 11 также учитывается путь /api.php/v1.
  • API v2 в GLPI 11: запрос токена в /api.php/token с логином и паролем.
  • CalDAV (Basic Auth): поскольку календарный клиент аутентифицируется при каждой синхронизации, событиями становятся только неверные пароли и отказы в доступе; успешный доступ ничего не записывает.
  • Восстановление пароля (lostpassword.php): каждый запрос нового пароля считается попыткой — по IP или по указанному e-mail. GLPI отвечает одинаково и для верного, и для неверного e-mail, поэтому правило ограничивает объём запросов и сдерживает массовую рассылку и перебор адресов e-mail.
  • Код MFA/TOTP в GLPI 11: попытки отображаются в событиях, как успешные, так и неудачные, но модуль не ограничивает ввод кода, потому что GLPI 11 сам блокирует после нескольких неверных попыток.

В консоли модуль предлагает:

  • Правила по области действия: каждое правило задаёт окно (в минутах), лимит неудач и длительность блокировки. Область может быть Пользователь, IP или Пользователь + IP, с приоритетом между правилами и необязательным фильтром по диапазону IP (CIDR) или по стране. В поле Каналы правило выбирает, где оно учитывается: веб-вход, REST API, API v2, CalDAV или восстановление пароля. Новое правило создаётся со всеми отмеченными каналами. При установке создаются два готовых неактивных правила: Пользователь + IP (5 неудач за 15 минут, блокировка на 15 минут) и IP (30 неудач за 15 минут, блокировка на 30 минут).
  • Исключения: пользователь, группа, профиль, сеть (CIDR) или страна, которые никогда не блокируются, даже если правило сработало. У каждого исключения может быть срок действия с датой начала и окончания.
  • GeoIP: с базой MaxMind GeoLite2 Country, загруженной прямо через интерфейс, модуль определяет страну каждого IP. Это наполняет панель и позволяет создавать правила и исключения по стране.
  • Панель: итоги за последние 24 часа по результату, строка «Последние 24 ч, по каналу», активные блокировки, правила и исключения, а также топ-10 IP, пользователей (замаскированных) и стран с наибольшим числом неудач и отклонённых попыток за последние 7 дней.
  • Блокировки: список активных блокировок с кнопкой снятия, создание ручной блокировки и полная история.
  • События: проверенные и классифицированные попытки в штатном поиске GLPI, со столбцом Канал и всегда замаскированным пользователем. Попытки, отклонённые во время активной блокировки, отображаются только в счётчике блокировки.
  • Тест: симуляторы определения IP и попытки входа, которые ничего не записывают; симулятор попытки позволяет выбрать канал. Вы узнаёте, что произойдёт, до того как включить правило.
Панель Security Guard в GLPI с итогами попыток входа за последние 24 часа по результату и топ-10 IP и замаскированных пользователей по числу неудач
Панель: успехи, неудачи и блокировки за последние 24 ч и главные нарушители за последние 7 дней (IP из документационных диапазонов и замаскированные пользователи)

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

Окно создания правила Security Guard с областью Пользователь плюс IP, окном 15 минут, лимитом 5 неудач и блокировкой на 15 минут
Создание правила: область, окно, лимит неудач, длительность блокировки, фильтры по IP и стране и приоритет

Безопасное включение, шаг за шагом

Security Guard поставляется выключенным: переключатель защиты выключен, а два правила, созданные при установке, неактивны. Установка модуля никого не блокирует. Но при выключенной защите модуль ничего не записывает: «понаблюдать, прежде чем блокировать» с выключенным переключателем не получится. Безопасный путь — включить защиту при всё ещё неактивных правилах и воспользоваться вкладкой Тест. Порядок ниже важен, потому что неверная настройка прокси может заблокировать всю компанию.

  1. Установите и активируйте модуль в NexTool > Модули > Security Guard. Консоль находится в NexTool > Security Guard.
  2. Настройте доверенные прокси ДО включения защиты. На вкладке Настройки укажите в поле Доверенные прокси (CIDR) сеть обратного прокси, стоящего перед GLPI (Nginx, NPM, HAProxy, балансировщик). Без этого модуль намеренно игнорирует заголовок X-Forwarded-For (его можно подделать) и видит IP прокси, а не пользователя.
  3. Если GLPI находится за Cloudflare, нажмите Добавить диапазоны Cloudflare. Кнопка добавляет в поле официальные диапазоны CDN, не удаляя то, что там уже есть, и не сохраняя автоматически. Оставьте также сеть вашего локального прокси и сохраните. Без диапазонов Cloudflare определённым IP был бы адрес границы CDN, общий для тысяч людей.
  4. Проверьте заголовок IP. По умолчанию используется X-Forwarded-For; меняйте его, только если ваш прокси использует X-Real-IP или Forwarded.
  5. Проверьте карточку «IP этого запроса». Она показывает REMOTE_ADDR, полученный заголовок и IP, который модуль определил бы сейчас. Определённый IP должен быть адресом вашего компьютера, а не прокси. Если появилось предупреждение «Вероятно, прокси не настроен», остановитесь и вернитесь к шагу 2.
  6. Включите Защиту от перебора паролей при всё ещё неактивных правилах. Без активного правила или ручной блокировки никто не блокируется, а Панель и вкладка События начинают показывать классифицированные попытки. На вкладке Тест убедитесь, что ваша обычная попытка не была бы заблокирована.
  7. Только после этого активируйте правило с областью Пользователь + IP на вкладке Правила и проверьте в поле Каналы, где оно будет учитываться. Готовое правило настроено на 5 неудач за 15 минут и блокировку на 15 минут.
Вкладка Настройки Security Guard с полем Доверенные прокси, заполненным сетью локального прокси и официальными диапазонами Cloudflare
Доверенные прокси: сеть локального прокси плюс диапазоны Cloudflare, добавленные кнопкой (нужно сохранить)
Карточка IP этого запроса в Security Guard с частным REMOTE_ADDR и предупреждением о вероятно не настроенном прокси
Карточка «IP этого запроса» предупреждает, когда перед GLPI стоит прокси, который ещё не отмечен как доверенный
Вкладка Тест Security Guard с симулятором попытки входа, показывающим, какие правила сработали бы для тестового пользователя и IP
Симулятор попытки: показывает исключение, активную блокировку и каждое правило, которое сработало бы, ничего не записывая

Рекомендации

  • Предпочитайте область Пользователь + IP. Она ловит робота, который атакует одну учётную запись с одного адреса, без побочных эффектов для других пользователей.
  • Осторожнее с областью Пользователь отдельно. Она позволяет кому угодно заблокировать учётную запись коллеги, просто намеренно вводя неверный пароль. Если используете её, ставьте высокий лимит и короткую длительность.
  • Осторожнее с областью IP отдельно за NAT. Целый офис обычно выходит в интернет через один публичный IP. Правило только по IP с низким лимитом наказывает всех за ошибку одного. Если используете его, задайте лимит значительно выше, чем у правила Пользователь + IP (готовое правило настроено на 30 неудач за 15 минут).
  • Добавляйте исключения обдуманно. Сеть головного офиса, профиль интеграции или учётная запись мониторинга могут стать исключениями, желательно со сроком действия.
  • Осторожнее с интеграциями через API. Система, интегрированная через API, которая в цикле вводит неверный пароль (например, старый), блокирует собственный IP. Добавьте её сеть в исключения или снимите отметку с этого канала в правиле.
  • Для восстановления пароля используйте лимит выше, чем для входа, и предпочитайте область IP или Пользователь + IP.
  • Поддерживайте базу GeoIP в актуальном состоянии. Обновление выполняется вручную; карточка предупреждает, когда базе больше 60 дней.
Вкладка Исключения Security Guard со списком исключений типа сеть с документационными диапазонами, сроком действия и причиной
Исключения по сети, пользователю, группе, профилю или стране, с необязательным сроком действия
Вкладка Блокировки Security Guard со списком активных блокировок, кнопкой ручной блокировки и историей с областью, замаскированным пользователем и IP
Блокировки: ручное снятие, ручная блокировка и полная история

Конфиденциальность

Запись попыток входа затрагивает персональные данные, поэтому стоит точно знать, что хранит модуль:

  • Имя пользователя никогда не записывается в открытом виде. Для сопоставления используется HMAC-SHA256 с собственным ключом инсталляции, а на экране отображается только маска (первая и последняя буква). При успешных входах событие также хранит ID пользователя в GLPI.
  • E-mail, указанный в запросах нового пароля, подчиняется тому же правилу: он хранится только в виде HMAC, а на экране отображается лишь маска.
  • IP и страна хранятся в открытом виде, потому что именно они являются объектом защиты.
  • Срок хранения событий задаёте вы: по умолчанию 90 дней и 30 дней для административного лога. Очистку выполняет автоматическое действие secguardmaintenance каждые 5 минут во внешнем режиме: оно зависит от cron GLPI, настроенного на сервере.
  • История блокировок не устаревает в этой версии и удаляется только действием «Удалить данные».
  • Удаление модуля сохраняет данные; для их удаления требуется явное действие «Удалить данные» с отдельным правом.

Права по экранам

Security Guard — консоль исключительно для администрирования. Права настраиваются в Администрирование > Профили > вкладка NexTool и зависят от экрана:

  • Панель: Просмотр панели;
  • События: Просмотр событий;
  • Блокировки: Просмотр блокировок, Снятие блокировок и Создание ручной блокировки;
  • Правила: Просмотр правил и Управление правилами;
  • Исключения: Просмотр исключений и Управление исключениями;
  • Настройки и вкладка Тест: Настройка;
  • Логи: Просмотр логов.

Любое действие всегда требует также права на просмотр экрана: тот, у кого есть только «Снятие блокировок» без «Просмотр блокировок», ничего снять не сможет. Так первая линия поддержки может, например, разблокировать пользователя, не имея возможности менять правила.

Ограничения этой версии

Говоря прямо: версия 0.2.0 охватывает веб-вход, REST API, API v2 в GLPI 11, CalDAV и восстановление пароля. Не охвачены или охвачены частично:

  • входы через SSO, SAML или REMOTE_USER, которые не проходят через пароль GLPI;
  • код MFA/TOTP в GLPI 11: попытки отображаются в событиях, но модуль не ограничивает ввод кода, потому что GLPI 11 сам блокирует после нескольких неверных попыток.

Также нет уведомлений о блокировке: ни e-mail, ни оповещений, ни webhook. Контроль ведётся через консоль — на Панели и вкладках Блокировки и События.

Кому подходит

Тем, кто публикует GLPI в интернете для внешних специалистов, клиентов или филиалов; сервисным компаниям, которые обслуживают несколько GLPI и должны демонстрировать контроль доступа на аудите; и тем, кто уже видел в логе веб-сервера сотни POST-запросов на вход из одного и того же места.

Совместимость

  • Версия: 0.2.0
  • GLPI: 10 и 11 (один и тот же артефакт работает в обеих версиях)
  • Плагин: NexTool 6.22.0 или новее
  • План: Бесплатный
  • Языки: интерфейс на португальском (Бразилия и Португалия), английском (США и Великобритания), испанском (Испания и Мексика), французском, итальянском и немецком

Следующий шаг

Security Guard входит в NexTool — экосистему модулей для расширения GLPI без доработок кода. Откройте страницу модуля или свяжитесь с командой, чтобы запросить демонстрацию.


Проверено командой NexTool Solutions. Снимки экрана сделаны в реальной среде GLPI с плагином NexTool; IP и пользователи заменены документационными диапазонами и масками.

Часто задаваемые вопросы

Нет. Защита поставляется выключенной, а правила, созданные при установке, неактивны. Блокировка возможна только после того, как администратор включит защиту и активирует правило или создаст ручную блокировку. Рекомендуется предварительно настроить доверенные прокси.

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

Укажите в качестве доверенных прокси сеть вашего локального прокси и диапазоны Cloudflare с помощью кнопки Добавить диапазоны Cloudflare на вкладке Настройки и сохраните. Затем проверьте в карточке IP этого запроса, что определённый IP — это адрес пользователя.

На вкладке Блокировки нажмите Снять у активной блокировки. В профиле должны быть права Просмотр блокировок и Снятие блокировок. Снятие действует для всех активных блокировок с тем же ключом.

Не в открытом виде. Сопоставление выполняется по HMAC с собственным ключом инсталляции, а на экране отображается только маска; при успешных входах событие хранит ID пользователя в GLPI. Для событий и административного лога срок хранения настраивается, по умолчанию 90 и 30 дней; история блокировок в этой версии не устаревает и удаляется только действием Удалить данные.

Нет. Версия 0.2.0 не отправляет уведомления о блокировке — ни по e-mail, ни оповещением, ни через webhook. Контроль ведётся через консоль — на Панели и вкладках Блокировки и События.

REST API — да, а также API v2 в GLPI 11, CalDAV и восстановление пароля; каждый канал выбирается в поле Каналы правила. Код MFA/TOTP в GLPI 11 только записывается в события, потому что GLPI 11 сам ограничивает неверные попытки. Вход через SSO, SAML или REMOTE_USER не охвачен, потому что не проходит через пароль GLPI.

Нет. После обновления существующие правила продолжают действовать только для веб-входа. Чтобы распространить правило на REST API, API v2, CalDAV или восстановление пароля, отметьте эти каналы в поле Каналы. Новое правило сразу создаётся со всеми отмеченными каналами.

Да. Один и тот же модуль работает в GLPI 10 и GLPI 11 с плагином NexTool 6.22.0 или новее.

Нужна помощь?