作者:杨洁勇
导语
视频点播为公司大部分流媒体和音视频相关的业务提供上传、存储和下载等需求。所有文件存储在相同的仓库,提供CDN下载服务的oc节点也是共用的,所以存在各个各样的盗链问题。
1、背景介绍
由于所有业务的文件都存储ftn,并且下载时提供CDN下载服务的OC节点也是相同的,所以为了识别某个下载链接是那个业务的,我们提供给业务的下载链接都会有一个相应的host用于识别各个业务(没有带上或者带上的host在下载服务没配置,直接禁止访问)。
为了防止用户或者黑客获取到下载链接后恶意访问文件,每个下载链接的url中都会带上一个vkey参数,里面包含了当前这个链接访问文件名hash值、vkey的生成时间、vkey的有效时长、通过此链接下载文件是否进行限速,当然这一切都是以一个不公开的算法加了密的。服务端收到下载请求后会解密vkey,并且对信息进行校验,限速,通过进行下一步给客户端吐数据,如果校验不通过,直接返回403.。下载链接如下:http://ip (or 域名)/host/filename?vkey
2、问题描述
首先所有文件都存储ftn,并且下载时提供CDN下载服务的OC节点也是相同的,并且除了音乐业务有自己单独的一套vkey校验库外(音乐vkey也是个坑,下面描述),其他业务(包括腾讯视频)都是用同一套vkey校验库,这就为盗链的存在提供了巨大的隐患。
1、通用的vkey算法被破解,或者一些腾讯视频精品库(付费会员才能观看)的文件对应vkey被获取后非法盗用,这时,恶意用户就可以利用这些漏洞,盗播腾讯视频精品库等内容(音乐同理)。
2、由于所有文件都存储ftn,并且下载时提供CDN下载服务的OC节点也是相同的,所有恶意用户可以利用任意业务的host下载任意业务文件(只要能正确生成vkey或获取vkey)。
3、音乐vkey校验算法没有校验文件名,也就是说获取到音乐的vkey后,可以利用音乐host下载任意业务文件。
4、音乐的vkey校验算法除了没有校验文件名之外,其实跟通过算法相同,也就是说拿到通用vkey,可以利用音乐的host下载任意文件。
3、解决措施
1、针对vkey被破解方法,这个是一个效率与安全的博弈论。或许最简单的方法是用公私秘钥(或者AES),这时候客户端知道算法也无法伪造vkey,但是公私秘钥加解密和签名耗cpu,并且要全网部署相关秘钥,怎么防止全网几千台服务秘钥不泄露等问题。通过腾讯视频播放页面或者正确的秘钥,这个更是无法阻止了,因为客户端可以任意抓包,总能获取到的下载的url。实际上也无法完全禁止文件被盗播。
那么先解决重点问题,点播这边最大的问题就是腾讯视频的精品库被盗播,利用腾讯视频自己的host和相关vkey,多次盗播视频这个问题,DC和CDN(OC)全部对腾讯视频的host接入腾讯视频那边的异步盗链打击,防止恶意用户利用腾讯视频的host盗播精品库。具体参考文章视频防盗链阶段总结。
2、针对获取到vkey后,利用非腾讯视频的host访问精品库问题,这时候这些host都死非腾讯视频业务,不能接入腾讯视频的异步防盗链打击。但是,正是由于他们是非腾讯视频host访问腾讯视频业务文件,所有禁止他们访问腾讯视频文件或者让它们只能访问自己的业务文件就解决了问题。
每个业务接入时,我们都会为业务提供一个业务id(大业务不止一个,可能有多个),在源站是,但是CDN oc节点上无法获取文件对应的bizid(DC能从ftn获取到文件相关bizid),也就无法限制host访问相关文件。无法识别bizid,有没有办法从文件名识别是否为腾讯视频的文件。其实,最后就是根据文件名的规则识别为腾讯视频文件,最后全网禁止非腾讯视频的host访问腾讯视频文件。 并且腾讯视频自己启用新的vkey校验库,独立一套校验库算法。
3、点播业务除了腾讯视频,还有两大业务,音乐和空间。前面说了音乐的vkey校验没有校验文件名,拿到一个合法(或者自己生成)音乐vkey,通过音乐就可以访问任意业务视频文件(当然访问腾讯视频文件已经被我们通过识别腾讯视频文件名禁止掉了)。这样音乐的host就可能被利用来播放空间的视频文件(特别是带颜色的小视频)。
针对这种情况,首先源站的可以获取到文件对应的bizid,发现通过音乐host访问非音乐文件(bizid),直接禁止访问。那么CDN的OC节点呢,实际上空间视频的文件命名上已经呆了bizid,所有OC节点也能根据文件名知道相关bizid,禁止音乐盗播空间视频。(现在我们接入的业务都是要求文件命名问 bizid_uuid,4位 32位,但是腾讯视频和音乐文件属于比较先接入业务,命名没根据这个规则了,所以才有了前面第2点,根据腾讯视频其他规则来限制他被其他业务host盗播)。
4、效果与进展
图1和图2为非腾讯视频vcloud添加vid 后缀做限制,不允许访问腾讯视频文件。图2波动由于5月6日禁用一些音乐回源host,盗链全部换到dl.stream这个host引起。图3是源站限制host只能访问其相关的bizid文件之后音乐回源(源站dchttp)host盗链流量掉底。
图1
图2
图3
5、后续措施
A业务的host去盗播B业务的文件,此时,如果能识别通过文件名获取到任意一个业务的bizid,就能禁止这种现象。如A业务文件能获取到对应bizida,现在A的host只能访问bizida的文件;如果如B业务文件能获取到对应bizidb,禁止bizidb文件被A业务host访问。但是,如果出现无法从文件名中直接获取任意一个业务的id,就无法通过bizid禁止这种不同业务之间的盗播。所以,在内存允许的情况下,在OC缓存节点的filemgr(文件索引管理中记录每个文件的bizid),就可以做到业务之间不相互盗播文件。