Любая страница входа, доступная из интернета, получает попытки подобрать пароль, и страница 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 и попытки входа, которые ничего не записывают; симулятор попытки позволяет выбрать канал. Вы узнаёте, что произойдёт, до того как включить правило.

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

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



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


Конфиденциальность
Запись попыток входа затрагивает персональные данные, поэтому стоит точно знать, что хранит модуль:
- Имя пользователя никогда не записывается в открытом виде. Для сопоставления используется 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 и пользователи заменены документационными диапазонами и масками.