看一个运维如何拯救市值百亿的互金平台

xiannv  1148天前

图片.png

多年前,又是周六客服打电话过来,平台官网不能访问,app完全无法打开,客户在QQ群和微信群中各种反馈,说平台是不是跑路了?客服的多条400热线完全被打爆,电话已经接不过来…

前言

作为一个互联网金融平台,涉及到用户资金,任何的服务(资金)差错用户都是不可容忍的,用户不懂什么是数据库,不管你什么网络不通,哪怕只是一小会儿,看不到钱在 App 里面展示都会觉得不安。

在已经有很多 P2P 公司跑路的前提下,用户个个都被锻炼成了福尔摩斯侦探,每天打开 App 查看收益,监控着平台的一切,甚至半夜升级断网十分钟,都会被用户察觉,直接就发到群里面,更有甚者直接在 QQ 群或者微信群中开骂:你们的技术行不行?

下面给大家介绍我们从零开始起家,到现在可以支持百亿交易量的平台所遇到的几次关键事故,有大也有小,挑出一些比较有代表性的事件跟大家分享。

一、黑客攻击

2015年应该是互联网金融行业受黑客攻击最多的一年吧,各互金公司都深受其害,当时我记得*贷之家有一段时间被黑客攻击的太厉害,连续几天网站都无法打开。

当然我们也未能幸免,DDoS 攻击、SQL 注入、漏洞渗透等等,几乎都经历过,有的黑客比较仁慈,应该是出于善意或者展示自己,将漏洞放到乌云上面或者漏洞盒子里面让厂商来修复。但更多的是一些黑产,完全就是威胁、敲诈、想捞一笔钱,先看看下面这位吧:

图片.png

这个家伙潜伏到我们公司的客户群里面,冒充我们的客户代表将头像和资料替换成一样,然后给群里所有的客服发消息,让发送我们内部的后台地址给他,想通过这种方式来寻找突破口,当然这是里面的小菜鸟。

1、DDoS攻击

DDoS 攻击我们也遇到了很多次,确实没有比较好的办法,最后都是通过一些笨办法来尽量避免的,先说说我们的经历吧。

有一次我正在敲代码,客服 QQ 又闪烁了起来,还没来得及打开查看,客服的经理就直接打电话过来了,我立刻一种不祥的预感,他说官网打不开了,后台也登录不了。

挂了电话,我在本机进行了测试,果然不行,立刻准备登录 VPN 查看服务器各项指标,结果登录不上去,马上上楼找运维经理,他也登录不上,刚准备给机房打电话的时候,机房来电话了,说我们的一个 IP 正经历着 1G 多的流量访问,问我们是否正在做什么活动,话没说完,就又说流量已经到 5G,不到一分钟之后流量已经到达 18G 之多。

因为我们的机房和集团公用了一个入口,结果集团上面陆续反馈他们的网站、服务也都出现了问题,机房方面害怕引起更大的冲击,直接把我们官网对外的IP封掉了,集团的其它业务才慢慢恢复了过来,我们也紧急更换了外网IP,重新切换了域名解析后才恢复。

事后我们根据 Apache 分析了日志,流量来自N多个不同的IP地址根本无法应对,也是因为这次攻击,我们领导重视了起来,将我们公司的机房网络层和公司集团彻底分离,这样不管哪一方受到大流量攻击都不会相互影响。

当然我们也想了一些其他的办法,来尽量避免此类情况的发生,因为毕竟金融公司如果经常出现这种网站打不开、APP打不开,400电话打不进来,对客户而言是一种很不好的体验,在P2P行业很敏感的时期,很容易给品牌造成负面影响,严重者直接引起客户的恐慌,给公司造成致命的打击。

当时我们老板托关系,找到了从网宿这家上市公司出来,专门做网络安全的一家公司--智安网络,用的是他们的云联防产品。当时也考虑了一些大的厂商,最后因为价格实在是太贵了,小企业根本承受不起。

2、周年庆的DDOS攻击

还有一次我们正在做周年庆活动,突然有人在 QQ 群里面给我们客服说:叫你们的技术负责人来找我。然后我们的网站就挂了,我还保留了当时的一个对话:

黑客:你是平台的技术负责人吗?

我:算是吧

黑客:你信不信我可以让你们官网在5秒之内挂掉?

我:…(沉默,还真害怕又把官网搞挂了)

黑客:你们的官网漏洞很大

我:如果有好的建议请您赐教

黑客:你们的服务器是不是什么防护软件都没有装?

我:…(继续沉默,这会在想不会是那个安全厂商来推广产品的吧,当然我们基础的防护肯定有)

黑客:我们有非常多的肉鸡,想攻击谁,几秒之内肯定搞定

我:

黑客:我们已经给很多互联网金融行业做了渗透测试,花点钱帮你们摆平,保证以后不会再出事情

我:

黑客:免费的策略也有很多,比如 360、百度云的安全产品可以免费抵挡10G 左右的流量

……(中间省略)

黑客:我说了这多,你们是不是给包烟钱,表示表示?

……

后来也和领导进行了商议,坚决不能给他们钱,不能助长这种嚣张气焰,实在不行就报警!

曝光一下当年使用的假 QQ 号,刚查了下变了个头像和描述,如下:

图片.png

后来我一直在想:为什么 DDOS 攻击总是喜欢根据外网 IP 来攻击呢?后来慢慢有些理解了,如果针对域名来攻击的话,那不就是攻击到域名商的服务器了吗?而一般域名商比较强大,黑客不太搞的定,也确实没有必要。

记得前一段时间,某著名域名服务商被攻击,导致国外 Twitter 等著名的互联网公司访问中断达半天以上,这是很严重的。但是对于我们这样的小公司,倒不至于搞这么大的动作。

那到底如何正确的防止 DDOS 攻击?根据我的个人经验总结了几条:

第一种方案,隐藏服务器外网地址,服务器前端加 CDN 中转,免费的有百度云加速、360网站卫士、加速乐、安全宝等,如果资金充裕的话,可以购买高防盾机,用于隐藏服务器真实 IP,域名解析使用 CDN 的 IP,所有解析的子域名都使用 CDN 的 IP 地址。

此外,服务器上部署的其他域名也不能使用真实IP解析,全部都使用CDN来解析;

第二种方案,买一些安全产品来进行流量清洗,不差钱的可以选择阿里云、腾讯云等这种大厂商提供的服务;中小型企业建议选择一些第二梯度的厂商,比如:智安网络,因为我们就用的这家公司的云联防,后面基本上没出现什么大的问题。

第三种方案,有很多的防火墙产品声称可以防止 DDOS 攻击,但是我个人使用感觉效果非常有限。

3、SQL注入

我们的官网使用的是 PHP 开发,因为框架比较老旧的原因,存在着一些 SQL 注入的点,我们发现后进行了修补,没想到还是被一些黑客找到了突破点。

这里要感谢这些黑客在漏洞盒子上提交的 Bug (如下图),最后我们根据提示进行了紧急修复,后来我们也在 WAF 防火墙配置了一些拦截 SQL 注入的策略,起到双保险的作用。

图片.png

我一直在想为什么 PHP 一般比较容易出现 SQL 注入,而 Java 较少呢?我估摸着有两方面的原因:

第一,PHP 一般在前端使用的较多,受攻击的机会更多一些,Java一般作为后端服务,攻击的可能性会比较少;

第二,PHP 框架较多,而且很多早期的框架并没有特别考虑 SQL 注入的情况。Java 大量普及了 Mybaits、Hibernate 等 ORM 框架,框架本身对常见的 SQL 注入有防御的功能,但不是说他们就没有被 SQL 注入的可能,大部分场景下是 OK 的,另外参数化查询可以有效的避免 SQL 注入。

其它攻击

其它方面的攻击,主要是在业务方面,比如我们当初有一个很小的失误,有一个程序员在 H5 的网页中将发送短信验证码返回了前端,最后被黑客发现了,利用这个漏洞可以给任意的用户重置登录密码;

短信攻击,现在的网站几乎都有发送短信或者短信验证码的功能,如果前端不做校验,黑客会随便写一个 for 循环来发短信,一般系统的短信会进行全方位的防控,比如:

a、前端加验证(字符验证码,有的是拖拽的动画);

b、后端根据用户或者 IP 加限制,比如用户一分钟只可以发送一条短信,忘记密码的短信一天只能发送10条、一个 IP 地址限制每天只能发送100条短信等。

4、互金平台BUG

重复派息

2015年的某一天看到一个新闻说是陆金所的一个用户发现自己银行里面突然多了很多钱,没过多久又被扣走了,然后收到陆金所那边的解释,说是给用户还本派息的时候程序出现了问题导致还本派息两次。

当他们程序员发现了此问题后紧急进行了处理,用户当然闹了,也上了新闻,当然陆金所通道能力确实比较强可以直接从用户卡里面扣,当大家都兴致勃勃的谈论这个话题的时候,我却有一股淡淡的忧伤,为什么呢?

因为这个错误我们也犯过,具体说就是我搞的,大家不知道我当时的心里压力有多大!

事情是这样子的:我们使用的第三方支付的扣款接口不是特别的稳定,于是我们前期就对接了两种不同的扣款接口,平时前端投资的时候走一个接口,后端派息或者还本的时候走另外的一个接口,在初期的时候扣款接口不稳定,因此在给用户派息的时候经常会有个别用户失败,需要手动给失败的用户二次派息。

作为一个有志向的程序员当然觉得这种方式是低效的,于是将程序改造了一下,在后端派息的时候,如果第一种扣款失败的时候,自动再次调用第二种扣款接口进行扣款,当时想着这种方式挺好的,各个环境测试也没有问题,上线之后监控过一段时间也运行稳定。

当感觉一切都很美妙的时候,事故就来了,突然有一天,客服反馈说,有的用户说自己收到的利息感觉不对,好像是多了(真的是太感谢这个用户了),我登录后台看了一下派息的流水,复核了一遍,果然利息被重复派了,感觉一盆冷水从头而下。

我把当天所有的用户派息记录和到期记录都进行了检查,发现影响了70多个用户,导致多派息了6万多元,幸亏只是派息出了问题,如果是到期的话,金额会翻N倍,其中70多个人里面有几个进行了提现、几个进行了再次投资,绝大部分用户在我们发现的时候还不知情,金额也没有动。

怎么处理呢,当然不能直接就动用户的钱了,只能给每个重复派息的用户打电话,说明原因并赠送小礼物,请求谅解后,我们把重复派过的利息再次调回来。

大部分用户进行了核对之后都还是比较配合的,当然肯定有一些用户不干了,但你也不能怪客户,因为都是我的原因。有的客户需要上门赔礼道歉,有的客户需要公司出具证明材料,我们的老板还亲自给客户打了N个电话,被客户骂了N遍,我心里压力可想而知,当时心中真是一万个***。

其中有一个客户特别难缠,各种威胁,说既然到了我的账户里面,肯定是我的,你们的失误不应该让我来承担,折腾了很久。

你可能会说有的互联网公司经常出现这种问题后就送给客户了,哎,可是我们是小公司呀!这个噱头玩不起。

到底是什么原因呢,事后进行了复盘也给领导做了汇报:平时都是首先进行派息的定时任务,过一个小时之后进行到期的定时任务,当天的派息标的比较多,跑了一个半小时,就导致了派息和到期的两个定时任务同时进行,转账有了并发,第三方支付的接口不稳定,给我们返回失败,其实有的是成功的,就导致了我们进行了二次的扣款尝试,引发了此问题。

这个事情给我带来了非常大的教训,对于金融扣款的这种事情一定需要谨慎,哪怕付款引发报警之后再人工处理,也不能盲目重试,极有可能引发雪崩效应。

总结

古代对将军的要求是,心有万马奔腾,面如湖水平静,在互联网行业,对领导的要求也如此,特别是技术负责人,在面对生产事故的时候,一定是先安抚同事,静下心来找到问题本质,再去解决,而不应该不断去施加压力催促,重压之下很多心里承受能力稍弱的队友,会更加慌乱,不但不利于解决问题,还可能引发二次事故。

在看淘宝双十一视频中,有一段感受特别深,在双十一初期,虽然技术团队做了很多的准备,但是在零点过后流量瞬间涌入,服务被打垮,部分用户投诉刷新不出网页,紧接着隔壁同事也都反馈网站打不开,大家都在慌乱中,XX一拍桌子大喊一声,大家都别动,三分钟之后再说,过了几分钟之后服务慢慢恢复了正常。

后来回忆说,当时虽然服务瘫痪,但是监控到有部分业务成功,说明系统并没有被压垮,而此时的任何操作都有可能引发更大的问题,从此之后此人一战成名,成为阿里大将。

有很多记的不是特别清楚了,写的比较粗糙望见谅。


原文链接:

智安网络:https://zhuanlan.zhihu.com/p/43080151

最新评论

wnvmike  :  学习了..
1144天前 回复
cold  :  学习了
1144天前 回复
昵称
邮箱
提交评论