陈海波:大家下午好!我是来自复旦大学的陈海波,我给大家介绍的是在云计算环境里面,如何用虚拟化保证数据的安全性。我们在非云时代,我们的数据是怎么样保护的?在非云时代,我们数据放在自己个人电脑里,在自己电脑上装很多防火墙,然后再加上一些密码锁,把数据可以保护起来。在云时代,我们又要逐步把个人数据放到云端里,放到云端里去以后,问题在于我们怎么样能够保护我们的数据。我们现在不能再像自己本地电脑一样,给每个数据加一把锁锁起来,这样的话就会给数据带来一些挑战。所以我们看到在云时代,数据隐私性是非常重要的特性,因为我们不能把数据放到云端以后,云的提供者或者云的租客把我的数据偷走,再对它非法的使用。
在这样一个云里面,对于在线的数据存在哪些威胁?
第一个威胁,从云里本身来的。主要有一些问题,我们可以相信一个云的提供商,但是由于现在一些技术和法律手段局限性,我们很难有有效的手段保证我们不会使得其中的某个云的操作者能够获取我们这样一些隐私数据。在目前这样的环境里,大部分情况下,如果一个云的操作者拥有对你存放数据的计算机有控制权,他就可以把你的数据窃取,然后进行非法使用。第二个,从网络来的,我们以前把数据放在个人电脑里,跟其他人的数据完全隔离。在云里面以后,也许你的数据就在我的数据旁边,可以通过各种各样的方式来窃取你的数据。
举例:我现在自己在云上面部署这样的服务,现在需要把我的个人信息放进去,大家都知道现在在人口普查,我要调查一下到底中国有多少有钱人,然后他们对应的婚姻状态是什么样的。对应这样一个云,正确的服务应该是如果把我的数据提供到云上面以后,他肯定觉得我不是一个有钱人,回答人口普查的结果是我不是有钱人。而且人口普查的过程不应该把我的个人隐私数据放到网上去。很不幸的是,现在认为很大威胁对于云里面提供者对客户数据的非法访问,他可以通过各种手段,把云平台窃取,窃取一些隐私数据,同时他可以修改反馈数据。对我来讲,我不是一个有钱人,但是它会干扰调查的结果。另外来自于你的邻居甚至网络的攻击,这种攻击通过在云的平台里面装入恶意代码,同样也可以窃取信息,同时篡改云的结果。
云对于数据安全性带来了一些新的挑战,包括云提供者、操作员之间可能造成的一些侵入。另外你的邻居很有可能是你的竞争对手,甚至来自网络的攻击,都可能会导致你的数据会被窃取。
我们讲安全,基本上都有一个威胁的模型,我们首先假设这样的一个攻击者到底能做什么。假设攻击者能够去看云存储磁盘里面的文件,他可以修改这些文件。我们知道一个操作者很容易查看磁盘里面的内容,对磁盘文件内容进行修改,甚至他把磁盘移走。同样数据的生命周期有多种多样的,一种形式,我仅仅存在磁盘上面,这种方式非常简单,在这种方式下面只需要把它加密好,放在磁盘上面,攻击者哪怕把你的硬盘拿走,也不会发生例如"艳照门"这样的事件。但是很不幸的是,我们数据需要用来处理的,处理的时候就不可避免要加载到内存里面,然后才能被处理。所以攻击者还能做到的一点是能够检查并且修改内存里面的内容,比如我们在虚拟机的环境下,你如果是一个控制虚拟机管理软件的人,可以把虚拟机里的值读出来,把内存修改,甚至通过一些外设访问方式把内存存到某一个秘密的位置。
数据要进行处理,处理的话就离不开CPU,在CPU里面也会存在很多这种状态,因为再处理计算的时候,相当于你的数据就在机器里面留了一个脚印,这些脚印也会泄露一些隐私信息。比如我们上网银的时候,在某个时间内,你的网银密码存在CPU计算器里面的,这也是攻击者可以做到的一点。
还有中间人的攻击,在云的用户和云的提供者之间,很有可能把你的网络信道劫持,劫持以后可以伪装成我是可信员,请把你的数据放到我这儿来。
另外还有一种很强大的攻击,就是拒绝服务。拒绝服务,就可以提供一些错误的服务,本来你要做的事情是把这个数据存到这个磁盘上面,结果他说他把这个数据丢了。这种情况可能会出现bug暂停的一些错误,作为执行者可以执行任意行为。
攻击者不能做什么?我们认为云的提供者本意是善意的,因为他的主要目的是提供一个云,来窃取你的数据,主要目的是赚钱,我给你提供服务,你付费给我。他的目的是希望提供可信的服务。所以在这种环境下,大部分机房里面都有很多摄象头了,所以你不可能跑到机房里把机箱打开,在CPU上插一根线,在操作过程当中把所有数据记录下来。这是可以通过摄象头来防止的。
另外,我们假设它不能把TPM(可信平台模块)认证在这样机器上面运行的软件,是不能够破坏的,也不能把TPM里面的P给获取。同时我们假设密码学的算法是安全的,我们现在不认为比较容易把RSA、AES等密码给破解。
对于数据在云里面在线数据的威胁,现在很多时候操作员、攻击者可以做到哪些事情?介绍系统之前我们首先要知道一点,我们要做一些假设,首先没有绝对的安全,我们只能有相对的安全,相对的安全就是我们假设谁是可信的,谁是不可信的,我们讲硬件的信任根是什么。
现在很多机器上面有很多可信平台模块,可信平台模块所做到的事情,其实是主板上面加了一个协处理器,能够对这个平台上面一些运行的软件进行度量,然后用户通常很难把这样一个TPM暴力的拆掉,拆掉以后,计算机也不能用了。TPM在PC机的设计里面设计成信任根。
TPM能提供什么样的功能?TPM主要提供第一点是它有一些私钥,有了这个私钥就可以做一些认证,这样的私钥不会离开,只是用来做签名用的。还有一个hash,把你要加载的软件进行hash,会得到唯一的一个数据,这样一个数据,可以用来跟以往数据判断,如果是匹配的,就是你所装载的是你所期望的软件。
平台配制的计算器,主要用来存储这些hash值,有很多,因为我们在度量的时候,不仅仅度量OS,也许我们度量应用,还有度量hypervisor之类的。
还有随机数的序列,如果伪造的话,可能导致密码被破解。所以在有TPM环境下,在传统方式下面,理想的信任链模型是什么样?我们首先度量bios,然后把操作系统的加载器进行度量,度量好了以后,会度量hypervisor,就是我们VM可以被度量。度量好hypervisor以后,再度量操作系统,最终度量应用,这是一个非常完美的故事,这样我们就可以精确的知道,运行的时候这些都是已知的,都可能是可以被信任的。
我们如何做这样一件事情?我们首先要做这样一个Attestation,防止中间有一个人在里面伪装我是一个可信员,请把数据交给我。它所做的事情就是跟云的服务器做一个认证,跟警察盘查路人一样,说你是谁,你身份证号码是什么,如果认证的话,你不是一个坏蛋。云的用户会发一个问题给云的服务器,服务器通过TPM会返回hash值,hash值就表示在这个云平台里面运行的硬件、软件确实是用户所期望的,经过这样以后,我们就可以进行度量。hash值是独一能够反映当前软件的状态。
我们既然讲到软件的信任链,在这样信任链模式下有哪些问题,我们还需要做什么?在这样一个信任链模式下来,中间确实存在这样一个(gap),因为我们中间度量链里面有一个非常庞大的东西。OS是一个非常复杂的软件,windows有几千行代码,在这样复杂的软件里面,没有人能够说这样一个操作系统是可信的,这个操作系统是没有病毒的,没有间谍软件的。基本上只要是一台联网的机器,没有人可以确定的说我的机器里面没有漏洞、后门或者间谍软件,所以在一个度量的连里面,我们只能保证操作系统在加载的时候是可信的,但是一旦你上线以后,不停跟云的用户打交道,里面有好人也有坏人,也许坏人把这个操作系统里面加了木马、病毒以后,你在启动的时候是怎么样,并不代表这个操作系统以后会是可信的。
基于这样一个假设,有一个Goal的体系结构,我们还是认为数据是云的核心,我们要保护只是云中间的数据,尤其是数据隐私性不会被破坏。现在有很多用户对云迟疑态度,我放进去的数据到底能不能保护云的隐私性。
第二个作用,就是这样的软件是不是可能会被破坏掉?主要有两个目的,第一个目的,也许这个软件有版权的,认为这个软件非常重要,放在云上面以后,你会担心把这个软件放上去以后,会不会你的竞争对手把你的软件拿过去用。第二的目的,会不会有人把你的软件篡改以后再进行服务。我们系统主要达到这两个目标。
基于这样的目标,我们提出一个体系结构。我们假设这个操作系统本身是不可信的,我们假设这样一个操作系统里面可能会被装了间谍软件、装了木马,甚至有人可以完全控制操作系统这个行为。尽管假设hypervisor是一个可信的软件,为什么我们相信VMM,而不相信OS。首先我们从实现复杂度来看,VMM通常几万行,几十万行代码,但是操作系统是几千万行代码,数量级完全不一样。第二,VMM里面通常是一个静态的,现在很少有VMM说你可以在启动以后,在里面插入一个模块,但是现在操作系统就不一样,现在把这样一个操作系统里面插入一个新的硬件,它也许就装入一个新的模块,它有比较强大的接口,病毒也可以插入一个模块,让你的操作代码就变成恶意的了。VMM当中,这个代码数据是静态的,你度量它以后,接下来执行的时候,起来原来启动那样的情况。VMM相对来讲没有直接跟用户交互,只是提供服务整合,迁移,以及我们包含的安全的服务,所以它是比较难被攻克的。
在我们这样一个操作系统里面可以运行各种各样的服务,一种是可以运行可信的云服务,这种是我们需要保护的。比如我们可以在里面运行人口普查软件,我们把数据提交上去,它会给你一个结果,而且同时不会把数据的隐私性破坏掉。同时还可以运行其他的服务,这些服务也许是恶意的,也许是善意的。
尽管操作系统是非可信,我们在虚拟机监控系统里面加了行为约束层,如果把这样一个软件的行为或者一个人的行为约束好以后,他就不太容易做坏事。在我们这里,行为约束层所做的事情就是防止非可信的操作系统把这样一个服务篡改掉。
TPM要去度量bios,VMM,度量到VMM里面就结束了,不度量上面的OS。在我们这样一个保护里,应用是由用户提交上去的,用户提交的应用可能包含一些软件,一些二进制文件,一些他要操作的数据文件。我们为了保证中间人这种攻击,或者把这个数据从我的机器放到云的过程中间被篡改,我们让用户的数据和代码进行加密,他用的加密方式是TPM提供签名过的密钥,这种签名过的密钥只有TPM才能够把这样一个代码或者数据解密。尽管有人在中间说我是一个可信员,你把数据交给我,他拿到以后也是没有用的。
启动方式,度量到hypervisor,也是VMM。我们没有度量操作系统或者应用,因为我们没有办法给一个一直变化的坏蛋发一个三好学生的证书,说你是一个三好学生。尽管这样的话,你不能根据他在某一个时间点表现成为一个好人,就认为他是一个好人,所以我们就不在这里度量OS,也不度量Attestation。
hypervisor可以通过我们提供的接口,可以和远端一些用户进行通信,可以让用户能够知道这样一个机器里面确实运行了我们提供的hypervisor,然后你的数据放在我的hypervisor上面处理是安全的。还提供安全通信信道,主要为了做远程验证所需要的.
如何保护云的应用
介绍一下如何保护云的应用。静下来看到一个一个数据文件,但是在电脑里面运行的时候,通常会体现成三个状态,第一个是CPU中间的状态,因为在执行的时候必须要到处理器里面去执行,处理器执行的时候会留下脚印。第二个要执行的时候,CPU,特别是要把这些数据和代码放到内存里面,还有I/O,因为算好以后会放到磁盘里面去,所以我们要保护的是操作系统不能够通过CPU、内存和这样一个文件来修改我们的服务。
我们如何保护内存里面的数据?如果把这个数据进行计算的时候,我们首先把这个数据进行解密。因为我们前面提到用户提交数据的时候,提交的是一个加密过的数据和代码,他要执行的话不能直接执行密文,必须进行解密。如果解密了以后,不对它进行保护,这样操作系统就高兴了,说你已经变成明文,就可以把你的数据给窃取。hypervisor保证的一点是这样的内存是不能被操作系统所看到的,为什么hypervisor能做到这一点?因为hypervisor实现的是计算机系统里面软件的老大,它能说你不能做这个事情,不能做那个事情,可以做到这一点。
如果操作系统要攻击的话会通过什么方式?第一种是MMU翻译,只有通过这个翻译才能对内存进行访问,我们只要防住对MMU的攻击,就可以保证这个操作系统不能够通过这种地址翻译的方式来攻击它。第二种是I/O MMU,是把内存和外设进行沟通的渠道。为什么要防住I/O MMU呢?因为很可能里面装一个恶意的设备,或者发了一个恶意的指令,说你应该把这个内存里面的明文直接存到磁盘上面去,这样就能够把明文窃取。
如何防住MMU的攻击?我们要理解操作系统如何管理内存。我们知道每一个操作系统对应每一个进程都有页表,每个页表里面有地址空间,地址空间里面分用户的和kernel的,在kernel里面,操作系统获取处理器控制权的时候,不能让他看到用户的应用,就没有办法直接访问应用的内存。当从用户模式切换到核心模式的时候,就把用户的映射全部清掉,就不能直接访问那块内存。
另外通过一个恶意的应用从另外一个地址映射它,我们要知道每个内存业怎么映射的。hypervisor必须要做到能够跟踪每一个内存页,当它在映射的时候,检查一下它是不是一个被保护的应用内存,如果是的话,它只能被这个被保存的内存所映射。它发现的时候,如果内存要映射它的话,就会把这样的请求去除掉。
I/O MMU,虚拟机管理 I/O MMU表,用户提供被保护的应用上来的时候,hypervisor就把用户所有的内存,因为用户所有内存里面包含隐私的数据,把它制成设备不可访问,这样设备就没有办法通过 I/O MMU的方式来窃取用户的数据。因为我们严格意义上隔离来讲会带来一些问题,操作系统和用户进程之间会有一些交互,比如用户掉到内核里面的时候会做这样一些工作,另外要传递一些数据,比如通过操作系统读一些数据的时候,就需要先把这个数据读到内核里面。我们在hypervisor里面维护这两个Buffer。如果这是kernel和用户的交互可以通过Buffer传递,用户给内核的数据是经过我们认证的。
I/O是如何做的?我们用的一个方式是加密的,我们系统保证只要这个用户应用的隐私数据从内存到磁盘里,被我们hypervisor加密的,尽管操作系统能看到磁盘里的文件,也只能拿到密文,没有办法把这个数据进行解密。我们从内存到I/O这条通道里面,把它进行了加密。
在我们这样一个系统里,二进制文件如何做?首先我们对于每一个文件进行加密,然后用TPM的钥匙把AES进行加密,不仅仅包含被加密文件,而且包含这个密钥,就保证只有TPM的机器才能把这样的数据给解开。数据文件也是类似。如果读一个文件的时候,如果用户从存储里面读一张银行报表的时候,首先kernel帮你进行磁盘操作,读的是密文,hypervisor就会把这个数据放到Buffer里面,hypervisor就进行解密,解密以后,就可以把这个数据发给用户。在这个过程里,加密和解密对于用户是透明的,用户不知道我还要对这个数据进行加密,其实我们透明的对他提供了这样的保护个。对于CPU来讲,可以自然的保护它。CPU是分时的,从一个进程切换到另外一个进程,可以进行加载。hypervisor就可以说把你之前被可信的应用,会被保护的应用,踩过的脚印擦掉,把它丢给其他的进程进行运行。
这样一个系统到底有没有效果?我们做了一些测试。首先要防止攻击,运行一个Apache web server,攻击者能把Linux内核控制住,把内存验证的代码直接映射到内存里面,再把代码改掉。它在内存里面,加密的模块在内存里面,就是0101一些二进制数字。它所做的事情非常简单,你登陆这个网站,你的密钥是不是对,对的话,你可以做,不对的话就不能做。我们控制了OS以后,很难去攻击它。也可以看到直接把这个代码改掉,直接不要判断了,直接pass掉就可以了。有了这样一个保护以后,因为这道内存被我们道里认为是被保护应用私有的内存,操作系统看不到它,即使想映射它也没有办法被映射,所以就可以防住攻击。
有些时候我们看一些编辑器,比如看银行报表,有些咨询公司提供的数据,这些数据是非常贵的,没有攻击的时候,我们用编辑器就能看到这些东西。如果我们做了这样一个攻击软件,没有的话就不能做这样一件事情。
我们在这里讲的两个攻击非常简单,实际上我们道里这样一个平台也是在使用,在清华大学里有一个云存储平台里,有几千的用户,为清华提供云存储的服务。原来碰到一个问题,我们把数据放进去的时候,我们就不确定它会不会把我的数据偷掉,我们知道之前高校发生很多问题,招生名单都泄露出去,导致很多人不敢把数据放上去。用道里系统保护他们云存储平台,而且在清华里面测试了很久,很多人来攻击,目前还没有被攻破。
我们需要注意我们提供这样的保护,并不限制我们虚拟机的移动性,我们还是可以进行虚拟机的迁移。
性能方面我们进行比较,因为安全不是免费的,一定会带来性能损失,看看这个性能损失到底有多大。从我们一些应用来看,做了好几个应用,比如FTV服务器,(HTVB)的网络服务器,以及一些计算密集的任务,发现性能开销大部分情况是小于10%,对于一些非常安全敏感的应用也是比较合适的。
我们之前也做一些相关工作,在工作的时候需要相信OS,需要使用一些相关硬件,我们解决方案是基于软件的方案,我们不需要特殊的硬件,只需要你有TPM。在云里面,用户数据的威胁比在终端上面的威胁越来越多,因为它不仅仅是存在于传统的网络攻击,还存在这种攻击,是来自于你的邻居,你的邻居也可能是你的竞争对手,也可能来自提供商,也有可能你是一个创业者,把数据放上去以后,云提供者也是创业者,他把你的数据偷走,自己开另外一家公司,这是很多的威胁。
对于这样的威胁,我们提出这样一个系统,这个系统基于TPM完整性度量,使用VMM对于用户的隐私数据和他的代码进行保护,通过内存的隔离, I/O MMU的隔离,还有透明的I/O加密的方式来做到这一点。
提问环节
提问:报告里面有128位的密钥,就是存储到磁盘上面的,密钥放在哪?
陈海波:密钥在文件的末尾。
刚开始加密的密钥是用TPM的钥匙加密吗,但是刚开始原始密钥,它存放是随机的,还是用户指定的,还是系统给的?就是密钥怎么生成的?
陈海波:首先有一个Remto Attestation,生成一个随机的密钥,用户用来对他的代码和数据进行加密。
提问:这是系统生成的,所以用户不知道。
陈海波:用户不知道。
提问:用户上传数据是加密的,这个密钥是怎么回事?这两个是同一个密钥吗?
陈海波:我们通过Attestation,生成128位密钥,这个密钥两方面都会存一份。用户用AES密钥对它的数据和代码进行加密,同时用它的公钥放到末尾。把它的文件放到云平台上的时候,TPM就能够知道这个东西是我的,因为它能够把这个东西解密,避免中间人的攻击。传输密钥,首先要建立安全的信道。
提问:你的这个平台提到云概念,我不知道测试数据的时候数据量有多大,为什么叫云,就是因为数据量很大,你的测试有没有考虑过如果数据量很大的时候,反复加密、解密,有可能让这个系统变得非常慢,而且TPM是硬件+解密比软件+解密更慢,所以可能性能上不见得就是一个好事。
陈海波:这个问题非常好。首先您提到TPM加密解密非常慢,确实是这样的,我们没有TPM去做key,或者常见数据的加密,数据加密是由CPU来做的,这实际上在hypervisor里面进行运行的。现在CPU非常快,我们发现加解密带来的性能并不是那么大。
云里面数据量非常大,谷歌Map都是用几千台机器算一个任务,我们只是每台机器上有10%的开销,并不会因为这样一个机器数量的增加而增加,100台机器还是10%,因为它的开销是每一台机器,而不是把所有的任务都丢到一个机器上面来。所以它一定是非常多的机器来跑应用。