Analiza grafului de dispozitive: conectarea punctelor între sesiuni
Cum bazele de date orientate pe grafuri dezvăluie legături ascunse între dispozitive, permițând detectarea conturilor multiple și identificarea rețelelor de fraudă la scară.
Când un singur fraudator operează zeci de conturi, conturile individuale par legitime luate separat. Fiecare are un email unic, o adresă IP plauzibilă, tipare de navigare realiste. Detecția tradițională bazată pe reguli verifică fiecare cont independent și nu găsește nimic suspect. Legăturile dintre conturi — dispozitivele partajate, sesiunile suprapuse, amprentele de rețea comune — sunt invizibile pentru sistemele care procesează conturile pe rând.
De ce grafuri
Analiza grafului de dispozitive schimbă modelul. În loc să evaluăm conturile independent, construim un graf în care nodurile sunt dispozitive, conturi, adrese IP și sesiuni, iar muchiile reprezintă legături observate: „acest dispozitiv a fost folosit pentru a crea acest cont”, „acest IP a fost văzut împreună cu acest dispozitiv”, „aceste două conturi au partajat un cookie de sesiune”. Graful dezvăluie o structură pe care tabelele plate nu o pot arăta.
O rețea de fraudă care folosește 50 de conturi pe 5 dispozitive și 3 adrese IP formează un cluster distinctiv în graf. Densitatea clusterului — multe legături într-un grup mic de noduri — este un semnal puternic. Utilizatorii legitimi rareori partajează dispozitive cu necunoscuți, iar legăturile lor cont-dispozitiv formează structuri rare, arborescente, nu clustere dense.
Arhitectura bazei de date orientate pe grafuri
Folosim un model de graf cu proprietăți, cu patru tipuri de noduri: Device (identificat prin visitor ID), Account (ID-ul tău de utilizator), Network (adresă IP + ASN) și Session (eveniment individual de identificare). Muchiile poartă metadate: marcaj temporal, scor de încredere și tip de eveniment.
Graful este stocat într-un index de adiacență construit special, optimizat pentru traversări pe 2 salturi. Când sosește un nou eveniment de identificare, inserăm evenimentul ca nod Session, îl conectăm la nodurile Device și Network și verificăm dacă vreun cont Account asociat are legături cu alte dispozitive. Această operație de inserare-și-interogare se finalizează în sub 5ms pentru grafuri cu până la 10 milioane de noduri.
De fapt am încercat mai întâi Neo4j. A funcționat excelent în dezvoltare, cu 100K de noduri. Apoi am încărcat datele de producție — 500M de noduri — și interogările Cypher care durau 2ms au început să dureze 800ms. David a petrecut o săptămână evaluând alternative înainte să ne construim propriul index de adiacență susținut de RocksDB sharded. Uneori soluția banală, făcută pe comandă, o învinge pe cea elegantă, gata de raft.
Algoritmi de clustering
Aplicăm doi algoritmi de clustering asupra grafului de dispozitive:
Componente conexe
Abordarea cea mai simplă: găsim toate nodurile accesibile dintr-un anumit dispozitiv. Dacă Device A este conectat la Account 1 și Account 2, iar Device B este de asemenea conectat la Account 2, atunci Device A și Device B se află în aceeași componentă conexă. Aceasta identifică toate conturile care partajează orice legătură tranzitivă de dispozitiv.
Componentele conexe se calculează rapid, dar pot produce clustere foarte mari atunci când dispozitivele partajate legitime (calculatoare de familie, terminale de bibliotecă) creează punți între conturi neînrudite. Rezolvăm acest lucru prin ponderarea muchiilor — legăturile prin medii partajate cunoscute primesc o pondere mai mică.
Detecția comunităților
Pentru o analiză mai nuanțată, rulăm detecția comunităților Louvain pe graful ponderat. Acest algoritm partiționează graful în comunități în care legăturile din interiorul comunității sunt dense, iar cele dintre comunități sunt rare. Rețelele de fraudă formează comunități strânse chiar și atunci când sunt conectate la graful mai larg prin infrastructură partajată.
Algoritmul Louvain rulează în timp O(n log n), ceea ce îl face practic pentru grafuri cu milioane de noduri. Îl rulăm incremental — când se adaugă muchii noi, actualizăm local atribuirile comunităților în loc să recalculăm întreaga partiție.
Tipar din practică: detectarea rețelelor de fraudă
O platformă de gaming a integrat API-ul nostru de graf de dispozitive pentru a detecta rețele de fraudă organizate. În prima săptămână, graful a dezvăluit un cluster de 127 de conturi conectate prin 8 dispozitive și 4 adrese IP. Conturile fuseseră create pe parcursul a 3 luni, fiecare cu un email unic și un profil realist. Detecția bazată pe reguli nu semnalase niciunul dintre ele.
Structura grafului a fost indiciul revelator: 127 de conturi care partajează 8 dispozitive produc o medie de 15,8 conturi per dispozitiv. Utilizatorii legitimi au în medie 1,2 conturi per dispozitiv pe această platformă. Densitatea clusterului era de 47x peste valoarea de referință — un semnal de fraudă lipsit de ambiguitate.
Performanța la scară
Graful nostru de dispozitive din producție gestionează 2,3 miliarde de noduri și 8,1 miliarde de muchii. Latența de inserare este de 2,4ms la p99. Traversarea pe două salturi (găsirea tuturor conturilor conectate la un dispozitiv prin orice cale de lungime 2) se finalizează în 4,1ms la p99. Actualizările detecției comunităților procesează 50.000 de muchii noi pe secundă.
Graful este sharded după hash-ul ID-ului de dispozitiv pe 12 noduri, fiecare shard conținând aproximativ 190 de milioane de noduri. Un factor de replicare de 3 asigură disponibilitatea. Facem snapshot al grafului la fiecare oră pentru recuperare în caz de dezastru și rulăm zilnic o recalculare completă a detecției comunităților ca verificare de consistență față de actualizările incrementale.
Integrare
Graful de dispozitive este accesibil prin două interfețe: un API de interogare în timp real pentru căutări individuale (este acest dispozitiv conectat la alte conturi?) și un API de export în batch pentru analitică (dă-mi toate clusterele cu mai mult de N conturi). API-ul în timp real este conceput pentru decizii de fraudă inline — interoghezi în timpul creării contului pentru a verifica dacă dispozitivul a mai văzut alte conturi. API-ul în batch alimentează fluxurile de investigație ale echipei tale de date.