Analisi del grafo dei dispositivi: collegare i punti tra le sessioni
Come i database a grafo rivelano connessioni nascoste tra i dispositivi, abilitando il rilevamento dei multi-account e l'identificazione delle reti di frode su larga scala.
Quando un singolo frodatore gestisce decine di account, i singoli account appaiono legittimi se considerati isolatamente. Ognuno ha un'email univoca, un indirizzo IP plausibile, pattern di navigazione realistici. Il rilevamento tradizionale basato su regole controlla ogni account in modo indipendente e non trova nulla di sospetto. Le connessioni tra gli account — i dispositivi condivisi, le sessioni sovrapposte, i fingerprint di rete comuni — sono invisibili ai sistemi che elaborano gli account uno alla volta.
Perché i grafi
L'analisi del grafo dei dispositivi cambia il modello. Invece di valutare gli account in modo indipendente, costruiamo un grafo in cui i nodi sono dispositivi, account, indirizzi IP e sessioni, e gli archi rappresentano le connessioni osservate: «questo dispositivo è stato usato per creare questo account», «questo IP è stato visto con questo dispositivo», «questi due account hanno condiviso un cookie di sessione». Il grafo rivela una struttura che le tabelle piatte non possono cogliere.
Una rete di frode che usa 50 account su 5 dispositivi e 3 indirizzi IP forma un cluster distintivo nel grafo. La densità del cluster — molte connessioni all'interno di un piccolo gruppo di nodi — è un segnale forte. Gli utenti legittimi raramente condividono dispositivi con estranei, e le loro connessioni account-dispositivo formano strutture rade e ad albero, anziché cluster densi.
Architettura del database a grafo
Utilizziamo un modello a grafo delle proprietà con quattro tipi di nodo: Device (identificato dal visitor ID), Account (il suo user ID), Network (indirizzo IP + ASN) e Session (singolo evento di identificazione). Gli archi trasportano metadati: timestamp, punteggio di confidenza e tipo di evento.
Il grafo è memorizzato in un indice di adiacenza costruito su misura e ottimizzato per gli attraversamenti a 2 salti. Quando arriva un nuovo evento di identificazione, inseriamo l'evento come nodo Session, lo colleghiamo ai nodi Device e Network e verifichiamo se un qualsiasi Account collegato ha connessioni con altri dispositivi. Questa operazione di inserimento-e-query si completa in meno di 5ms per grafi con un massimo di 10 milioni di nodi.
In realtà abbiamo provato prima Neo4j. Funzionava benissimo in sviluppo con 100K nodi. Poi abbiamo caricato i dati di produzione — 500M di nodi — e le query Cypher che impiegavano 2ms hanno iniziato a impiegarne 800. David ha passato una settimana a fare benchmark delle alternative prima che costruissimo il nostro indice di adiacenza basato su RocksDB partizionato. A volte la soluzione noiosa e su misura batte quella elegante e già pronta.
Algoritmi di clustering
Applichiamo due algoritmi di clustering al grafo dei dispositivi:
Componenti connessi
L'approccio più semplice: trovare tutti i nodi raggiungibili da un dato dispositivo. Se il Dispositivo A è connesso all'Account 1 e all'Account 2, e anche il Dispositivo B è connesso all'Account 2, allora i Dispositivi A e B si trovano nello stesso componente connesso. Questo identifica tutti gli account che condividono una qualsiasi connessione transitiva di dispositivo.
I componenti connessi sono rapidi da calcolare, ma possono produrre cluster molto grandi quando dispositivi legittimamente condivisi (computer di famiglia, terminali di biblioteca) creano ponti tra account non correlati. Affrontiamo questo problema con la ponderazione degli archi: le connessioni che passano per ambienti condivisi noti ricevono un peso inferiore.
Rilevamento delle community
Per un'analisi più sfumata, eseguiamo il rilevamento delle community con Louvain sul grafo ponderato. Questo algoritmo partiziona il grafo in community in cui le connessioni intra-community sono dense e quelle inter-community sono rade. Le reti di frode formano community compatte anche quando sono connesse al grafo più ampio attraverso infrastrutture condivise.
L'algoritmo di Louvain viene eseguito in tempo O(n log n), il che lo rende pratico per grafi con milioni di nodi. Lo eseguiamo in modo incrementale: quando vengono aggiunti nuovi archi, aggiorniamo localmente le assegnazioni alle community anziché ricalcolare l'intera partizione.
Pattern reale: rilevamento di reti di frode
Una piattaforma di gaming ha integrato la nostra API del grafo dei dispositivi per rilevare reti di frode organizzate. Entro la prima settimana, il grafo ha rivelato un cluster di 127 account connessi attraverso 8 dispositivi e 4 indirizzi IP. Gli account erano stati creati nell'arco di 3 mesi, ognuno con un'email univoca e un profilo realistico. Il rilevamento basato su regole non ne aveva segnalato nessuno.
La struttura del grafo era la prova rivelatrice: 127 account che condividono 8 dispositivi producono una media di 15,8 account per dispositivo. Gli utenti legittimi hanno in media 1,2 account per dispositivo su questa piattaforma. La densità del cluster era 47 volte superiore alla baseline: un segnale di frode inequivocabile.
Prestazioni su larga scala
Il nostro grafo dei dispositivi in produzione gestisce 2,3 miliardi di nodi e 8,1 miliardi di archi. La latenza di inserimento è di 2,4ms al p99. L'attraversamento a due salti (trovare tutti gli account connessi a un dispositivo attraverso un qualsiasi percorso di lunghezza 2) si completa in 4,1ms al p99. Gli aggiornamenti del rilevamento delle community elaborano 50.000 nuovi archi al secondo.
Il grafo è partizionato in base all'hash del device ID su 12 nodi, con ogni shard che contiene circa 190 milioni di nodi. Un fattore di replica pari a 3 garantisce la disponibilità. Realizziamo uno snapshot del grafo ogni ora per il disaster recovery ed eseguiamo quotidianamente un ricalcolo completo del rilevamento delle community come verifica di coerenza rispetto agli aggiornamenti incrementali.
Integrazione
Il grafo dei dispositivi è accessibile tramite due interfacce: un'API di query in tempo reale per le ricerche individuali (questo dispositivo è connesso ad altri account?) e un'API di esportazione batch per l'analisi (dammi tutti i cluster con più di N account). L'API in tempo reale è progettata per le decisioni antifrode inline: la interroghi durante la creazione dell'account per verificare se il dispositivo ha già visto altri account. L'API batch alimenta i flussi di lavoro investigativi del suo team dati.