Fuerza bruta en el login de GLPI: cómo bloquear ataques con Security Guard

Security Guard, gratuito para clientes NexTool, bloquea la fuerza bruta en GLPI: inicio de sesión web, API, CalDAV y recuperación de contraseña.

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): initSession con usuario y contraseña, Basic Auth o user_token. Con user_token no 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/token con 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.
Panel de Security Guard en GLPI con los totales de intentos de inicio de sesión de las últimas 24 horas por resultado y el top 10 de IP y usuarios enmascarados por fallos
Panel: éxitos, fallos y bloqueos de las últimas 24 h, y los mayores infractores de los últimos 7 días (IP de documentación y usuarios enmascarados)

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.

Formulario de regla de Security Guard con alcance Usuario más IP, ventana de 15 minutos, límite de 5 fallos y bloqueo de 15 minutos
Formulario de regla: alcance, ventana, límite de fallos, duración del bloqueo, filtros de IP y país y prioridad

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.

  1. Instala y activa el módulo en NexTool > Módulos > Security Guard. La consola está en NexTool > Security Guard.
  2. 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.
  3. 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.
  4. Revisa el header de IP. El valor por defecto es X-Forwarded-For; cámbialo solo si tu proxy usa X-Real-IP o Forwarded.
  5. 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.
  6. 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.
  7. 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.
Pestaña Configuración de Security Guard con el campo Proxies de confianza relleno con la red del proxy local y los rangos oficiales de Cloudflare
Proxies de confianza: la red del proxy local más los rangos de Cloudflare añadidos con el botón (hay que guardar)
Tarjeta IP de esta solicitud de Security Guard con un REMOTE_ADDR privado y el aviso de proxy probable no configurado
La tarjeta “IP de esta solicitud” avisa cuando hay un proxy delante que todavía no es de confianza
Pestaña Prueba de Security Guard con el simulador de intento de inicio de sesión mostrando qué reglas coincidirían para un usuario e IP de prueba
Simulador de intento: muestra excepción, bloqueo activo y cada regla que coincidiría, sin guardar nada

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.
Pestaña Excepciones de Security Guard con excepciones de tipo red con rangos de documentación, vigencia y motivo
Excepciones por red, usuario, grupo, perfil o país, con vigencia opcional
Pestaña Bloqueos de Security Guard con la lista de bloqueos activos, el botón de bloqueo manual y el historial con alcance, usuario enmascarado e IP
Bloqueos: liberación manual, bloqueo manual e historial completo

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.

Preguntas Frecuentes

No. La protección viene desactivada y las reglas creadas en la instalación vienen inactivas. Solo hay bloqueo después de que el administrador active la protección y active una regla o cree un bloqueo manual. Lo recomendable es configurar antes los proxies de confianza.

Usuario + IP es el recomendado. El alcance Usuario por sí solo permite bloquear la cuenta de un compañero fallando su contraseña a propósito, y el alcance IP por sí solo puede castigar a una oficina entera que sale por la misma IP pública.

Registra como proxies de confianza la red de tu proxy local y los rangos de Cloudflare, con el botón Añadir rangos de Cloudflare de la pestaña Configuración, y guarda. Después comprueba en la tarjeta IP de esta solicitud que la IP resuelta es la del usuario.

En la pestaña Bloqueos, haz clic en Liberar en el bloqueo activo. El perfil necesita los derechos Ver Bloqueos y Liberar bloqueos. La liberación vale para todos los bloqueos activos de la misma clave.

No en claro. La correlación se hace por HMAC con una clave propia de la instalación y la pantalla muestra solo una máscara; en los inicios de sesión correctos, el evento guarda el ID del usuario en GLPI. Los eventos y el log administrativo tienen retención configurable, 90 y 30 días por defecto; el historial de bloqueos no caduca en esta versión y solo se elimina con Borrar datos.

No. La versión 0.2.0 no envía notificación de bloqueo, ni por correo electrónico, ni por alerta, ni por webhook. El seguimiento se hace en la consola, en el Panel y en las pestañas Bloqueos y Eventos.

La API REST, sí, y también la API v2 de GLPI 11, CalDAV y la recuperación de contraseña, cada uno elegido en el campo Canales de la regla. El código MFA/TOTP de GLPI 11 solo se registra en los eventos, porque el propio GLPI 11 ya limita los intentos erróneos. El inicio de sesión por SSO, SAML o REMOTE_USER no está cubierto, porque no pasa por la contraseña de GLPI.

No. Tras la actualización, las reglas existentes siguen valiendo solo para el inicio de sesión web. Para extender una regla a la API REST, la API v2, CalDAV o la recuperación de contraseña, marca esos canales en el campo Canales. Una regla nueva ya nace con todos los canales marcados.

Sí. El mismo módulo funciona en GLPI 10 y en GLPI 11, con el plugin NexTool 6.22.0 o superior.

?Necesitas ayuda?