【编者的话】随着云平台的日渐流行,其面对的安全问题也越来越严重。近日,Xen Project的顾问委员会主席Lars Kurth分享了其对开源安全流程的理解和看法。作为该系列文章四部分的第一篇,本文介绍了Lars对于云安全背后的理论。
随着去年的Heartbleed以及最近的VENOM漏洞的出现,运行互联网服务和云系统的软件遇到了前所未有的威胁。很多人认为,如果要保证软件尽可能的安全,就需要减少程序暴露给攻击者的攻击机会。然而,现实情况远非如此。其关键在于IT团队真的需要判断攻击者是否知道一个可被利用的漏洞的概率。接下来,本文就通过介绍虚拟和云环境相关风险的本质,来详细阐述上面的观点。一旦有了这样的框架,文章再讨论如何把理论变为现实,从而分析现实问题。
风险的含义以及它和漏洞/利用的关系
当人们讨论一个系统是否安全时,非常容易跌进一个二元的陷阱:一个系统要么处于可以被攻破的非安全状态,要么处于完全无法被攻破的安全状态。接下来,为了便于理解,文章反过来先谈论风险的事情。在实际生活中,任何事情都可能存在风险。软件也面临着同样的情况。因此,一个安全的系统指的应该是该系统被攻破的风险相对较低;而一个非安全的系统则意味该系统被攻破的风险相对较高。无论是何种系统,(安全)风险肯定存在,只是不同系统对其容忍程度不同。那么,究竟风险的本质是什么呢?风险又从而而来呢?
在云计算和虚拟环境中,系统的输入和输出是系统恶意负载的主要来源。然而,系统的负载是多样的,而且与用户行为有关。我们不能假设所有的云用户都可以做正确的事情。因此,迁移风险需要依赖另外两项技术:划分(compartmentalization )和最小特权原则(Principle of least privilege)。
划分是将对虚拟机、进程、用户和数据等资源的访问区分开来,而且在发生问题时帮助隔离。而最小特权原则是将访问权限限制到能保证系统正常运作的最低水平。例如,一个服务器上的常规用户并不需要root访问权限,或者在某些时候不需要拥有安装软件的权利。
在云计算平台和数据中心中,虚拟机和容器就是划分的最基本形式。它们就是依赖Hypervisor或Linux来强制分离最基本权利的“可信域”。接下来,本文就尝试评估攻破虚拟层、访问其他虚拟机或其他容器中的数据或资源的风险。尽管“攻破”可能是最好的描述,它也可能引起误导——从字面上理解,好像需要暴力手段来攻破软件的防御策略。
在现实情况中,这类风险的来源就是漏洞(Vulnerability)。漏洞指的就是攻击者在一个可信域内能够利用的代码bug或者配置bug。攻击者在利用漏洞时所使用的代码或者技术就叫做利用(Exploit)。如果系统中存在漏洞,而攻击者又正好知道,他就可以进入系统。而如果系统中不存在漏洞或者攻击者不知道漏洞的存在,他就无法进入系统。因此,“攻破”需要的并不是力量,而是对于漏洞存在的感知和掌握。
评估漏洞以保护系统
如上所述,一个软件漏洞就是一个错误。它可以是代码中的错误(例如,软件行为与程序员预期不相同)或者配置中的错误(例如,软件配置错误导致其行为不符合预期)。当评估系统安全时,这两类错误都需要认真考虑。
以编号为CVE-2015-3456的VENOM漏洞为例。VENOM是一个存在于QEMU的虚拟软盘驱动器(FDC)代码中的安全漏洞。该代码存在于Xen、KVM以及Virtualbox等多个计算机虚拟化平台之中。VENOM漏洞可允许攻击者从受感染虚拟机中摆脱访客身份限制进行DoS攻击,并很有可能获取主机的代码执行权限。为了规避该漏洞,Xen工具栈自动配置QEMU,使得FDC被直接关闭;而KVM用户可以手动配置系统,从而不使用FDC。然而,即使是在这种情况下,QEMU还存在另外一个bug,使得QEMU中的FDC并没有实际关闭。
简而言之,管理员想要避免漏洞攻击就需要关闭一切可以被关闭且没被使用的选项。当然,这样的经验同样适用于软件:为了避免VENOM这样的漏洞,Xen工具栈需要关闭不被使用的大量QEMU设备。
IT团队可以从《行尸走肉》中学习到的东西
在当今复杂的软件环境中,安全漏洞已经成为生活的一个方面。IT部门需要时刻警惕攻击者进行漏洞的识别和发掘。在全世界任何行业的公司中,该风险都真实存在,并将一直存在。尽管《行尸走肉》中电视剧的场景与现实的技术世界相距甚远,它却能够给公司以强烈的震撼,令其采取行动加强系统防御。
正如电视所演,假设你和你的同事是目前所知的最后存活的人类。你们需要四处逃窜,在旧文明中残喘生存。一旦到一个地方,你们就一直待到该地方的资源使用完毕为止。
以下就是行尸的行动规则:
- 他们昼夜行动,通常会被声音所吸引。由此,小股行尸渐渐汇聚,最终形成一大波行尸群。
- 他们非常强壮,可以轻易破门或破窗而入。
- 然而,他们无法思考,不能识别门、窗户或者墙壁。只有一大波行尸聚集时,才能根据声音自动汇聚到门窗附近或者直接打破墙壁或围栏。
因此,残余的人类就需要保持安静,并确保每一个门、窗户或者任何开放的出入口处于关闭状态,而且防御的墙或围栏足够的坚固和高大。一旦留下任何一个破绽,并被行尸发现,那么故事就结束了。
尽管保卫人员早已知道保证门窗的安全并不是很难,但是人总是会累或者处于焦急状态。因此,即使付出全部的能力,也不可避免会出现一个门或窗忘记关闭。如果够幸运,行尸可能并没有发现。就如行尸一样,计算机的攻击者也在寻找任何可能攻入的“门”,而防御者很难顾及到所有的“门窗”。
小或者简单的门窗是很容易保卫的,而大的门窗就很难去保卫了,对于围栏也存在同样的道理。在给定时间内,修复五个小的窗户可能比修复一个大的窗户要简单很多,因而窗户(漏洞)越小越好。
多层保护,又叫“纵深防御”(defense-in-depth),是最好的防御手段。如果你可以保卫附近建筑或围栏的安全,并关闭房屋内的所有门窗,黑客就需要找到若干漏洞才能攻入系统。而且,如果在这段时间内,你还可以加强安全机制,或者添加新的门进行防御。这就是系统架构中“划分”的应用。
在下一篇文章中,Lars将进一步挖掘安全漏洞以及他们在Hypervisor和容器中的区别。读者可继续阅读《开源安全流程——第二部分:容器vs. Hypervisor——保护你的攻击面》。
编后语
《他山之石》是InfoQ中文站新推出的一个专栏,精选来自国内外技术社区和个人博客上的技术文章,让更多的读者朋友受益,本栏目转载的内容都经过原作者授权。文章推荐可以发送邮件到editors@cn.infoq.com。