您的位置:首页 > 编程语言 > Lua

​ 为A站续命半年的不是Java/PHP,是Lua防盗链网关

2018-02-07 03:35 218 查看


第一次写技术型文章,文笔不好,好紧张,只是为了纪念一下曾经爱过的 A 站,A 站的技术小伙伴们很努力!

我仅想借此文,让大家了解 A 站的技术们为反击盗链所付出的努力。

我大概是 2017 年 6 月底接到上级领导的指示:

必须以最快的的速度开发防盗链网关。原因很简单,带宽的费用实在是太高了,公司实在难以承受,具体的数额不便透露,无论多少,省点钱可以发工资,多坚持几个月,我掐指一算,正好半年。

当时阿里的技术大哥们过来帮我们一起分析解决方案,最终一致认为:

彻底解决盗链问题必须靠二次鉴权。我先简单透露一下该防盗链网关的支出和效果吧,之后在慢慢解释细节。

防盗链网关每月的支出:

大概每月成本几千块钱

防盗链网关的效果:

在保证我站用户正常访问的基础上,节省了 90% 的带宽(节省费用大概是好多好多钱)。也就是说 A 站有 90% 的带宽是被盗链网站使用的。不做这个防盗链网关实在是无法接受这样的事实,好疼!!!

[插播] 爱永在,Ac永在:

A 站所在的办公楼是我住过最糟糕的办公楼,夏天的时候下午 6 点,整个楼的空调全部都停了,室内温度大概 30 多度,小伙伴们挥汗如雨。对于我们这种爱加班的小码农实在是无法接受。可喜的是,办法总比困难多,行政大叔给我们买了很多落地扇(好多年没有见到了),每人还自配迷你电风扇,而且 A 站的大冰柜里总有有吃不完的冰棍(还是要感谢好心的行政大叔),想想感动得想哭。。。还有,18 楼 20 楼的小伙伴们经常会在深夜探望 19 楼还在埋头苦干的码农兄弟们,送吃送喝送温暖。很难忘。。。

回到技术,我来简单说说:

什么是一次鉴权?

阿里云 CDN 自身已经有了一套基于有效时间的签名鉴权算法,保证访问 CDN 节点的 URL 中参数都不能被篡改,并且也保证了该 URL 只在一定时间内有效。但这对于盗链网站来说就是摆设,完全没有意义。有兴趣的朋友可以去看阿里云 CDN 文档,有详细说明。

什么是二次鉴权?

当终端用户访问一个视频,就会访问他/她附近的 CDN 节点,阿里云 CDN 节点会先将用户端完整的请求包发送给“二次鉴权中心”进行分析,鉴别当前访问是否合法。如果 CDN 节点收到“二次鉴权中心”回复 200 OK,则允许用户播放视频,否则禁止播放。我们防盗链网关的所有的所有就是建立在这一次询问上。

关键问题是什么?

1,“二次鉴权中心”由 A 站自己搭建,也就是我说的“防盗链网关”

2,用怎样的算法来过滤非法访问,同时,必须保证我站用户能正常访问视频

3,阿里技术大哥们语重心长地告诉我:因为有 m3u8 分片和失败重试机制等原因,所以二次鉴权中心每日要处理的访问次数大概是 40 亿次(上线后才知道,其实是每日 80 亿次)

解决方案是什么?

1,自己搭建网关不难,不就是磊服务器吗!其实我太幼稚了,还是有很多好玩的东西

2,防盗链算法这个很烧脑,想了很多办法,最终想通了,必须将用户会话的 ID,与鉴权签名数据分开传输。

说白了就是为每个会话自动产生一个用户唯一 ID,将此 ID 放在 Cookie 里,然后根据此 ID 生成签名信息,并将签名信息保存在 url 的参数里。由于盗链网站的域名跟我们 A 站的域名不同,并且 Cookie 是不能够跨域传输,所以普通的盗链网站就关门了。但并不是那么简单,高手还在后面,真正的黑客利用了阿里云 CDN 的缺陷就能破解这个 Cookie 不能跨域传输的问题。

3,每日 80 亿次处理量,压力山大,差点晕过去。醒来冷静想了想,没事,没事,方法是肯定有的,而且不需要太多的服务器。

阿里云 CDN 与 OSS 各种坑

之前 A 站使用优酷的点播系统,后来优酷并入阿里,阿里就顺利接手了由优酷留下的锅。但是话说回来,在阿里大哥们的不懈努力下,阿里云 CDN 和 OSS 真的是越来越好。

1,阿里云 CDN 存在任意域名访问缺陷,导致中间人代理攻击

    因为技术细节涉及公司安全,不能公开。我绝对不是保守,有兴趣的朋友可以单独联系我,作为朋友我们可以慢慢聊。反正线上问题已经解决。

2,阿里云提供的视频上传接口存在跨域缺陷,导致在任何一个网站上都能上传视频而不受限制

    不要试图包回放了,该问题已经修复了。

    因为技术细节涉及公司安全,不能公开,我只简单说一下这个锅,以免再犯同样的错:

    当通过 Cors 来发送一次跨域请求时,必须回答具体的网站域名,而不能是 *,否则任意域名都可以访问该接口。

    建议认真看一下 MDN:https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

3,阿里云 CDN 的节点可以被任何客户作为反向代理使用,这就留下了另外一个缺陷

    只要阿里云 CDN 节点允许用户通过 http://IP/* 的方式来访问,那么以该 IP 为 Host 的访问就能被盗链网站利用,从而劫持 Cookie 信息。

    黑客利用这个缺陷,就轻松破解了 Cookie 这么多年都不能跨域传输的“不足”。

    因为技术细节涉及公司安全,不能公开。

4,优酷提供的播放器存在严重缺陷

    上面说到,A 站之前使用的是优酷的点播系统,这套点播系统包括:服务端存储、CDN、客户端播放器三个重要部分。

    客户端播放器用 FFDEC 打开后,发现做黑客好简单,加密算法和 key 啥啥的都在,好整齐。

    由于我们上线了二次鉴权系统,所以之前使用的 key 加密的方法也不需要了。所以,即便你知道,也不影响公司的安全。

好了,

亲们都懂了,我就不啰嗦了,解决上面这些缺陷,其实我们大 A 站的盗链问题就解决了。

再后来,

说说我们的防盗链网关吧,我一直是做 C/PHP 的初级码农,如果用 PHP 来搭建这个网关,估计需要 1000 台服务器都搞不定,因为从 nginx 到 php-fpm 就需要几毫秒甚至更多的时间,而面对洪水般的盗链鉴权请求,我的处理时间不能超过 1 毫秒。所以选择只能是 Nginx+C 或者 Nginx+Lua+OpenResty。

经过分析,连接防盗链网关的客户端其实数量有限,也就几百台 CDN 节点而已,所以明智的选择是 HTTP 长连(HTTP 协议是搞不定长连这个活的,必须让它爸爸 TCP 搞定),只要调整 nginx 的 keep-alive timeout 参数,使得长连接尽可能保持,同时严格监控 time wait 数量,稍微优化几次即可。

我测试了一下性能发现 Nginx+Lua+OpenResty 这套架子性能非常好,单次请求响应时间平均是 0.3 毫秒,所以几台标配 ECS 可以很轻松处理每日 80 亿次的请求。

不写了,我大 A 站都打不开了,好难过!

爱永在,Ac永在!!!

爱永在,Ac永在!!!

爱永在,Ac永在!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACFUN A站