对于一个面对大量用户的互联网服务而言,存在着大量的风险,包括恶意的网络安全攻击、利用规则漏洞获利、使用外挂作弊等等,这些恶意行为,往往会干扰系统的正常运行,为企业带来经济损失。此时,我们有必要制定一些规则,去判断一些具有异常行为的用户,并对他们进一步采取对应的行动,以降低风险。当这些规则逐渐变得复杂时,我们就需要一个系统来集成它们,由此衍生出了独立的风险控制系统。一个风控系统,一般从数据源读取用户行为数据,经过预处理后,把数据输送到配置好的规则引擎中,自动输出符合条件的异常数据,进行后续处理。Aswan,这个由陌陌安全团队开源的风控系统静态规则引擎,通过使用可灵活配置的静态规则引擎,实现异常用户行为判定,十分高效便捷。
简介
Aswan,是 momosecurity (陌陌安全团队) 在 Github 上开源的风控系统静态规则引擎,项目位于 https://github.com/momosecurity/aswan。
Aswan 的架构图如下:
可以看到,对于多种不同种类的业务类型,具有多种多样的风险,许多都需要接入风控系统进行管控。对于要接入的业务而言,首先要建立数据源,提供可以用于进行异常行为判别的数据,包括用户的静态属性、行为日志等。在完成了数据采集后,需要把原始数据进行预处理,包括抽取、转换、脱敏和归档等,以便后续规则引擎的进一步使用。
在完成了数据方面处理后,需要建立该业务对应的规则策略,从数据判断是否出现了异常行为,是否构成了对于业务正常运行的风险;同时建立对应的管控策略,对于不同类型的风险,采取不同的行动,进行包括用户限制等管控,以降低风险。
安装
Aswan 项目依赖于 Redis, MySQL 和 MongoDB,可以使用 Docker 快速完成环境部署:
mongo: docker run -d --name mongo -v $HOME/docker_volumes/mongodb:/data/db -p 27017:27017 mongo:latest
mysql: docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=root -v $HOME/docker_volumes/mysql:/var/lib/mysql -v $HOME/docker_volumes/conf/mysql:/etc/mysql/conf.d -p 3306:3306 mysql:5.6
redis: docker run -d --name redis -p 6379:6379 -v $HOME/docker_volumes/redis:/var/lib/redis redis:latest
在 MySQL 中创建 risk_control 库:
mongo: docker run -d --name mongo -v $HOME/docker_volumes/mongodb:/data/db -p 27017:27017 mongo:latest
mysql: docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=root -v $HOME/docker_volumes/mysql:/var/lib/mysql -v $HOME/docker_volumes/conf/mysql:/etc/mysql/conf.d -p 3306:3306 mysql:5.6
redis: docker run -d --name redis -p 6379:6379 -v $HOME/docker_volumes/redis:/var/lib/redis redis:latest
注意配置 utf8mb4 编码以规避乱码问题。
Aswan 基于 Python 3.7 开发,可以使用 pip 安装依赖:
pip install -r requirements.txt
Aswan 也支持 Python 2.7,可以使用 2.7 对应的版本。Aswan 后台主要使用 Django 框架开发,在完成依赖安装后,可以进行项目初始化:
# 在www目录下
python manage.py makemigrations && python manage.py migrate
# 创建管理员账户
python manage.py createsuperuser # 后续 依次输入用户名、密码、邮箱 即可创建一个管理员账号
# 预注入一些数据
python manage.py init_risk_data
完成初始化的工作后,启动服务进程、管理后台、以及拦截日志的消费进程:
bash start.sh
示例
Aswan 的使用,主要是通过其提供的管理后台来进行的:
可以看到,后台主要包括:名单管理、策略原子管理、规则管理、日志管理、权限管理和后台配置等部分,它们分别具有不同的功能:
- 名单管理:名单主要是用于不同类型的用户信息的管理。用户信息包括:用户ID、IP、设备号、支付账号和手机号等,而名单则包括黑、白、灰名单。通过把特定的用户归入到不同的名单中,可以实现名单型的风控策略。
- 策略原子管理:策略原子是指进行异常判断的基础元素。Aswan 提供了不同类型的策略原子的管理,包括:名单型策略(如用户ID位于黑名单中)、布尔型策略(通过特定的内置函数判断,如:历史登录次数大于阈值,当前设备是常用设备等)、时段频控型策略(通过判断某一行为在特定时间段内的频率进行判断,如同一设备一天内操作10次)、限用户数型策略(通过限制时间段内进行特定行为的用户数判断,如同一设备一天内10个用户操作)
- 规则管理:风控规则的配置。每一条规则,包括了策略原子组的列表,以及对应的管控原子。当用户数据触发到策略原子组所定义的规则时,就会执行管控原子所定义的行动,对用户进行管控。例如,规则的策略原子是:同一用户在一天内登录次数大于10次,而管控原子是:验证码验证。那么,当从业务的登录日志中统计得到登录数过多时,就会自动触发规则,要求用户输入验证码。通过定义不同的策略原子以及管控原子,我们就能得到一条条的静态规则,对异常的用户行为进行评估、筛选,以及自动管控。
- 日志管理、权限管理和后台配置,则与后台相关;可以通过日志进行审计,评估策略成效;通过配置不同权限,控制不同人员对于系统的访问;通过后台配置,配置业务数据源,以配合业务的变化。
对于实际业务的接入,需要通过 Aswan 提供的2个接口实现:
- 查询接口:查询用户是否命中策略,例如
curl 127.0.0.1:50000/query/ -X POST -d '{"rule_id": "1", "user_id": "10000"}' -H "Content-Type:application/json"
- 上报接口:上报用户数据,例如
curl 127.0.0.1:50000/report/ -X POST -d '{"source_name": "test", "user_id": "10000", "ip": "127.0.0.1", "uid": "abcabc112333222", "timestamp": 1559049606}' -H "Content-Type:application/json"
接入到业务时,业务方在用户执行前调用查询接口根据返回的管控码判断是否被拦截,如果被拦截,则中止逻辑;否则,执行业务侧逻辑,完成后,如果风控系统存在相关的策略,则调用上报接口上报数据,以供规则引擎后续计算。
总结
Aswan 作为一个风控系统的静态规则引擎,通过灵活的方式,进行判定规则和管控策略的配置,无需编写复杂的业务逻辑代码,也可以通过一些基础的原子规则进行组合,实现复杂的风险判定规则,并可以进行实时的自动化管控。Aswan 与业务耦合性低,无需进行代码逻辑的修改,仅需使用不同的规则配置和数据源,就可以轻松地与不同类型的业务进行对接,可复用性很强。感兴趣的开发者,可以尝试在业务中使用 Aswan,也可以进行源码学习,扩展开发适合自身业务需求的风控系统。
本文暂时没有评论,来添加一个吧(●'◡'●)