设备图谱分析:跨会话串联蛛丝马迹
图数据库如何揭示设备之间的隐藏关联,从而在大规模场景下实现多账号检测与欺诈团伙识别。
当一个欺诈者操纵着几十个账号时,单看每个账号都显得合法。每个账号都有独一无二的邮箱、看似可信的 IP 地址、逼真的浏览行为。传统的基于规则的检测会独立地检查每个账号,结果什么可疑之处也发现不了。账号之间的关联——共享的设备、重叠的会话、共同的网络指纹——对于逐个处理账号的系统来说是不可见的。
为什么用图
设备图谱分析改变了这套模型。我们不再独立地评估账号,而是构建一张图:其中节点是设备、账号、IP 地址和会话,边则表示观测到的关联,例如“这台设备被用来创建了这个账号”“这个 IP 曾与这台设备一同出现”“这两个账号共享了一个会话 cookie”。图能揭示扁平的数据表无法呈现的结构。
一个欺诈团伙如果用 50 个账号、5 台设备和 3 个 IP 地址运作,就会在图中形成一个特征鲜明的聚类。聚类密度——一小组节点内部存在大量关联——是一个强信号。合法用户很少与陌生人共享设备,他们的账号-设备关联构成的是稀疏的、树状的结构,而非密集的聚类。
图数据库架构
我们采用属性图模型,包含四种节点类型:设备(Device,由 visitor ID 标识)、账号(Account,即你的用户 ID)、网络(Network,IP 地址 + ASN)和会话(Session,单次识别事件)。边携带元数据:时间戳、置信度分数和事件类型。
图存储在一个专门构建的邻接索引中,该索引针对两跳遍历做了优化。当一个新的识别事件到达时,我们把该事件作为一个 Session 节点插入,将其连接到 Device 和 Network 节点,并检查任何关联到的 Account 是否与其他设备存在关联。对于节点数在 1000 万以内的图,这套插入并查询的操作可在 5ms 内完成。
我们其实一开始试的是 Neo4j。在开发阶段面对 10 万节点时它表现出色。然后我们载入了生产数据——5 亿节点——原本耗时 2ms 的 Cypher 查询开始要花 800ms。David 花了一周时间对各种替代方案做基准测试,之后我们自建了一套由分片 RocksDB 支撑的邻接索引。有时候,朴素、定制的方案会击败优雅的现成方案。
聚类算法
我们对设备图谱应用两种聚类算法:
连通分量
最简单的方法:找出从某台指定设备可达的所有节点。如果设备 A 连接到账号 1 和账号 2,而设备 B 也连接到账号 2,那么设备 A 和设备 B 就处于同一个连通分量中。这能识别出所有共享任意传递性设备关联的账号。
连通分量计算起来很快,但当合法的共享设备(家庭电脑、图书馆终端)在互不相关的账号之间架起桥梁时,可能会产生非常大的聚类。我们通过边加权来应对——经由已知共享环境的关联会被赋予更低的权重。
社区发现
为了做更细致的分析,我们在加权图上运行 Louvain 社区发现。该算法将图划分为若干社区,社区内部的关联密集,社区之间的关联稀疏。即便欺诈团伙通过共享基础设施与更大的图相连,它们仍会形成紧密的社区。
Louvain 算法的运行时间为 O(n log n),这使它对于拥有数百万节点的图切实可行。我们以增量方式运行它——当有新边加入时,我们在局部更新社区归属,而不是重新计算整个划分。
真实模式:欺诈团伙检测
一个游戏平台接入了我们的设备图谱 API,用于检测有组织的欺诈团伙。在第一周内,图谱就揭示出一个由 127 个账号构成的聚类,它们通过 8 台设备和 4 个 IP 地址相连。这些账号是在为期 3 个月的时间里陆续创建的,每个都有独一无二的邮箱和逼真的资料。基于规则的检测对它们的标记数为零。
图的结构就是破绽所在:127 个账号共享 8 台设备,平均每台设备有 15.8 个账号。在该平台上,合法用户平均每台设备为 1.2 个账号。这个聚类的密度是基线的 47 倍——一个毫不含糊的欺诈信号。
大规模下的性能
我们的生产设备图谱承载着 23 亿节点和 81 亿边。p99 插入延迟为 2.4ms。两跳遍历(找出通过任意长度为 2 的路径连接到某台设备的所有账号)在 p99 下于 4.1ms 内完成。社区发现的更新以每秒 50000 条新边的速度处理。
图按设备 ID 哈希分片,横跨 12 个节点,每个分片约容纳 1.9 亿节点。复制因子为 3,确保了可用性。我们每小时对图做一次快照以备灾难恢复,并每天运行一次完整的社区发现重算,作为对增量更新的一致性校验。
集成
设备图谱可通过两个接口访问:面向单次查询的实时查询 API(这台设备是否连接着其他账号?)和面向分析的批量导出 API(给我所有账号数超过 N 的聚类)。实时 API 专为内联的欺诈决策而设计——在账号创建期间进行查询,以检查该设备是否见过其他账号。批量 API 则为你的数据团队的调查工作流提供数据。