从 2006 年 Amazon 发布 EC2 服务至今,已经过去了 11 年。在这 11 年里,AWS 收入从几十万美金上涨到 100 多亿美金,让云计算走进每一家企业。
根据信通院发布的“2016 云计算白皮书”,目前近 90% 的企业已经开始使用云计算(包括公有云、私有云等),这说明大规模云化对于企业而言已经不只是趋势,更是确凿的既成事实。
云化普及的同时也给安全带来很多挑战,主要包括:
01云化导致以硬件设备为主的传统安全方式失效
在跟企业交流时,不止一家企业提出了这样的担心:在上公有云的过程中,因为无法把已购买的硬件防护搬到云上,所以非常担心业务安全性。
有趣的是,他们对于上云后的流量层攻击反倒不担心,因为他们认为云上的高防 IP 等产品可以解决大部分问题。云化导致了业务层的安全空白,这不仅发生在公有云环境,在私有云环境也时有发生。
02云化导致攻击/作恶成本大大降低
云是 IT 领域里“共享经济”的再升级,从最早的 IDC 租用升级进化到 Linux kernel namespace 租用,但这种“共享经济”在给企业带来成本降低、使用便利等益处的同时,也给攻击者带来了同样的好处。
按目前市场行情,攻击者租用一个公网弹性 IP 的成本可低至 1 元/天,租用一个 IaaS 平台的 hypervisor 层的计算环境,每日成本也只有几元,如果是 container 层的计算环境,成本还要更低。
在如此低的成本下,致使攻击者不再像过去那样花大力气挖掘培养肉机,而是可以在瞬间轻松拥有用于攻击的计算网络资源。
以某著名互联网招聘领域网站为例,攻击者最多可以在一天内动用上万个 IP 以极低的频率爬取核心用户简历。
03云化导致业务可控性降低,遭遇攻击的风险大大提高
云客观造成了业务的复杂性和不可控性:大量自身或合作方的业务都跑在同一个云上,其中任何一个业务被攻击,都有可能对其他部分造成影响。
不可否认的是,现有的 hypervisor 隔离技术很成熟,以 CPU 为例,通过计算时间片分配进而在执行指令间插入各种自旋锁,可以精确控制执行体的 CPU 分配,其他资源包括内存、IO 也都可以恰当的控制。
但在所有资源里,隔离性最脆弱的就是网络,尤其是公网,毕竟 NAT 出口、域名等很难被隔离。
所以,我们不得不面对这样的现实:在享受云计算时代红利的同时,面临的业务层安全问题也越来越严重。
机器学习是解决安全问题的金钥匙
机器学习发展史
由上图可以看出,目前大红大紫的深度学习,其源头-神经网络,早在上世纪 70 年代就已经被提出。
从上世纪 80 年代到本世纪,机器学习经历了几次平淡期和爆发期,随着大数据的发展和一些热点事件(如 AlphaGo 战胜李世石),机器学习又一次进入爆发期。
那么,大数据和机器学习有什么关系呢?这还要和深度学习挂钩,从理论上讲,深度学习本质上是利用多层的神经网络计算,代替传统特征工程的特征选取,从而达到媲美甚至超越传统特征工程进行分类算法的效果。
基于这个逻辑,当标注样本足够多时(即所谓“大数据”),通过深度学习就可以构造出非常强大的分类器,如判断一个围棋的棋局对哪方有利。
AI 随着深度学习的火爆看似非常强大,但不幸的是,目前 AI 的发展成熟度远没有达到可以取代人脑抑或接近人脑的水平。根据图灵测试理论,AI 本身要解决的问题有:识别、理解、反馈。
这三个问题逐步递进,真正智能的机器人最终可以跟人脑一样反馈,从而在图灵测试中无法区分它是人还是机器。
按当前 AI 发展情况,“识别”的进展目前效果最好,无论是图像、语音还是视频,很多厂商都可以做到很高的识别率;但“理解”就差强人意了,大家都用过苹果的 Siri,它还未能达到与人真正对话的程度。
而反馈就更难了,这要求在理解的基础上不断地应变,同一个问题可能因对方身份、心情、交流场合不同,以不同的语气语调做出不同反应。
所以,目前应用机器学习效果非常好的领域,几乎都是某个特定领域内的识别问题,并非通用领域,如人脸识别、人机对弈(人机对弈本质上也是某个棋种领域的识别问题:机器通过学习成千上万的棋局后,就可以自动识别某一棋局在一方走的情况下对谁有利。)
非常幸运的是,安全领域中的问题大多是特定场景下的识别问题,而非通用场景,也并未涉及理解和反馈,你只需要把相关数据交给机器学习系统,让它做出识别判断即可:安全或者不安全,不安全的原因。
正因为安全问题本质是特定领域内的识别问题,所以从理论上讲,机器学习非常适合应用在安全领域,是解决安全问题的金钥匙。
机器学习在安全领域的应用难点
虽然机器学习早已存在,但是长久以来并未改变安全市场,究其原因,主要有以下几点:
01安全领域的样本标注成本较高
对于机器学习而言,拥有海量、完整、客观、准确的标注样本异常重要,标注样本越多、越全面,训练出来的分类器才可能越准确。
对于所有行业来讲,获取样本(标注样本)都不容易,而安全领域尤为困难。如对人脸识别的标注,初中生甚至小学生就可以完成,但对于一次安全的威胁事件,就需要极具经验的安全人员才可以完成,两者的成本差距十分巨大。
某个注入攻击
如上图所示,这个注入攻击经多次复杂编码,非专业人事很难进行样本标注。所以目前在通用场景下,安全领域的深度学习落地并不多,主要原因也是很难获取海量的标注数据。
02安全领域的场景特点更加明显
判断攻击的标准会随着业务特点的不同而不同。以最简单的 CC 攻击为例,600 次/ 分钟的访问对于某些企业可能意味着破坏性攻击,但对其他企业则属于正常访问范围。
所以,即便有大量的标注样本,某一企业的标注样本可能对于其他企业毫无用处,这也是导致安全领域应用机器学习较为困难的另一个重要原因。
03针对传统的文本型攻击,传统思维认为简单的特征工程,甚至直接的正则匹配更有效
我们把 Web 攻击分为行为型攻击和文本型攻击两类:
- 行为型攻击。每个请求看起来都是正常的,但将其连接成请求走势图时,就会发现问题,如爬虫、撞库、刷单、薅羊毛等。
以刷粉行为为例:每个请求看起来都是正常的,但攻击者可能动用大量 IP 在短时间内注册大量账号,并关注同一个用户。只有我们把这些行为连接起来一起分析时,才能发现问题。
- 文本型攻击。传统的漏洞类攻击,如 SQL 注入、命令注入、XSS 攻击等,单纯的把一个请求看成是一段文本,通过文本的特征即可识别其是否为攻击。
当特征的维度空间较低,且有些维度的区分度很高时,通过简单的线性分类器,就可以实现不错的准确率。
例如我们简单的制定一些 SQL 注入的正则规则,也可以适用于很多场景。但是,这样的传统思维却忽略了召回率问题,实际上也很少有人知道,通过 SQL 注入的正则规则,可以达到多少的召回率。
同时,在某些场景,假如业务的正常接口通过 JSON 传递 SQL 语句,那么这种基于正则规则的分类器就会产生极高的误判。
04传统安全人员并不了解机器学习
大量传统安全公司的安全人员精于构造各种漏洞探测、挖掘各种边界条件绕过,善于制定一个又一个的补丁策略,却并不擅长 AI 机器学习方面的内容,这也说明了这种跨界人才的稀缺和重要。
机器学习重新定义 Web 安全
如何解决安全领域的样本标注问题呢?机器学习分为两大类:
监督学习。要求有精准的标注样本。
无监督学习。无需标注样本,即可以针对特征空间进行聚类计算。在标注困难的安全领域,显然无监督学习是一把利器。
01无监督学习
无监督学习无需事先准备大量标注样本,通过特征聚类就可以将正常用户和异常用户区分开,从而避免大量样本标注的难题。
聚类的方式有很多,如距离聚类、密度聚类等,但其核心仍是计算两个特征向量的距离。
在 Web 安全领域,我们获得的数据往往是用户的 HTTP 流量或 HTTP 日志,在做距离计算时,可能会遇到如下问题。
例如:每个维度的计算粒度不一样,如两个用户的向量空间里 HTTP 200 返回码比例的距离是两个 float 值的计算,而 request length 的距离则是两个 int 值的计算,这就涉及粒度统一归一化的问题。
在这方面有很多技巧,比如可以使用 Mahalanobis 距离来代替传统的欧式距离,Mahalanobis 距离的本质是通过标准差来约束数值,当标准差大时,说明样本的随机性大,则降低数值的权值。
反之,当标准差小的时候,说明样本具有相当的规律性,则提高数值的权值。
无监督的聚类可以利用 EM 计算模型,可以把类别、簇数或者轮廓系数(Silhouette Coefficient)看成 EM 计算模型中的隐变量,然后不断迭代计算来逼近最佳结果。
最终我们会发现,正常用户和异常聚成不同的簇,之后就可以进行后续处理了。当然,这只是理想情况,更多情况下是正常行为与异常行为分别聚成了很多簇,甚至还有一些簇混杂着正常和异常行为,那么这时就还需要额外的技巧处理。
02学习无监督聚类的规律
无监督聚类的前提是基于用户的访问行为构建的向量空间,向量空间类似:
- [key1:value1,key2:value2,key3:value3...]
这里就涉及两个问题:“如何找到 key”以及“如何确定 value”。
找到合适 key 的本质是特征选择问题,如何从众多的特征维度中,选择最具有区分度和代表性的维度。
为什么不像某些 Deep Learning 一样,将所有特征一起计算?这主要是考虑到计算的复杂度。请注意:特征选择并不等同于特征降维,我们常用的 PCA 主成分和 SVD 分解只是特征降维,本质上 Deep Learning 的前几层某种意义上也是一种特征降维。
特征选择的方法可以根据实际情况进行。实验表明在有正反标注样本的情况下,随机森林是一个不错的选择。如果标注样本较少或本身样本有问题,也可以使用 Pearson 距离来挑选特征。
最终,用户的访问行为会变成一组特征,那特征的 value 如何确定?以最重要的特征——访问频率为例,多高的访问频率值得我们关注?这需要我们对于每个业务场景进行学习,才能确定这些 key 的 value。
学习的规律主要包括两大类:
- 行为规律。自动找出路径的关键点,根据状态转移概率矩阵,基于 PageRank 的 power method 计算原理,网站路径的状态转移矩阵的最大特征值就代表其关键路径(关键汇聚点和关键发散点),然后顺着关键点,就可以学习到用户的路径访问规律。
- 文本规律。对于 API,可以通过学习得出其输入输出规律,如输入参数数量、每个参数的类型(字符串 or 数字 or 邮箱地址等)、参数长度分布情况,任何一个维度都会被学习出其概率分布函数。
然后就可以根据该函数计算其在群体中的比例。即便是最不确定的随机分布,利用切比雪夫理论也可以告诉我们这些值异常。
假如 GET /login.php?username = 中的 username 参数,经过统计计算得出平均长度是 10,标准差是 2,如果有一个用户输入的 username 长度是 20,那么该用户的输入在整体里就属于占比小于 5% 群体的小众行为。
通过特征选择和行为、文本规律学习,我们就可以构建出一套完整且准确的特征空间将用户的访问向量化,进而进行无监督学习。
03让系统越来越聪明
如果一个系统没有人的参与,是无法变得越来越聪明的,如 AlphaGo 也需要在同人类高手对弈中不断强化自己。
在安全领域,虽然完全的样本标注不可能,但是我们可以利用半监督学习的原理,挑选具有代表性的行为交给专业的安全人员判断,经过评定校正,整个系统会越发聪明。
安全人员的校正可以与强化学习和集成学习结合实现,对于算法判断准确的情况,可以加大参数权重,反之则可以适当减少。
类似的想法出现于国际人工智能顶级会议 CVPR 2016 的最佳论文之一,“AI2: Training a big data machine to defend”,MIT 的 startup 团队,提出了基于半监督学习的 AI2 系统,可以在有限人工参与的情况下,让安全系统更安全更智能。
04重新定义 Web 安全
基于上述几点,我们基本可以勾勒出基于 AI 的 Web 安全的基本要素:
AI Web 安全技术栈
从上图可以看到,所有算法均包含在实时计算框架内。实时计算框架要求数据流的输入、计算、输出都是实时的,这样才可以保证在威胁事件发生时,系统可以迅速做出反应。
但是,实时计算的要求也增加了很多挑战和难点,一些传统离线模式下不是问题的问题,在实时计算下会突然变成难题。
比如最简单的中位数计算,要设计一套在实时流输入的情况下,同时还能保证准确性的中位数算法并不容易,T-digest 是一个不错的选择,可以限定在 O(K)的内存使用空间。还有一些算法可以实现在 O(1)内存占用的情况下计算相对准确的中位数。
综上所述,我们可以看出利用 AI 实现 Web 安全是一个必然的趋势,它可以颠覆传统基于 policy 配置模式的安全产品,实现准确全面的威胁识别。
但是,构造基于 AI 的安全产品本身也是一个复杂的工程,它涉及特征工程、算法设计和验证,以及稳定可靠的工程实现。
总之,基于 AI 的 Web 安全是新兴的技术领域,虽然目前还处于发展期,但最终一定会取代以 policy 为驱动的传统安全产品,成为保证企业 Web 安全的基石。
丛磊
白山云科技合伙人兼工程副总裁
2006 年至 2015 年就职于新浪,原 SAE(SinaAppEngine)创始人,曾任总负责人兼首席架构师。2010 年起,带领新浪云计算团队从事云相关领域的技术研发工作。他拥有 10 项发明专利,现任工信部可信云服务认证评委。2016 年加入白山云,主要负责云聚合产品的研发管理和云链产品体系构建等。