一个CPO的心得分享:搭建风控系统道路上踩过的坑
从业近10年,大大小小参与了3家公司不同领域的风控系统的设计,从前到后把风控系统所有环节都细细的琢磨过,然而至今仍然感觉刚刚一只脚踏进门而已。
大多数人做的产品都是目的明确的,比如订单支付、账户体系要做什么一开始就知道了,而且也有很多的竞品可以去参考;风控系统却完全不一样——未来要面对什么问题不可能完全了解,做每个功能都谨小慎微,因为一个不注意走错了方向,可能就会在未来的某个阶段要全盘推翻。
而对于研发资源紧缺的安全需求来看,往往会在某个时间把自己摆到一个非常尴尬的境地,问题解决不了,改造又面临大量的时间和沟通成本。
所以,把本人踩过的一些坑在这里分享出来,让准备搭建风控的人心里有个数。
业务安全风控设计101-信息采集
业务风控主要做四件事:
- 拿到足够多的数据
- 做足够灵活的分析平台去分析数据
- 产出风险事件进行阻拦风险
- 量化风险拦截的价值和不断分析案例进行策略优化
拿数据这件事几乎是决定风控系统成败的核心,由于篇幅问题我们先主要说这点,主要有三件事要考虑:
1 拿到的数据越详细越好
拿账号安全这件事来举例子,如果能拿到基础的登陆注册数据,就可以从频率、登陆注册特征来进行分析;
如果可以进一步拿到登陆注册行为的上下文,比如登陆前访问了哪些页面,登陆后去访问了什么,就可以从访问行为轨迹来增加更多的分析维度,例如页面停留时间,是否有访问到必访问的页面等;
如果还可以拿到用户的操作行为数据,比如鼠标移动的轨迹,键盘输入,那么可以进一步的从操作过程来增加分析维度,比如是不是输入密码的时候有过多次输入删除?是不是直接复制粘贴的账号密码?
2建立标准的日志格式
确认好能拿到哪些数据以后,就要开始建立标准的日志格式。
常见的登陆、注册、下单、密码修改、绑定凭证修改等等都要给出一个标准的日志格式,而且要充分考虑到字段命名的统一,比如密码、用户名字段的名称如果在不同的日志中叫法不统一,在后续分析和指定策略的时候都会遇到不小的麻烦。
3拿到的数据质量
必要的字段是否都能拿到?
往往风控关心的信息比如IP地址、UserAgent、referer这些信息业务都是不关心的,但这些信息的缺失可能造成很多策略没法做,所以在采集信息开始的时候就要有个明确的信息列表,一旦妥协了后面再去返工让研发加是会遭白眼的。
数据信息拿的是否准确?
比较常见的是需要用户的访问IP,结果拿到的IP地址是内网的服务器IP;或者是想要用户名,结果传递过来的是UID。这点需要大量的前期沟通确认工作,一旦上线了以后发现数据不对再改也同样要遭白眼。
拿数据有主动方式和被动方式两种:
1主动方式方式
主动方式是自己去数据库、日志里面去读。
这种方式实时性比较差,而且基本有什么拿什么,想加信息是比较难的,但不需要研发配合太多事情,适合喜欢自己动手丰衣足食的场景。
当然有些比较成熟的公司有自己的消息总线,风控可以去实时的订阅信息然后作为数据源进行分析,但这种通常为少数;
2 被动方式方式
被动方式就是提供接口给研发,让业务把消息按格式标准喷过来。
这种配合周期非常长,但可以按照标准来拿到高质量的信息,所以是比较常见的风控系统搭建方式。
踩坑记
1号坑:
如果拿消息是多数据源的时候,必须要考虑到消息的时间序问题:
比如登陆日志是公共服务发过来的,网页访问是拿的access_log,用户操作行为数据是页面JS或者SDK发过来的,那么这三者的时间是不一致的。
这就必须要在确认所有的消息到位之后再进行分析判断。否则,如果实时策略考虑了登陆的时候必须有页面键盘点击,而两个数据到位的时间不一致,就可能出现大量的误封造成事故。
2号坑:
对采集回来的数据必须定期的对数据质量进行监控——
已经采集到的数据可能因为技术架构调整,代码更新等各类奇葩原因造成采集回来的数据不准了,如果无法及时发现可能造成后面一系列分析过程都出现错误。
3号坑:
采集点尽量选择稳定的业务点,比如采集登陆日志,一次性在公共服务采集好,后面出现问题只要找一个点。
如果是去前端从WEB、移动端等各个调用登陆服务的点去采集,出了问题要改动的工作就会成倍增加,还有可能出现新业务点的日志无法覆盖的情况。
4号坑:
关于技术选型:
消息队列是必须的,用restful只能处理业务日志比如登陆这种1秒最多几次的类型,如果后期要去采集页面访问行为这种一秒上千的消息就必须要用到队列.
开源的可以考虑RabbitMQ或者Kafka,稳定性都还不错。
5号坑:
关于日志存储:
ELK是不错的选择,为后续的分析平台提供基本的查询功能。
101 信息采集 结语
信息采集往往是实施风控的最难的一个环节,但也是最重要的环节,覆盖、质量、时效都决定了项目的成败。
因为出于沟通的压力,往往会有比较多的妥协,也就为后期风控系统的搭建埋下了隐患,其实也很难一篇文章把细节描述详尽。
业务安全风控设计102-风险分析
上一章介绍了第一点,如何去获取足够多的数据,而接下来的事情就是要创建一个机制去灵活的处理这些信息,为自动分析捕捉风险事件提供基础原料,进而借助规则引擎从中分析出风险事件。
在开始前,我们还是回顾下业务风控主要做四件事:
- 拿到足够多的数据
- 做足够灵活的分析平台去分析数据
- 产出风险事件进行阻拦风险
- 量化风险拦截的价值和不断分析案例进行策略优化
接下来,同样的有三件事情需要考虑:
1.让分析人员可以快速的查询原始日志
日志并不是简单的存下来,从风控分析的需求来看,通过IP、用户名、设备等维度在一个较长的跨度中搜索信息是非常高频的行为,同时还存在在特定类型日志,比如在订单日志或者支付日志中按特定条件搜索的需求。
而这些主要是为了能够让分析人员可以快速的还原风险CASE,例如从客服那边得到了一个被盗的案例,那么现在需要从日志中查询被盗时间段内这个用户做了什么,这个过程如果有一个界面可以去做查询,显然比让分析人员用grep在一大堆文件中查询要快的多,并且学习门槛也要低得多。
如果在日志做过标准化的前提下,也可以进行后续的业务语言转译,将晦涩难懂的日志字段转化为普通员工都能看得懂的业务语言,也能极大的提升分析师在还原CASE时阅读日志的速度。
2. 实时或定时的计算加工消息成变量&档案
例如在分析某个帐号被盗CASE的时候,往往需要把被盗期间登录的IP地址和用户历史常用的IP地址进行比对,即使我们现在可以快速的对原始日志进行查询,筛选一个用户的所有历史登录IP并察看被盗IP在历史中出现的比例也是一个非常耗时的工作。
再比如我们的风控引擎在自动判断用户当前登录IP是否为常用IP时,如果每次都去原始日志里面查询聚合做计算也是一个非常“贵”的行为。
那么,如果能预定义这些变量并提前计算好,就能为规则引擎和人工节省大量的时间了,而根据这些变量性质的不同,采取的计算方式也是不同的。不过还好我们有一个标准可以去辨别:频繁、对时效敏感的利用实时计算(比如访问频率、时间间隔);而相对不频繁、对时效不敏感的利用定时计算(比如用户的常用IP、设备,即使少算短期内的登录记录,也不会受到太大影响)。
3. 选择规则引擎将人工策略自动运行
一个设计优雅的规则引擎是把分析师的经验决策和数据最终转化为风险输出的核心模块,首先说为什么需要规则引擎而不是选择硬编码逻辑——
笔者无数次遇到过这种场景,一个上午刚刚上线的策略,没过1个小时,攻击者或者欺诈者就已经试出绕过策略的方法了,如果你的风险控制逻辑是硬编码,那么恭喜你,再走一遍开发测试发布流程。
快速响应是安全的生命线,无法想象还有比被攻击者胖揍48小时然后才反应过来去挡脸更让人沮丧的事情了。
所以策略引擎必须能把策略逻辑从业务逻辑中解藕出来,让防御者可以灵活配置规则在静默模式下验证和实时上线生效,并可以去随时调整。
类似的开源框架有很多,各有优劣,但如果需要降低学习曲线,必须进行一层包装(这里又是一个比较大的话题,就先略过了)。
坑位标注:
1、Sharding会影响到你的策略
为了支持并发和性能,通常在利用集群计算变量的时候我们会用到sharding。
sharding方式会按IP把数据分配到不同的运算单元中去处理,在读取结果的时候按IP去集群中的某台机器中去拿数据,以大幅提升并发处理读取计算结果的能力。
那么,现在如果我想去按某个USER去拿数据的时候,就会发现一个用户在不同IP下的信息被保存在不同的服务器上了,所以单一的Sharding分配肯定是不合理的,这点必须要注意。
2、策略中用到的变量,能不用现场算的就不用
有些简易的策略引擎设计中用到的变量都是到数据库里现场算的,虽然可以极大的提升灵活性(新的变量不需要考虑历史数据回补),但会极大的影响稳定性和响应时长,尤其在业务请求爆发的时候几乎都会出现宕机无响应的问题。
要知道业务研发对安全的结果并不是那么敏感,但如果出现了问题导致应用不稳定给人添麻烦,被抛弃可能就是早晚的事情,所以变量一定要尽量做到提前计算,并且设立缓存机制。
3、对风险分析要用到的计算资源有充分的认识
毫不夸张的说,合格的风险分析要做的实时、准实时计算量要大过应用内所有计算的总和甚至超过几倍。
其实这也很好理解,比如一个典型登录场景,业务要做的逻辑最主要的就是检查密码和帐号的身份是否吻合,而风控要把这登录用户的历史档案全部拉出来看个遍,然后根据风控策略来决定是否放行。所以在规划风险分析要用到的资源时请不要吝啬,按业务5X甚至10X的标准来评估风险分析的资源需求。
如果说信息采集主要看的是安全产品经理的沟通协调能力,设计风险分析功能更多的就是考验安全产品经理的逻辑思维能力。
到了这样一个阶段,外部冗杂的沟通协调已经结束,但如何最大化利用前期打下的基础,需要对风险问题的分析、决策过程有一个非常清晰的认识,这里也有一个比较好的标准来去检验:
- 分析平台设计的差,那么就只有设计者自己会用;
- 设计的好,你会发现处理投诉的客服、分析师都会很乐意来用你的分析平台为他们解决问题。
业务安全风控设计103-阻断风险
本系列的上一篇文章介绍了在采集信息后如何去分析这些数据产出风险事件,而产出的报警已经脱离了业务系统并不能被采用的。说白了:
分析出来的东西不能光自己看着High,还得去阻拦这些风险才能真正产生业务价值。
在开始前,我们还是回顾下业务风控主要做的四件事:
- 拿到足够多的数据
- 做足够灵活的分析平台去分析数据
- 产出风险事件进行阻拦风险
- 量化风险拦截的价值和不断分析案例进行策略优化
到了第三步我们离整个系统核心框架的搭建就只剩一步之遥了,那么让我们看看这个环节要考虑什么:
1、最终呈现给业务研发直白的判定结果
我们最终从数据中发现的报警和问题最终是要在业务逻辑中去阻拦的,在接入这些结果的时候,往往分析师觉得可以提供的信息有很多,比如命中了什么规则、这些规则是什么、什么时候命中的、什么时候过期,其中最让接入方心烦的当属风险分值当仁不让了,很多接入风控的研发看到这些分值就一脑袋包:
你到底想让我做什么,拦还是不拦?这时候如果你喏喏的再丢出个多少分值以上要拦,研发多半都会跟你说直接给我结果就好了。
是的,很多风控接口设计的都十分累赘,无用信息多到研发会觉得你在故意浪费带宽,其实一个code list给他们说明对应希望做的操作就好,一定把你觉得那些很牛逼的中间结果等等包装成最终结果再给出去。
2、T+0还是T+1
举个例子来解释实时(T+0)和异步(T+1)风险判断的区别。
T+1
你在打拳击比赛,选手A只会打脸,上来就照着你脸来了一拳,你分析了一下打脸很疼而且不科学,在第二拳往脸挥过来时你突然告知对方不可打脸,对方就成功的被你克制住了。这就是T+1的特点,至少要在第二次风险攻击才可以生效;
T+0
拳击比赛第二场对阵选手B,同样被打脸后你说不可打脸,对方说好,结果冲着肚子就来了一拳。你说禁止打肚子,对方又一拳打腋下。这时你发现要在对方挥拳马上打到你之前就要禁止。
这就是T+0了。
因为T+0在接入的时候要额外承担很多计算成本,结果要现场算出来而延时要求又很高,所以一般都只在攻击者得手关键步骤采取实时判断(比如订单支付或者提现请求)。而对于其他场景可以选择T+1方式,比如登录或者提交订单等。
3、阻断逻辑到阻断产品
这一点我们岂安在对外演讲的时候介绍过很多,在阻断风险的时候事件发生的点是不同的,但短期又不可能让业务研发在所有的地方接入风险阻断怎么办?
所以我们需要考虑几个基本的保底措施,比如统一的验证码验证页面在IP层全局防止任何爬虫脚本行为,在账号层通过登录态管理统一拦截单个账号在登录后任何风险行为(全局强制登出)。
可能这些措施在体验上不是最好的,但是在发生特殊问题的时候要等研发给你临时加阻断逻辑这个时间就没法控制了。
坑位
1、接入风控阻断的逻辑位置
登录的时候账号输入框鼠标失焦就要去走风控了,登录结果出来之后再去判断就没意义,而资金相关的一般是在跳转去收银台之前,你会发现一般风险判断都是在结果出来之前(收集本次行为完整日志之前),所以如果你要做T+0判断,就要求研发在进行风险判断的时候要提供更完整的信息,而不是只给个IP或者账号名就行了(往往T+1就之要这些就够)。
2、对业务流量充分调研并关注
平时可能流量很小的业务,突然因为某个活动(比如秒杀)流量大增,除了在接入之初要对风险判断请求有了解,对后续的活动也要提前准备,否则如果资源预估不足,突然又赶上这个点接了T+0接口有很多要现场计算的逻辑,陡增的业务流量分分钟教你做人。
3、bypass ! bypass ! bypass
风控风险判断的最基本原则就是要不影响业务逻辑,所以超时机制在一开始就要严格约定并执行,一旦发现风控接口超过预计响应时间立马放行业务请求。
4、让一线同事们知道你在做什么
任何风控准确率都不是100%的,所以在和研发沟通好接入后一定要告诉一线同事们风控阻断可能出现的表象,以及大致的原因,以避免一线客服们对风险拦截的投诉不知道如何解释,并给出具体的阻断回复措施(加白名单、删除黑名单等等,上帝们在某些日子比如315维权意识是非常强的)。
103 阻断风险 结语
阻断是最终产生真实价值的环节,另外也是关联部门最敏感的环节(吓唬我半天逼着我把风控接了,结果一天到晚给我出毛病?生产环境是给你们玩的?!),请保护这至关重要的信任,你后面会越做越顺的。
业务安全风控设计104-风险分析
风控系统和大部分的产品项目一样,最终需要对领导层汇报这个项目为公司带来了什么价值,这是评估项目成功与否的要素;另外是哪里做的不够好,如果改善了能带来更多的价值,给出了预期才有后续资源的补充,整个项目才能转起来形成一个良性循环。
而这个系列的最后一话:我们来讲讲如何对风控系统进行效果评估与优化。与之前三期的文章一样,我们再来洗一次脑业务风控要做的四件事:
- 拿到足够多的数据
- 做足够灵活的分析平台去分析风险
- 产出风险事件进行阻拦风险
- 量化风险拦截的价值和不断分析案例进行策略优化
让我们看一下这个环节要考虑的:
1.找到钱在哪里
风控项目的基本价值在于省钱,而省钱的思路基本有三种:
- 直接拦截风险带来的止损(比如提前阻止了一笔欺诈交易所挽回的损失)
- 提升服务稳定性所带来的业务基本指标提升(比如因阻止风险事件所降低的服务响应延时而提升的业务转化)
- 降低服务不可用概率事件所带来的直接业务损失(比如降低了风险事件导致服务宕机所带来的营收损失)
可以看出这三点是按风险事件的暴力程度做出的简单划分,其实也还有很多其他不同的视角来分类,很大程度上和对应企业的互联网业务形态有关。
而我们做这样划分的目的是为了在一开始就明确风控项目从哪里可以挖掘效益,很多情况下风险事件不是一个独立的问题,而是一个链条,由一些看起来影响不大的问题逐层深入的。
比如,交易欺诈并不是一个独立的问题,而是因为注册环节发生的垃圾注册问题攻击者手里有了大量的账号所导致的,所以任何一个风险问题都是有价值的,无利不起早,但作为风险分析者应当有能力找到其中的关联转化关系,并预测对方的得手点进行效果评估会有更好的效果。
2.有效利用预期价值的力量
天下没有100%准确的风控策略,所以在接入拦截的过程中业务方可能存在种种阻力,往往的一个误区是没有拦截就认为风控没有效果,其实效果评估不只是在最后项目落地评估价值所用,在推行项目中间也有很好的效果,虽然没有拦截,但预期效果放在那里,这对决策者平衡业务影响有着重要的价值。
3.学会考虑企业财务目标
风控系统并不是一个可有可无的东西,其实大部分企业中安全已经是业务的必要组成部分了,那么我们知道在资源有限、而业务风险问题无限的情况下,所有的资源投入都必然有一个优先级,而这个优先级与整个企业发展的现状必须是牢牢捆绑在一起的,讲简单些:风控系统解决什么问题,评估出的效果与企业目前业务关心的问题息息相关,如果企业目前的业务重点在一次年度促销活动,那么风控的重点就应当在促销羊毛党;如果企业目前面临严重的账户盗用投诉问题,那么重点就应在账号安全。
尤其在风控系统启动之初,配合系统的需求交付时间选择对应的重点问题,对于项目效果的评估是一个巨大的加分项,切记一开始就贪大贪全。
4.策略的生命周期和健康度
风控系统的规则有多少?哪些已经很久没有触发了?产生误判投诉的对应规则有哪些?
一个新规则在建立起初的效果肯定是最有效的(因为这时风险问题正在发生,而规则正好对应了风险),但随着时间其有效性是快速下降的,比如攻击者都知道网站三次输入密码错误触发验证码,那么他们会傻傻的尝试第三次猜测密码的概率有多大?那么是否有人在定期的去统计分析这些规则的效率就是风控产品的重要运营环节了,而运营风控产品所要付出的代价是往往大于常规互联网业务产品的,并且是保证项目能够持续产出价值并不断迭代进化的一个前提。
写在最后
业务风控是一个非常具有挑战性的项目,我一直把它比作一种竞技游戏,而这种攻防不同于传统安全(在传统安全你并不能有足够的技术能力预测所有人的攻击方法),它更强调逻辑和预测,攻守双方在一个双方充分了解的环境下(业务逻辑简单到任何人都可以理解,但又可以产生无数的变化和组合)不断的博弈,而这正是业务风控系统的乐趣所在。
业务风险问题足够简单而又足够复杂,正是这样的原因其参与攻击者并没有太高的门槛限制。处于国内互联网的环境下,任何一家企业都不可能逃开业务风险问题的影响。
作一个比喻,这片土壤是有着自己的一些特质的,而企业如果是生长在这片土壤中的一颗树,投入足够的养分才能快速生长,而业务风险则是寄生于树木窃取养分的角色,只有能够充分抵御这种风险的才能成长为参天大树。
作者:刘明,岂安科技联合创始人,首席产品技术官。超过6年的风控和产品相关经验,曾就职网易,负责《魔兽世界》中国区账户体系安全。现带领岂安科技互联网业务风控团队为客户提供风控服务。
本文由 @刘明 原创发布于人人都是产品经理。未经许可,禁止转载。
66666
辛苦
详尽且贴近互联网金融的实际~感谢分享!
楼主文笔真好 好幽默