Toda pantalla de inicio de sesión expuesta a internet recibe intentos de adivinar la contraseña, y la de GLPI no es una excepción. De serie, GLPI no limita cuántas veces alguien puede equivocarse de contraseña. Security Guard, módulo de NexTool gratuito para clientes NexTool, cuenta los fallos en el inicio de sesión web, la API, CalDAV y la recuperación de contraseña, bloquea temporalmente a quien supera el límite y lo muestra todo en un panel, sin guardar el nombre de usuario en claro.
El problema: fuerza bruta en el login de GLPI
La fuerza bruta es el ataque más simple que existe: un robot prueba combinaciones de usuario y contraseña hasta acertar. Variantes conocidas son el credential stuffing (contraseñas filtradas de otros servicios probadas en tu GLPI) y el password spraying (una contraseña común, como Cambiar@123, probada en muchas cuentas a la vez). GLPI guarda los tickets, el inventario, los contratos y los datos personales de quienes abren tickets. Una cuenta de técnico comprometida abre todo eso.
En GLPI sin extensiones, el inicio de sesión web acepta intentos de forma indefinida. Se puede mitigar en el perímetro (WAF, fail2ban leyendo el log del servidor web), pero esas soluciones no conocen GLPI: no saben si el intento tuvo éxito, no distinguen usuario de IP y suelen bloquear por error el proxy de toda la empresa. Faltaba una protección dentro del propio GLPI, que entienda el resultado real del inicio de sesión.
Cómo funciona Security Guard
Con la protección activada, el módulo examina cada intento de autenticación en los canales de abajo, registra el resultado, como Éxito, Fallo, Denegado (bloqueo), Ignorado o MFA pendiente, y comprueba las reglas que definiste. Cuando una regla se supera, los siguientes intentos de esa clave reciben HTTP 429 en el formato que el cliente entiende: página de bloqueo temporal en el navegador, JSON en las API y texto en CalDAV, hasta que venza el plazo o un administrador lo libere. Mientras el bloqueo está activo, los intentos rechazados no se convierten en eventos: solo suman en el contador del bloqueo.
- Inicio de sesión web: el formulario en
/front/login.php. - API REST (v1):
initSessioncon usuario y contraseña, Basic Auth ouser_token. Conuser_tokenno hay usuario, así que solo cuentan las reglas por IP. En GLPI 11 también se cubre la ruta/api.php/v1. - API v2 de GLPI 11: la solicitud de token en
/api.php/tokencon usuario y contraseña. - CalDAV (Basic Auth): como el cliente de calendario se autentica en cada sincronización, solo las contraseñas incorrectas y los accesos denegados se convierten en eventos; el acceso correcto no guarda nada.
- Recuperación de contraseña (
lostpassword.php): cada solicitud de nueva contraseña cuenta como intento, por IP o por el correo electrónico indicado. GLPI responde igual con un correo correcto o incorrecto, así que la regla limita el volumen de solicitudes y frena los envíos masivos y el rastreo de correos. - Código MFA/TOTP de GLPI 11: los intentos aparecen en los eventos, con éxito y fallo, pero el módulo no limita el código, porque el propio GLPI 11 ya bloquea tras varios intentos erróneos.
En la consola, el módulo ofrece:
- Reglas por alcance: cada regla define la ventana (en minutos), el límite de fallos y la duración del bloqueo. El alcance puede ser Usuario, IP o Usuario + IP, con prioridad entre reglas y filtro opcional por rango de IP (CIDR) o por país. En el campo Canales, cada regla elige dónde cuenta: inicio de sesión web, API REST, API v2, CalDAV o recuperación de contraseña. Una regla nueva nace con todos marcados. La instalación crea dos reglas listas, inactivas: Usuario + IP (5 fallos en 15 minutos, bloqueo de 15 minutos) e IP (30 fallos en 15 minutos, bloqueo de 30 minutos).
- Excepciones: usuarios, grupos, perfiles, redes (CIDR) o países que nunca se bloquean, aunque una regla se dispare. Cada excepción puede tener vigencia con fecha de inicio y de fin.
- GeoIP: con una base MaxMind GeoLite2 Country subida desde la propia pantalla, el módulo resuelve el país de cada IP. Eso alimenta el panel y permite reglas y excepciones por país.
- Panel: totales de las últimas 24 horas por resultado, una fila con las últimas 24 horas por canal, bloqueos, reglas y excepciones activos, y el top 10 de IP, usuarios (enmascarados) y países con más fallos e intentos denegados en los últimos 7 días.
- Bloqueos: lista de los bloqueos activos con botón para liberar, creación de bloqueo manual y el historial completo.
- Eventos: los intentos evaluados y clasificados, en la búsqueda nativa de GLPI, con la columna Canal y el usuario siempre enmascarado. Los intentos rechazados durante un bloqueo activo aparecen solo en el contador del bloqueo.
- Prueba: simuladores de resolución de IP y de intento de inicio de sesión que no guardan nada; el simulador de intento permite elegir el canal. Descubres qué pasaría antes de activar una regla.

Un detalle que marca la diferencia: el módulo clasifica el resultado real del intento, mirando la respuesta que devolvió GLPI, y cuenta el intento en cuanto empieza. Un robot que dispara decenas de peticiones en paralelo no consigue superar el límite por una carrera entre ellas.

Activación segura, paso a paso
Security Guard viene desactivado: la protección viene con el interruptor apagado y las dos reglas creadas en la instalación vienen inactivas. Instalar el módulo no bloquea a nadie. Eso sí, con la protección desactivada el módulo no registra nada: no hay forma de “observar antes de bloquear” con el interruptor apagado. El camino seguro es activar la protección con las reglas aún inactivas y usar la pestaña Prueba. El orden de abajo importa, porque una configuración errónea del proxy puede bloquear a toda la empresa.
- Instala y activa el módulo en NexTool > Módulos > Security Guard. La consola está en NexTool > Security Guard.
- Configura los proxies de confianza ANTES de activar la protección. En la pestaña Configuración, indica en el campo Proxies de confianza (CIDR) la red del proxy inverso que está delante de GLPI (Nginx, NPM, HAProxy, balanceador). Sin eso, el módulo ignora a propósito el header
X-Forwarded-For(puede falsificarse) y ve la IP del proxy, no la del usuario. - Si GLPI está detrás de Cloudflare, haz clic en Añadir rangos de Cloudflare. El botón añade al campo los rangos oficiales de la CDN, sin borrar lo que ya hay y sin guardar por sí solo. Mantén también la red de tu proxy local y guarda. Sin los rangos de Cloudflare, la IP resuelta sería el borde de la CDN, compartido por miles de personas.
- Revisa el header de IP. El valor por defecto es
X-Forwarded-For; cámbialo solo si tu proxy usaX-Real-IPoForwarded. - Revisa la tarjeta “IP de esta solicitud”. Muestra el
REMOTE_ADDR, el header recibido y la IP que el módulo resolvería ahora. La IP resuelta tiene que ser la de tu equipo, no la del proxy. Si aparece el aviso “Proxy probable no configurado”, detente y vuelve al paso 2. - Activa la Protección contra fuerza bruta con las reglas todavía inactivas. Sin reglas activas ni bloqueos manuales, nadie queda bloqueado, y el Panel y la pestaña Eventos empiezan a mostrar los intentos clasificados. Usa la pestaña Prueba para confirmar que un intento normal tuyo no se bloquearía.
- Solo entonces activa una regla con alcance Usuario + IP en la pestaña Reglas y revisa, en el campo Canales, dónde va a contar. La regla lista viene con 5 fallos en 15 minutos y bloqueo de 15 minutos.



Buenas prácticas
- Prefiere el alcance Usuario + IP. Atrapa al robot que insiste en una cuenta desde una dirección, sin efectos secundarios para los demás usuarios.
- Cuidado con el alcance Usuario por sí solo. Permite que cualquiera bloquee la cuenta de un compañero con solo fallar su contraseña a propósito. Si lo usas, ponle un límite alto y una duración corta.
- Cuidado con el alcance IP por sí solo detrás de NAT. Una oficina entera suele salir por la misma IP pública. Una regla solo por IP, con límite bajo, castiga a todos por el error de uno. Si la usas, deja el límite muy por encima del de la regla Usuario + IP (la regla lista viene con 30 fallos en 15 minutos).
- Registra excepciones con criterio. La red de la sede, un perfil de integración o una cuenta de monitorización pueden entrar como excepción, preferiblemente con vigencia.
- Cuidado con las integraciones por API. Un sistema integrado por la API que falla la contraseña en bucle (una contraseña antigua, por ejemplo) bloquea su propia IP. Registra su red como excepción o desmarca ese canal en la regla.
- En la recuperación de contraseña, usa un límite más alto que el del inicio de sesión y prefiere el alcance IP o Usuario + IP.
- Mantén la base GeoIP actualizada. La actualización es manual; la tarjeta avisa cuando la base supera los 60 días.


Privacidad
Registrar intentos de inicio de sesión implica datos personales, así que conviene saber exactamente qué guarda el módulo:
- El nombre de usuario nunca se guarda en claro. La correlación usa un HMAC-SHA256 con una clave propia de la instalación, y la pantalla muestra solo una máscara (primera y última letra). En los inicios de sesión correctos, el evento guarda también el ID del usuario en GLPI.
- El correo electrónico indicado en las solicitudes de nueva contraseña sigue la misma regla: solo se guarda como HMAC, y la pantalla muestra solo una máscara.
- La IP y el país se guardan en claro, porque son el objeto mismo de la protección.
- En los eventos, el plazo de conservación lo defines tú: 90 días por defecto, y 30 días para el log administrativo. La limpieza la hace la acción automática
secguardmaintenance, cada 5 minutos, en modo externo: depende del cron de GLPI configurado en el servidor. - El historial de bloqueos no caduca en esta versión y solo se elimina con la acción “Borrar datos”.
- Desinstalar el módulo conserva los datos; borrarlos exige la acción explícita “Borrar datos”, con permiso propio.
Permisos por pantalla
Security Guard es una consola solo de administración. Los derechos están en Administración > Perfiles > pestaña NexTool y varían según la pantalla:
- Panel: Ver Panel;
- Eventos: Ver Eventos;
- Bloqueos: Ver Bloqueos, Liberar bloqueos y Crear bloqueo manual;
- Reglas: Ver Reglas y Gestionar Reglas;
- Excepciones: Ver Excepciones y Gestionar Excepciones;
- Configuración y pestaña Prueba: Configurar;
- Registros: Ver Registros.
Una acción siempre exige también el derecho de ver la pantalla: quien solo tiene “Liberar bloqueos” sin “Ver Bloqueos” no libera nada. Así, el equipo de primer nivel puede, por ejemplo, liberar a un usuario bloqueado sin poder tocar las reglas.
Limitaciones de esta versión
Para ser claros: la versión 0.2.0 cubre el inicio de sesión web, la API REST, la API v2 de GLPI 11, CalDAV y la recuperación de contraseña. Siguen fuera, o con cobertura parcial:
- los inicios de sesión por SSO, SAML o
REMOTE_USER, que no pasan por la contraseña de GLPI; - el código MFA/TOTP de GLPI 11: los intentos aparecen en los eventos, pero el módulo no limita el código, porque el propio GLPI 11 ya bloquea tras varios intentos erróneos.
Tampoco hay notificación de bloqueo: ni correo electrónico, ni alerta, ni webhook. El seguimiento se hace en la consola, en el Panel y en las pestañas Bloqueos y Eventos.
Para quién está indicado
Para quien publica GLPI en internet para técnicos externos, clientes o sucursales; para proveedores de servicios que operan varios GLPI y necesitan demostrar control de acceso en auditorías; y para quien ya ha visto, en el log del servidor web, cientos de POST al login llegando desde el mismo sitio.
Compatibilidad
- Versión: 0.2.0
- GLPI: 10 y 11 (el mismo artefacto funciona en los dos)
- Plugin: NexTool 6.22.0 o superior
- Plan: Gratuito
- Idiomas: pantallas en portugués (Brasil y Portugal), inglés (EE. UU. y Reino Unido), español (España y México), francés, italiano y alemán
Siguiente paso
Security Guard forma parte de NexTool, un ecosistema de módulos para ampliar GLPI sin personalizaciones de código. Consulta la página del módulo o habla con el equipo para una demostración.
Revisado por el equipo de NexTool Solutions. Las capturas de pantalla son del entorno real de GLPI con el plugin NexTool; las IP y los usuarios se sustituyeron por rangos de documentación y máscaras.