Protezione dagli Attacchi
Auris include più livelli di difesa che si attivano su ogni richiesta di autenticazione. Questi sistemi operano indipendentemente ma sono stratificati in una pipeline specifica — ogni controllo viene eseguito in sequenza in modo che i controlli successivi, più costosi, vengano raggiunti solo dopo che i filtri iniziali più economici siano superati.
Rate Limiting
Auris applica rate limiting a finestra scorrevole a tutti gli endpoint API. I rate limit vengono applicati in memoria per istanza e non sono condivisi tra le istanze in un deployment multi-nodo — se hai bisogno di rate limiting distribuito, configura uno store condiviso supportato da Redis.
Livelli
| Livello | Si applica a | Limiti predefiniti |
|---|---|---|
| auth | Endpoint di login, signup e logout | Limiti severi per prevenire il credential stuffing |
| sensitive | Reset password, enrollamento 2FA, verifica 2FA | Limiti severi, bucket separati per utente e per IP |
| api | Endpoint API autenticati generali | Limiti moderati per utente autenticato |
| public | Endpoint aperti (pagine di stato, SCIM, checkout pubblico) | Limiti generosi, solo per IP |
I valori esatti dei limiti sono configurabili per livello tramite variabili d’ambiente o la Console (Console → Sicurezza → Rate Limiting).
Header di risposta
Tutte le risposte API dagli endpoint con rate limiting includono header standard:
| Header | Significato |
|---|---|
X-RateLimit-Limit | Massimo numero di richieste consentite nella finestra corrente |
X-RateLimit-Remaining | Richieste rimanenti nella finestra corrente |
X-RateLimit-Reset | Timestamp Unix quando la finestra corrente si resetta |
Retry-After | Secondi fino a quando il client può riprovare (presente solo nelle risposte 429) |
Quando viene superato un rate limit, Auris restituisce HTTP 429 Too Many Requests con l’header Retry-After. I client dovrebbero rispettare questo header e fare backoff di conseguenza.
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1718016000
Retry-After: 47
Content-Type: application/json
{
"ok": false,
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Troppe richieste. Riprova tra 47 secondi."
}
}Protezione Brute-Force
Auris traccia i tentativi di login falliti per account utente e per indirizzo IP. Dopo un numero configurabile di fallimenti consecutivi, l’account o l’IP viene bloccato per una durata crescente.
Come funziona il blocco
- Ogni tentativo di login fallito crea un record
LoginAttemptcon timestamp, IP e user agent. - Quando il conteggio dei fallimenti per un account o IP supera la soglia configurata all’interno della finestra di osservazione, viene creato un record
AccountLockout. - Durante un blocco, tutti i tentativi di login per l’account interessato restituiscono
HTTP 423 Lockedimmediatamente — non viene tentata l’autenticazione Keycloak. - La durata del blocco si intensifica con i blocchi ripetuti: primo blocco = 5 minuti, secondo = 30 minuti, terzo = 24 ore (configurabile).
Configurazione
Configura tramite Console → Sicurezza → Protezione Brute-Force:
| Impostazione | Default | Note |
|---|---|---|
| Tentativi falliti prima del blocco | 5 | Il conteggio si resetta dopo un login riuscito |
| Finestra di osservazione | 15 minuti | Solo i tentativi in questa finestra contano verso la soglia |
| Durata iniziale del blocco | 5 minuti | |
| Moltiplicatore di escalation | 6x | Ogni blocco successivo dura 6× di più |
| Durata massima del blocco | 24 ore | |
| Blocco per IP | Abilitato | Blocca l’IP dopo fallimenti su più account |
Sblocco manuale
Gli amministratori possono sbloccare manualmente gli account tramite la Console (Dettaglio utente → Sicurezza → Sblocca Account) o API:
/api/admin/lockouts/[userId]Requires: manage:usersCancella tutti i blocchi attivi per l’utente specificato e resetta il contatore dei tentativi falliti.
/api/admin/lockoutsRequires: manage:usersElenca gli account attualmente bloccati con il motivo del blocco, l’ora di inizio e la scadenza.
Sicurezza delle Password
Integrazione HaveIBeenPwned
Quando un utente imposta o cambia una password, Auris la controlla rispetto al database Pwned Passwords di HaveIBeenPwned (HIBP) usando l’API k-Anonymity. Solo i primi 5 caratteri dell’hash SHA-1 vengono inviati a HIBP — la password in chiaro non lascia mai Auris.
Se la password compare nei dataset di violazioni note, Auris la rifiuta e chiede all’utente di sceglierne una diversa. Questo controllo si applica a:
- Registrazione utente
- Richieste di cambio password
- Password create dall’amministratore tramite API
Il controllo HIBP è abilitato di default. Per disabilitarlo (non consigliato), imposta HIBP_CHECK_ENABLED=false nell’ambiente. Il controllo può aggiungere fino a 200ms di latenza sulle operazioni con password a causa della chiamata API esterna.
Requisiti di complessità
Configura i requisiti minimi per la password in Console → Sicurezza → Policy Password:
| Requisito | Default |
|---|---|
| Lunghezza minima | 8 caratteri |
| Richiedi lettera maiuscola | No |
| Richiedi lettera minuscola | No |
| Richiedi numero | No |
| Richiedi carattere speciale | No |
| Rifiuta password comuni (HIBP) | Sì |
I requisiti vengono applicati alle password gestite da Auris. Gli utenti SSO si autenticano tramite il loro IdP aziendale e non sono soggetti alle policy password di Auris.
Rilevamento Login Sospetti
Auris analizza ogni login per anomalie comportamentali. Il rilevamento viene eseguito dopo l’autenticazione Keycloak riuscita — se le credenziali di login sono corrette ma il contesto è sospetto, Auris può notificare l’utente, bloccare il login o attivare uno step-up MFA.
Metodi di rilevamento
1. Nuovo dispositivo
Auris calcola un fingerprint hash da una combinazione di user agent del browser, risoluzione dello schermo e altri segnali stabili. Se il fingerprint non è mai stato visto per questo utente prima, il login viene segnalato come “nuovo dispositivo”. Il record del dispositivo viene memorizzato in DeviceFingerprint dopo il primo login riuscito da quel contesto.
2. Nuovo indirizzo IP
Auris traccia gli indirizzi IP da cui un utente ha precedentemente effettuato il login. Un login da un IP che non è mai stato visto per questo account viene segnalato.
3. Nuovo paese
La ricerca GeoIP determina il paese dell’IP di login. Se il paese differisce dalla cronologia dei login dell’utente, il login viene segnalato. Il rilevamento del paese usa ip-api.com (default) o un database locale MaxMind GeoLite2 (configurabile per deployment offline o sensibili alla privacy).
4. Viaggio impossibile
Auris calcola la distanza geografica (formula di Haversine) tra la posizione di login corrente e quella del login più recente, poi la divide per il tempo trascorso per ricavare una velocità di viaggio implicita. Se la velocità supera una soglia configurabile (default: 800 km/h — più veloce dell’aviazione commerciale), il login viene segnalato come viaggio impossibile.
5. Rilevamento VPN / proxy / datacenter
La ricerca GeoIP include metadati che indicano se l’IP appartiene a un provider VPN noto, proxy o datacenter cloud. I login da tali IP vengono segnalati di default ma possono essere consentiti se i tuoi utenti accedono comunemente al servizio tramite VPN.
Azioni configurate
Ogni metodo di rilevamento può attivare azioni indipendenti:
| Azione | Comportamento |
|---|---|
log | Registra l’evento di login sospetto solo nei log di audit. Nessun impatto sull’utente. |
notify | Invia un’email di notifica all’utente informandolo del login sospetto. |
block | Rifiuta completamente il login con un messaggio di errore. |
require_mfa | Consenti il login ma richiedi il completamento MFA anche se l’MFA non è normalmente richiesta. |
Configurazione del provider GeoIP
| Provider | Impostazione | Note |
|---|---|---|
| ip-api.com | Default | Livello gratuito, chiamata API esterna per login |
| MaxMind GeoLite2 | GEO_IP_PROVIDER=maxmind, MAXMIND_DB_PATH=/percorso/a/GeoLite2-City.mmdb | Lookup locale, nessuna chiamata esterna, richiede account MaxMind gratuito per scaricare il DB |
Revisione degli eventi di login sospetti
/api/admin/suspicious-loginsRequires: manage:usersElenca gli eventi di login sospetti per tutti gli utenti, filtrabile per gravità, motivo, utente e intervallo di date.
/api/admin/suspicious-logins/[id]/reviewRequires: manage:usersContrassegna un evento di login sospetto come revisionato da un amministratore.
Integrazione CAPTCHA
Auris supporta tre provider CAPTCHA nelle pagine di login, signup e reset password. Il CAPTCHA può essere impostato per attivarsi sempre, solo quando il rischio è elevato, o solo dopo un numero di tentativi falliti.
Provider supportati
| Provider | Tipo | Note |
|---|---|---|
| Cloudflare Turnstile | Proof-of-work, preserva la privacy | Consigliato. Nessuna sfida con immagini. Livello gratuito disponibile. |
| hCaptcha | Sfida basata su immagini | Alternativa orientata alla privacy a reCAPTCHA |
| reCAPTCHA v3 | Basato su punteggio, invisibile | Nessuna interazione utente, restituisce un punteggio di rischio |
Modalità di attivazione
| Modalità | Comportamento |
|---|---|
ALWAYS | Il CAPTCHA appare su ogni tentativo di login/signup |
ON_SUSPICIOUS | Il CAPTCHA viene attivato quando il punteggio di rischio (dall’MFA adattiva) supera la soglia configurata |
AFTER_FAILURES | Il CAPTCHA appare dopo N tentativi di login consecutivi falliti dallo stesso IP |
Configurazione
Configura tramite Console → Sicurezza → CAPTCHA:
- Seleziona il provider CAPTCHA.
- Inserisci la Site Key (usata nel browser) e la Secret Key (usata lato server per la verifica).
- Imposta la modalità di attivazione e (per
AFTER_FAILURES) la soglia dei tentativi. - Per reCAPTCHA v3, imposta la soglia minima del punteggio (0.0–1.0) al di sotto della quale un login viene bloccato.
La verifica CAPTCHA viene eseguita lato server sull’API Auris prima che le credenziali vengano controllate. Anche se un client bypassa l’interfaccia utente del CAPTCHA, il login fallirà senza un token di verifica valido.
Liste di IP Consentiti/Bloccati
Auris supporta regole IP basate su CIDR a livello di tenant e per applicazione. Le regole vengono valutate prima di qualsiasi tentativo di autenticazione.
Tipi di regola
| Tipo | Comportamento |
|---|---|
ALLOW | Consenti esplicitamente il traffico da questo IP o range |
BLOCK | Rifiuta tutte le richieste da questo IP o range con HTTP 403 Forbidden |
Precedenza: Le regole BLOCK hanno sempre la precedenza sulle regole ALLOW nello stesso scope.
Scope: Le regole possono essere scoped all’intero tenant (scope: TENANT) o a un’applicazione specifica (scope: APPLICATION, applicationId: ...).
Regole temporanee: Imposta isTemporary: true e fornisci expiresAt per creare regole che scadono automaticamente. Utile per ban temporanei dopo un attacco rilevato.
Gestione delle regole IP
/api/ip-rulesRequires: manage:usersElenca tutte le regole IP per il tenant. Supporta il filtraggio per tipo (ALLOW/BLOCK), scope e stato.
/api/ip-rulesRequires: manage:usersCrea una nuova regola IP.
{
"cidr": "203.0.113.0/24",
"type": "BLOCK",
"scope": "TENANT",
"label": "ASN sospetto",
"note": "Bloccato a seguito di attacco credential stuffing il 01/06/2025",
"isTemporary": true,
"expiresAt": "2025-07-01T00:00:00Z"
}/api/ip-rules/[id]Requires: manage:usersAggiorna una regola — estendi la scadenza, cambia l’etichetta o attiva/disattiva.
/api/ip-rules/[id]Requires: manage:usersElimina una regola IP.
Notazione CIDR
Auris supporta sia la notazione CIDR IPv4 che IPv6:
- IP singolo:
203.0.113.42/32 - Subnet:
203.0.113.0/24(256 indirizzi) - Range completo:
10.0.0.0/8(16,7 milioni di indirizzi) - IPv6 singolo:
2001:db8::1/128 - Range IPv6:
2001:db8::/32
La Pipeline di Sicurezza del Login
Ogni richiesta di login passa attraverso i seguenti controlli in ordine. Ogni controllo può cortocircuitare la pipeline restituendo un errore:
Richiesta di login in arrivo
|
v
1. Controllo IP Allow/Block
Regola BLOCK corrisposta? → HTTP 403, stop
Regola ALLOW presente? → continua
|
v
2. Verifica CAPTCHA
Modalità = ALWAYS? → richiedi token valido
Modalità = ON_SUSPICIOUS? → valuta punteggio rischio, richiedi se alto
Modalità = AFTER_FAILURES? → controlla conteggio fallimenti IP
Token non valido/mancante? → HTTP 400, stop
|
v
3. Rate Limiting
Limite per IP superato? → HTTP 429, stop
Limite per utente superato? → HTTP 429, stop
|
v
4. Controllo Brute-Force / Blocco
Account o IP attualmente bloccato? → HTTP 423, stop
|
v
5. Autenticazione Keycloak
Credenziali non valide? → registra tentativo fallito, HTTP 401, stop
Credenziali valide? → continua
|
v
6. Analisi Login Sospetti
(non bloccante — eseguita in modo asincrono, registra eventi)
Rilevamento ad alta gravità? → attiva azione configurata (notify/block/require MFA)
|
v
7. Calcolo Punteggio di Rischio MFA Adattiva
Punteggio calcolato da 5 fattori
Punteggio sopra soglia? → richiedi MFA step-up
|
v
8. Emissione Token
Claim ACR e AMR impostati in base ai metodi di autenticazione completati
Restituisce access token e refresh tokenI passi 1–4 sono sincroni e bloccanti. I passi 6–7 possono aggiungere latenza se i lookup GeoIP sono abilitati. Per minimizzare l’impatto sulla latenza, usa il database locale MaxMind invece di ip-api.com per la risoluzione GeoIP.
Permessi Richiesti
| Operazione | Permesso |
|---|---|
| Visualizza / gestisci regole IP | manage:users |
| Visualizza eventi login sospetti | manage:users |
| Revisiona eventi sospetti | manage:users |
| Visualizza / gestisci blocchi | manage:users |
| Configura impostazioni sicurezza (Console) | Solo OWNER o ADMIN del tenant |
Pagine Correlate
- Autenticazione Multi-Fattore — TOTP, SMS OTP, WebAuthn e MFA adattiva
- Console: Impostazioni Sicurezza — Guida completa alla Console per tutte le funzionalità di sicurezza
- Concetti: Flusso di Login — Analisi dettagliata della pipeline di autenticazione
- Riferimento API: Sicurezza — Documentazione completa degli endpoint per regole IP, blocchi e login sospetti