Ogni schermata di login esposta su internet riceve tentativi di indovinare la password, e quella di GLPI non fa eccezione. Di serie, GLPI non limita quante volte si può sbagliare la password. Security Guard, modulo di NexTool gratuito per i clienti NexTool, conta gli errori nel login web, nell'API, in CalDAV e nel recupero della password, blocca temporaneamente chi supera il limite e mostra tutto in un pannello, senza conservare il nome utente in chiaro.
Il problema: forza bruta sul login di GLPI
La forza bruta è l'attacco più semplice che esista: un bot prova combinazioni di utente e password finché non indovina. Varianti note sono il credential stuffing (password trafugate da altri servizi provate sul Suo GLPI) e il password spraying (una password comune, come Cambiare@123, provata su molti account contemporaneamente). GLPI contiene i ticket, l'inventario, i contratti e i dati personali di chi apre i ticket. Un account da tecnico compromesso apre l'accesso a tutto questo.
In GLPI standard, il login web accetta tentativi all'infinito. Si può mitigare sul perimetro (WAF, fail2ban che legge il log del server web), ma queste soluzioni non conoscono GLPI: non sanno se il tentativo è riuscito, non distinguono l'utente dall'IP e spesso bloccano per errore il proxy dell'intera azienda. Mancava una protezione all'interno di GLPI stesso, capace di capire l'esito reale del login.
Come funziona Security Guard
Con la protezione attiva, il modulo esamina ogni tentativo di autenticazione sui canali elencati qui sotto, registra l'esito, per esempio Successo, Errore, Negato (blocco), Ignorato o MFA in sospeso, e verifica le regole che Lei ha definito. Quando una regola viene superata, i tentativi successivi per quella chiave ricevono HTTP 429 nel formato che il client comprende: una pagina di blocco temporaneo nel browser, JSON nelle API e testo in CalDAV, finché non scade il termine o un amministratore non revoca il blocco. Mentre il blocco è attivo, i tentativi respinti non diventano eventi: si sommano solo al contatore del blocco.
- Login web: il form su
/front/login.php. - API REST (v1):
initSessioncon login e password, Basic Auth ouser_token. Conuser_tokennon c'è un utente, quindi contano solo le regole per IP. In GLPI 11 è coperto anche il percorso/api.php/v1. - API v2 di GLPI 11: la richiesta di token su
/api.php/tokencon utente e password. - CalDAV (Basic Auth): poiché il client del calendario si autentica a ogni sincronizzazione, diventano eventi solo le password errate e gli accessi negati; l'accesso corretto non registra nulla.
- Recupero della password (
lostpassword.php): ogni richiesta di nuova password conta come tentativo, per IP o per l'indirizzo e-mail indicato. GLPI risponde allo stesso modo con un indirizzo giusto o sbagliato, quindi la regola limita il volume delle richieste e frena gli invii di massa e la scansione degli indirizzi e-mail. - Codice MFA/TOTP di GLPI 11: i tentativi compaiono negli eventi, sia riusciti sia falliti, ma il modulo non limita il codice, perché GLPI 11 stesso blocca già dopo diversi tentativi errati.
Nella console, il modulo offre:
- Regole per ambito: ogni regola definisce la finestra (in minuti), il limite di errori e la durata del blocco. L'ambito può essere Utente, IP o Utente + IP, con priorità tra le regole e filtro facoltativo per intervallo di IP (CIDR) o per paese. Nel campo Canali, ogni regola sceglie dove conta: login web, API REST, API v2, CalDAV o recupero della password. Una regola nuova nasce con tutti i canali selezionati. L'installazione crea due regole pronte, inattive: Utente + IP (5 errori in 15 minuti, blocco di 15 minuti) e IP (30 errori in 15 minuti, blocco di 30 minuti).
- Eccezioni: utenti, gruppi, profili, reti (CIDR) o paesi che non vengono mai bloccati, anche quando una regola scatta. Ogni eccezione può avere un periodo di validità con data di inizio e di fine.
- GeoIP: con una base MaxMind GeoLite2 Country caricata dalla schermata stessa, il modulo risolve il paese di ogni IP. Questo alimenta il pannello e consente regole ed eccezioni per paese.
- Pannello: totali delle ultime 24 ore per esito, una riga con le ultime 24 ore per canale, blocchi, regole ed eccezioni attivi, e la top 10 di IP, utenti (mascherati) e paesi con più errori e tentativi negati negli ultimi 7 giorni.
- Blocchi: l'elenco dei blocchi attivi con il pulsante per sbloccare, la creazione di blocchi manuali e lo storico completo.
- Eventi: i tentativi valutati e classificati, nella ricerca nativa di GLPI, con la colonna Canale e l'utente sempre mascherato. I tentativi respinti durante un blocco attivo compaiono solo nel contatore del blocco.
- Test: simulatori di risoluzione dell'IP e di tentativo di login che non salvano nulla; il simulatore di tentativo permette di scegliere il canale. Lei scopre cosa succederebbe prima di attivare una regola.

Un dettaglio che fa la differenza: il modulo classifica l'esito reale del tentativo, guardando la risposta restituita da GLPI, e conta il tentativo non appena inizia. Un bot che invia decine di richieste in parallelo non riesce a superare il limite sfruttando una corsa tra di esse.

Attivazione sicura, passo per passo
Security Guard arriva disattivato: l'interruttore della protezione è spento e le due regole create durante l'installazione sono inattive. Installare il modulo non blocca nessuno. Però, con la protezione spenta, il modulo non registra nulla: non è possibile “osservare prima di bloccare” con l'interruttore spento. La strada sicura è accendere la protezione con le regole ancora inattive e usare la scheda Test. L'ordine qui sotto è importante, perché una configurazione errata del proxy può bloccare l'intera azienda.
- Installi e attivi il modulo in NexTool > Moduli > Security Guard. La console si trova in NexTool > Security Guard.
- Configuri i proxy attendibili PRIMA di accendere la protezione. Nella scheda Impostazioni, indichi nel campo Proxy attendibili (CIDR) la rete del reverse proxy davanti a GLPI (Nginx, NPM, HAProxy, bilanciatore di carico). Senza questo, il modulo ignora di proposito l'header
X-Forwarded-For(può essere falsificato) e vede l'IP del proxy, non quello dell'utente. - Se GLPI è dietro Cloudflare, faccia clic su Aggiungi intervalli Cloudflare. Il pulsante aggiunge al campo gli intervalli ufficiali della CDN, senza cancellare ciò che c'è già e senza salvare da solo. Mantenga anche la rete del Suo proxy locale e salvi. Senza gli intervalli Cloudflare, l'IP risolto sarebbe quello del bordo della CDN, condiviso da migliaia di persone.
- Controlli l'header dell'IP. Il valore predefinito è
X-Forwarded-For; lo cambi solo se il Suo proxy usaX-Real-IPoForwarded. - Controlli il riquadro “IP di questa richiesta”. Mostra il
REMOTE_ADDR, l'header ricevuto e l'IP che il modulo risolverebbe adesso. L'IP risolto deve essere quello del Suo computer, non quello del proxy. Se compare l'avviso “Probabile proxy non configurato”, si fermi e torni al passo 2. - Accenda la Protezione contro il brute force con le regole ancora inattive. Senza regole attive né blocchi manuali nessuno viene bloccato, e il Pannello e la scheda Eventi iniziano a mostrare i tentativi classificati. Usi la scheda Test per confermare che un Suo tentativo normale non verrebbe bloccato.
- Solo allora attivi una regola con ambito Utente + IP nella scheda Regole e controlli, nel campo Canali, dove conterà. La regola pronta prevede 5 errori in 15 minuti e un blocco di 15 minuti.



Buone pratiche
- Preferisca l'ambito Utente + IP. Ferma il bot che insiste su un account da un indirizzo, senza effetti collaterali per gli altri utenti.
- Attenzione all'ambito Utente da solo. Permette a chiunque di bloccare l'account di un collega semplicemente sbagliando la sua password di proposito. Se lo usa, imposti un limite alto e una durata breve.
- Attenzione all'ambito IP da solo dietro NAT. Un intero ufficio di solito esce con lo stesso IP pubblico. Una regola solo per IP, con un limite basso, punisce tutti per l'errore di uno. Se la usa, tenga il limite molto più alto di quello della regola Utente + IP (la regola pronta prevede 30 errori in 15 minuti).
- Registri le eccezioni con criterio. La rete della sede, un profilo di integrazione o un account di monitoraggio possono diventare eccezioni, preferibilmente con un periodo di validità.
- Attenzione alle integrazioni tramite API. Un sistema integrato tramite l'API che sbaglia la password in loop (per esempio con una password vecchia) blocca il proprio IP. Registri la sua rete come eccezione o tolga quel canale dalla regola.
- Per il recupero della password, usi un limite più alto di quello del login e preferisca l'ambito IP o Utente + IP.
- Mantenga aggiornata la base GeoIP. L'aggiornamento è manuale; il riquadro avvisa quando la base supera i 60 giorni.


Privacy
Registrare i tentativi di login comporta dati personali, quindi conviene sapere esattamente cosa conserva il modulo:
- Il nome utente non viene mai salvato in chiaro. La correlazione usa un HMAC-SHA256 con una chiave propria dell'installazione, e la schermata mostra solo una maschera (prima e ultima lettera). Nei login riusciti, l'evento conserva anche l'ID dell'utente in GLPI.
- L'indirizzo e-mail indicato nelle richieste di nuova password segue la stessa regola: viene conservato solo come HMAC, e la schermata mostra solo una maschera.
- IP e paese vengono salvati in chiaro, perché sono l'oggetto stesso della protezione.
- Per gli eventi, il periodo di conservazione lo decide Lei: 90 giorni per impostazione predefinita, e 30 giorni per il log amministrativo. La pulizia è affidata all'azione automatica
secguardmaintenance, ogni 5 minuti, in modalità esterna: dipende dal cron di GLPI configurato sul server. - Lo storico dei blocchi non scade in questa versione e viene rimosso solo con l'azione “Elimina dati”.
- Disinstallare il modulo conserva i dati; eliminarli richiede l'azione esplicita “Elimina dati”, con un permesso dedicato.
Permessi per schermata
Security Guard è una console riservata all'amministrazione. I diritti si trovano in Amministrazione > Profili > scheda NexTool e variano a seconda della schermata:
- Pannello: Visualizza Pannello;
- Eventi: Visualizza Eventi;
- Blocchi: Visualizza Blocchi, Rilascia blocchi e Crea blocco manuale;
- Regole: Visualizza Regole e Gestisci Regole;
- Eccezioni: Visualizza Eccezioni e Gestisci Eccezioni;
- Impostazioni e scheda Test: Configura;
- Registri: Visualizza Registri.
Un'azione richiede sempre anche il diritto di vedere la schermata: chi ha solo “Rilascia blocchi” senza “Visualizza Blocchi” non sblocca nulla. In questo modo il team di primo livello può, per esempio, sbloccare un utente senza poter modificare le regole.
Limiti di questa versione
Per essere chiari: la versione 0.2.0 copre il login web, l'API REST, l'API v2 di GLPI 11, CalDAV e il recupero della password. Restano esclusi, o coperti solo in parte:
- i login tramite SSO, SAML o
REMOTE_USER, che non passano dalla password di GLPI; - il codice MFA/TOTP di GLPI 11: i tentativi compaiono negli eventi, ma il modulo non limita il codice, perché GLPI 11 stesso blocca già dopo diversi tentativi errati.
Inoltre non è prevista alcuna notifica di blocco: né e-mail, né avviso, né webhook. Il monitoraggio avviene dalla console, nel Pannello e nelle schede Blocchi ed Eventi.
A chi è rivolto
A chi pubblica GLPI su internet per tecnici esterni, clienti o filiali; ai fornitori di servizi che gestiscono più istanze GLPI e devono dimostrare il controllo degli accessi negli audit; e a chi ha già visto, nel log del server web, centinaia di POST sul login provenienti dallo stesso posto.
Compatibilità
- Versione: 0.2.0
- GLPI: 10 e 11 (lo stesso artefatto funziona su entrambi)
- Plugin: NexTool 6.22.0 o superiore
- Piano: Gratuito
- Lingue: schermate in portoghese (Brasile e Portogallo), inglese (USA e Regno Unito), spagnolo (Spagna e Messico), francese, italiano e tedesco
Prossimo passo
Security Guard fa parte di NexTool, un ecosistema di moduli per estendere GLPI senza personalizzazioni del codice. Consulti la pagina del modulo o contatti il team per una dimostrazione.
Revisionato dal team di NexTool Solutions. Le schermate provengono da un ambiente GLPI reale con il plugin NexTool; IP e utenti sono stati sostituiti con intervalli di documentazione e maschere.