《2020年中国游戏产业报告》显示,2020 年,中国移动游戏市场实际销售收入 2096.76 亿元,同比增长 32.61%。
伴随着游戏市场繁荣发展,手游玩家与游戏厂商也面对着日益复杂的手游安全问题,如破解、盗版、挂机、修改器、模拟点击、模拟器等外挂恶意作弊场景。这些常见的恶意场景直接打击了玩家公平的游戏体验,也严重损害了厂商利益。
网易易盾凭借多年游戏与应用反外挂经验与技术积累,基于大数据技术与算法模型,构建了移动端实时反外挂系统。本文将介绍易盾手游实时反外挂系统的建设思路与实践经验,以期为游戏厂商抵御外挂作弊行为提供一些帮助。
01 反外挂系统目标与流程设计
对于反外挂系统,基本业务目标是识别与对抗。例如,准确识别移动设备,自动化检测游戏盗版签名,玩家特征;准确识别游戏环境,风险外挂使用;甚至有效捕捉玩家游戏键鼠轨迹。根据对抗策略,对识别的外挂恶意玩家,直接闪退或者警告。
在大部分游戏场景,外挂识别与对抗处理流程,分为经典的三个环节:事前,事中,事后。
事前:游戏客户端发布上线前,必须先加固,以提升防破解能力,在加固过程中,同时配置基础的反外挂特征、对抗策略,以及热更策略,进一步提高对抗的实时性和灵活性。
事中:在游戏运行时,可以本地识别与直接对抗,或者上报嫌疑数据给服务端,通过在线的规则与算法模型,准确识别风险,并实时下方对抗策略,如闪退、文本弹窗警告。
事后:数据统计分析,验证玩家嫌疑程度,进一步通过黑白名单进行标记,同时,采集,统计,分析,保存玩家作弊证据,支撑业务封号等处理。
02 反外挂业务特点与技术选型
从风险管控要求看,反外挂系统必须兼顾实时、快速与灵活决策特点。
实时处理难题:为了解决超大规模数据的实时处理挑战,易盾基于Apache Flink大数据处理技术,构建了实时反外挂数据处理系统。Apache Flink作为开源的实时大数据处理框架,已经被业界广泛采用,主要下面几大优势:区分事件时间、处理时间,能够保持数据产生的时序性,解决延迟上报问题;内置时间窗口概念,支持不同业务场景聚合计算;提供分布式快照(Check Point)容错机制,自动持久化数据状态和系统运行元数据,当任务异常时重启时,能够从快照中恢复数据,保障数据处理一致性。
动态灵活性:为了满足识别与对抗的灵活性,在实时数据处理基础上,开发了规则处理引擎。其中,规则表达式由QLExpress解析与执行,规则内容实时更新到Redis缓存,由Flink感知并拉取到本地。
高并发请求:为了响应实时高并发请求,基于Openresty技术,构建了嫌疑数据上报接收服务,风险对抗查询服务。Openresty封装了标准的Nginx核心模块,能够充分利用Nginx事件模型来完成无阻塞I/O通信,通过编写Lua脚本开发Web应用服务。
03 实时反外挂系统架构
整个系统架构的核心模块如下图1所示,按数据处理环节,划分为:智能管家,嫌疑数据上报接收,数据预处理,规则引擎,算法模型,决策模块,风险对抗查询服务,数据仓库,数据统计分析系统,告警服务,风险数据开放接口服务。其中关键模块设计要点说明如下。
图1 | 实时反外挂系统核心模块
3.1 智能管家
智能管家,主要管理对抗黑白名单,举报验证,在线配置同步等,如支持在线动态策略更新,支持根据不同游戏厂商外挂特点,定制个性化的特征。支持配置灰度下发,如按渠道,按目标用户数量,按指定设备。
3.2 嫌疑数据上报接收
基于Openresty技术开发了数据上报接收服务。该模块需要实现二个目标:Kafka直接转发,数据处理链路高可用保障。
Kafka转发:Openresty将收到数据初步处理后,通过Openresty Kafka Lua插件,直接把数据发送给Kafka队列,减少数据落盘IO压力。从性能调优经验看,对超大规模数据时,非常有必要建立两级数据分片。如预先建立16个Topic,每个Topic划分32个分区,有利于后期通过提高并发度,优化数据处理吞吐量和响应时间,能够快速从数据倾斜中恢复。
高可用保障:接收模块的下游是Flink预处理模块。由于Flink CheckPoint启用时候,Flink作业会将Kafka元数据直接存在CheckPoint State中,每个作业的Kafka消费Offset不能被多个Flink 作业共用。
当Flink作业发布更新时候,数据处理任务需要先下线,在下线时间内,数据不能被处理,达不到7x24不停机消费要求。因此Flink数据处理模块,会启动两个以上作业同时运行,每个作业有独立的输入Kafka Topic。
当其中一个作业下线时,开发的Openresty监测服务,能够感知到作业下线,会把对应数据转发给其他作业的输入Topic,由其他作业继续承担消费数据,实现不间断实时处理,保障数据处理高可用。
3.3 Flink核心作业
数据预处理:主要完成数据解密,清洗,和业务元数据关联。当前性能瓶颈出现在加解密部分,消耗时间接近0.5ms/条,严重依赖CPU性能,也直接影响数据处理吞吐量。未来计划使用易盾自研的白盒加解密技术,减少解密消耗时间。
另外,基于Kakfa和Flink的数据处理,都存在一个弊端,数据都是被批量拉取,Flink再串行处理,对于时间敏感的业务,如规则闪退,有必要启动多线程并行处理,减少串行阻塞和拉取抖动。
规则引擎:规则引擎系统分为两部分,基于Spring Boot实现的规则管理,和基于Flink、Redis、QLExpress构建的执行引擎。
其中,执行引擎的主要挑战是有状态规则的高性能执行和大规模状态更新保存。如某条规则要求匹配,最近一周同个设备上出现的IP数量大于10的嫌疑数据。该规则涉及大基数去重统计,需要在每个有效设备指纹上计算去重IP数量,并且时间维度保持连续变化。
针对此类上亿级别的大基数精确去重统计难题,当前方案是以Redis sorted set作为去重存储结构,数据时间戳作为排序score分值,使用zcount命令执行任意时间段去重计数。
另外,每当计数超过上限阈值时,会发送删除事件,异步删除过长成员,减少存储长度,在读写性能优化上,采用Flink AsyncIO,结合Redis Lettuce异步客户端,实现异步无阻塞读写,提升吞吐量。
决策模块:规则引擎输出的数据,包含各类外挂的标记信息,在不同的业务场景如规则闪退,注册登录保护,分别会有不同的决策策略,根据标记信息再细分为各种风险等级,有些场景也会结合算法模型输出结果参与判断,如模拟点击算法检测,注册登陆保护检测。
3.4 数据中心服务
风险明细数据:数据处理作业最终输出为风险明细数据,明细数据包含了各种外挂信息,建议游戏客户对接开放API接口,实时拉取明细数据,验证玩家使用外挂情况,必要时可以进行事后封号处理。
数据仓库:数据仓库分为实时与离线仓库。实时仓库主要由Redis中业务元数据,Kafka Topic中处理数据,Click House中统计数据,和Elastic Search中的明细数据索引构成。
Elastic Search中明细数据索引,按天分割,由别名统一映射各天索引,在易盾官网上,可以多条件组合查询与导出明细数据,支持导出超过1万条数据。
离线数据仓库,在网易猛犸大数据平台上,采用分层分主题构建。风险明细数据作为基础明细层,再关联业务元数据,根据业务需求抽取计算,汇聚成各种应用层数据表,如设备指纹外挂风险表,模拟点击外挂风险表等。离线仓库数据主要用于算法训练,如模拟点击算法模型训练。
数据统计分析:反外挂数据分析系统,主要用于实时告警,实时趋势,汇总统计报表,以及固定周期分析报告。目前采用Click House系统构建数据分析中心,整个集群拥有4个数据节点,3个Zookeeper节点。集群中数据存储都采用2分片,1副本,保障数据安全高可用。
相关数据写入,使用Nginx作为负载均衡,先写入到本地表,再通过Zookeeper复制副本数据;数据查询直接使用分布式表原生的分布式查询能力。
从存储效果看,Click House基于列式的压缩存储,极大降低磁盘空间,例如300亿条明细数据,导入Click House后,存储包括副本仅占用4.4T。
Click House在使用过程中,也碰到一些挑战,在复杂查询时,严重占用CPU计算资源,容易影响并发请求量。因此下一阶段优化目标是查询缓存和请求队列管理,保障系统服务稳定可靠。
04 展望
2020年,易盾移动端实时反外挂系统,已经覆盖5.1亿终端,为几百款游戏和应用,抵御各类威胁280多亿次,为手游玩家创造健康公平游戏环境,为Android和iOS应用安全保驾护航。
下一步计划从5大重点方向布局:一是,支持开放更多的业务定制规则;二是,继续深入算法模型建设,如重点挖掘打金工作室、模拟点击等问题;三是,推广新一代易盾设备指纹系统,扩大可信设备在各类反外挂,反作弊风控场景应用;四是,继续提升智能数据中心能力,提供更丰富的数据分析报表;五是,支持反外挂系统私有化部署。
制作游戏外挂软件将面对法律的严惩。在巨大的利益驱使下,法律并不能完全劝退外挂,外挂黑色产业链日益膨胀,精细分工,环环相扣。有人专门负责游戏外挂的开发更新,开发好之后,再交给供应商代理销售。游戏开发者、运营商应拿起手里的技术武器,还玩家一片净土。点击免费试用易盾手游智能反外挂