池亚平 莫崇维 王志强 梁家铭 薛德凡
1(北京电子科技学院网络空间安全系 北京 100070)
2(西安电子科技大学通信工程学院 西安 710071)
(chiyp_besti@163.com)
云计算被认为是继大型计算机、个人计算机、互联网之后的第4次IT革命,云计算技术为大数据、物联网、工业物联网、人工智能等众多新技术、新应用提供了弹性可扩展的计算能力[1].云存储是广泛应用的云计算服务之一,云存储中的数据安全问题得到广泛关注.云环境下通常有3种不同的云服务模式:软件即服务(software as a service, SaaS)、平台即服务(platform as a service, PaaS)和基础设施即服务(infrastructure as a Service, IaaS),相比较于传统的IT环境,云密钥管理服务模式将变得更为复杂.
当云存储对文件进行加密和完整性保护服务时,通过海量密钥的支持才能够有效保证上述文件的机密性和完整性.当加密文件的大小达到PB级时,由于目前广泛采用块存储方式,因此会产生海量加密密钥,需要大量空间存储加密密钥[2].
云计算环境下的用户身份和数据来源的不同,使得云计算环境中的密钥包含各种不同的种类,如用户身份密钥、授权密钥,数据加密密钥等.同时,云存储需要满足用户动态性的要求,当用户权限变更时,需要及时更新授权用户的密钥,以防出现数据非法访问,因此如何保证在云环境下安全的动态更新密钥是亟待解决的问题[3].
美国国家标准与技术研究所分析了IaaS,PaaS,SaaS云服务场景下密钥管理存在的风险,并给出了框架性建议[4].随着云计算密钥存储技术的不断研究与发展,在早期单层派生方法(single-layer derivation equation, SDE)思想的基础上,产生了一系列云密钥存储方面的优化与改进方法[5].
密钥派生方法采用密钥派生树结构,如图1所示.密钥派生树中的节点由密钥映射而来,因此,生成的派生树能够实现在单个节点密钥上汇聚多个密钥信息,密钥存储管理成本也随之大幅度降低.
图1 密钥派生树结构
SDE密钥派生的基本思想是先将资源访问权限作为对用户进行分类的依据,权限相同的用户分为一类,每一类都生成对应的密钥派生树,树的节点对应分类后的1个组;而按类对用户划分之后会生成多个密钥派生树,用户的密钥集合会映射到派生树上;最后通过求解最小密钥派生树,减少海量密钥的存储数量[6].
SDE方法也并不完美.一是它仅仅在只有1个授权者的情况下减少了需要存储的密钥数量,当存在海量的授权者时,用户自己仍然要存储和管理海量的密钥;二是当应用场景的权限策略在不断地变化时,该方案也不适用.双层派生方法(double-layer derivation equation, DDE)是在 SDE 密钥派生基础上改进得到的[7].DDE有双层加密机制,运用对称加密密钥和密钥派生的公钥标签实现,结果是使得权限控制更新的效益得到进一步的优化.双层加密的具体描述如下:第1层为基本加密层(base encryption layer, BEL),资源数据在数据拥有者一方,在资源数据发送至服务器前,BEL将根据原始加密策略对资源数据进行加密;第2层为表面加密层(surface encryption layer, SEL),当资源数据发送至服务器后,服务器运用SEL动态变化的权限策略进行加密运算,对象是BEL加密后发送过来的资源数据.存在海量的授权者时,用户仍然需要存储和管理海量的密钥,该问题在DDE方案中同样存在.
文献[8]提出了一种启发式的密钥管理方案,使得系统维护和分发给用户的用于访问控制的密钥数量最小化,通过使用最小生成树(minimum spanning tree, MST)优化密钥结构,目的是降低用户认证的代价.为此,它获得2个节点的公共用户,并添加1个新的父节点来管理公共用户,该方案能以最小权值生成用户树.文献[9]提出了一种以构造状态密钥树进行群组密钥分发的协议,该方案给出了状态密钥树的构造方法,最终使得协议的存储成本显著降低,文献[10]也采用密钥派生的方法,提出了一种用于云环境中轻量级密钥管理的方案,通过设置桥密钥,每个用户能派生出已授权所有资源的加密密钥,文献[11]提出使用密钥哈希树加密达到250量级的大文件,文件每个区域的解密都需要不同的密钥,从而使得访问控制粒度更细,安全性得到进一步提升.同样基于密钥状态哈希树,文献[12]提出了一种密钥存储管理方案,该方案的密钥运算是结合根密钥和密钥派生树共同完成的.通过使用密码盒中存储的根密钥,运用密钥派生树方法派生出文件加密密钥,该密钥生成计算操作简单、快捷、低成本,而且存储代价也大幅度减少.
密钥派生思想非常经典,基于该思想的上述方案在密钥存储开销方面作了一定程度的优化.但随着云计算应用规模的不断扩大,密钥存储空间需求增大,密钥树的深度也在急剧增加,上述方案的存储管理开销将大大增加.因此,本文提出了一种基于密钥矩阵派生的密钥存储管理方案.该方案采用密钥派生树结构,将密钥划分为根密钥和数据加密密钥.根密钥由用户特定且唯一的属性生成,然后再用根密钥派生得到可供用户日常使用的数据加密密钥.与文献[11-12]方案相比,根密钥将直接派生到密钥派生树的最底层节点密钥,减少了非叶子节点密钥的计算和存储开销.
文献[13]设计了一种基于逻辑密钥图的安全组通信方案.逻辑密钥图是有方向但不构成环路的图,称为G,图G中k表示密钥,u表示用户.连接节点u的边只出不入,传出边数大于等于1条;一般来说,连接k的边有入有出,如果ki只入不出,那么该节点ki称之为根(图G中根的数量可以大于1个).安全组(U,K,R)是在给定的G中指定的,具体如下:
1) 在密钥图中,U和节点u的集合是1对1的关系.同样地,K和节点k的集合也存在1对1的关系.
2) (u,k)∈R,若从u到k存在有向边组合而成的路径,那么该路径对应节点u到k肯定是唯一的.
例如,图2中的G定义了以下(U,K,R):
K={k1,k2,k3,k4,k12,k234,k1234},
U={u1,u2,u3,u4},
R={(u1,k1),(u1,k12),(u1,k1234),(u2,k2),(u2,k12),(u2,k234),(u2,k1234),(u3,k3),(u3,k234),(u3,k1234),(u4,k4),(u4,k234),(u4,k1234)}.
函数userset()和keyset()与每个安全组(U,K,R)相关联,函数的设定描述如下:
userset(k)={u|(u,k)∈R},keyset(u)={k|(u,k)∈R}.
userset(k)表示在集合K中用户u所掌握的密钥,keyset(u)表示在集合U中用户u所掌握的密钥.例如在图2所示的G中,有userset(k234)={u2,u3,u4}和keyset(u4)={k4,k234,k1234}.
图2 密钥图示例
例如该方案进行用户权限的变更.假设用户u9权限失效,密钥k1~9和k789必须重新更换.如图3所示,由服务端将更新后的密钥k1~8传输给用户u1至u6,把k1~8和k78传输给用户u7,u8.而之所以必须重新发送新的组密钥给有权限的用户,是因为用户各自都必须掌握自己的有效路径上的组密钥和私钥之后,才能保证安全通信畅顺.
图3 密钥更新示例
文献[14]受到平衡树思想的启发,提出一种基于二叉树哈希的密钥更新方案.该方案所用的基本更新方法有2种:一种是从叶节点沿着会话路径到根节点进行更新;另一种是从根节点沿着会话路径至叶节点进行更新.不管用户是授权加入或离开,都需要把其叶子节点至根节点经过路径上的所有密钥节点进行更新,以达到有效通信或阻断通信的目的.
图4 密钥分配方案
层次结构均被上述密钥更新方案设计所采纳,但是当层数变多,或者应对云环境下的海量用户时,密钥更新的计算量和通信量是巨大的,因为只要其中1个用户的密钥需要更新,服务端就需要将路径上的叶节点、根节点、中间节点上的密钥逐一地进行更换,并重新传输给用户.
针对层次结构中权限频繁变更带来的开销增多问题,本文提出一种基于中国剩余定理(Chinese remainder theorem, CRT)的密钥更新方案.针对云环境中庞大数量的用户,在对用户权限进行更新时,首先进行分类,同类用户都具有相同的访问权限,以提升密钥树的空间利用率,然后将同类用户代入新的CRT方程组,失去权限的用户将被新的Xr和秘密值Cr剔除.同类子用户用同一组CRT方程,而不是所有用户,只有同类子用户共享Xr,因此,其他用户不会受到非同类子用户的影响,最终达到降低密钥更新时所用计算量和通信量的目的.
按照文件自身大小进行分块加密存储,各个数据块对应不同的密钥,并建立安全索引是对数据加密的经典方案.文件的分块加密需要密钥管理系统分配加密密钥,其通过安全索引加密相应的文件数据块,然后再传输至公有云中存储.当文件数据块很多时,密钥管理系统需要分配的加密密钥数量增大,数据库存储未使用的密钥所需空间变大,这将增加数据库密钥的存储负担.为此,本文方案利用密钥派生的原理,按需求量及时计算,动态分配所需的密钥.
同时,目前密钥派生方案都出现了深度增加带来的开销增大问题,基于矩阵形式派生密钥树深度仅为2层,将根密钥直接派生得到密钥树最底层的叶子节点,当用户需要海量密钥时,明显降低计算成本.另外,存储管理密钥树的派生配置矩阵和根密钥也达到了降低密钥存储开销的目的.
本文提出的密钥存储方案可以应用于典型私有云环境中,如图4所示.应用场景主要由租户、私有云和公有云组成.私有云主要由控制节点、内部交换机和计算节点组成.密钥分发服务器(key distribution server, KDS)运行在私有云的控制节点上,客户端运行于私有云的计算节点.数据的加解密在客户端完成,加密后的数据存储于公有云中.
用户加密数据文件并上传需执行以下工作步骤:
1) 用户A与密钥分发服务器KDS分别公开各自的公钥KUKDS和KUA并保存好自己的私钥;密码盒的配置由用户选择根密钥Kr、密钥派生矩阵的行列(MN)数以及访问权限列表来进行设定,然后把未加密文件与明文密码盒传输至客户端.
2) 客户端把接收到的明文密码盒和密钥请求传输到KDS.
3) KDS通过密码盒配置生成密钥并传输到客户端.
4) 客户端用KDS传输来的密钥对文件数据进行加密,并使用KUKDS和公钥KUA对密码盒进行非对称加密,然后将加密后的加密文件数据和密码盒传输并存储至公有云.
用户下载加密文件并解密需要执行以下的工作步骤:
1) 客户端首先下载加密后的文件,再向KDS申请返回解密密钥;
2) KDS向公有云申请返回对应文件数据的密码盒,并用私钥解开密码盒;
3) 客户端的访问权限是基于密码盒中的访问权限列表来判断,有访问权限则允许访问,通过权限后,客户端才能接收到由根密钥Kr和派生矩阵派生出的密钥;
4) 客户端收到密钥后解密密文,再把明文返回给用户.
采用密钥矩阵的密钥派生结构是本文方案的关键设计,如图5所示.加密密钥以矩阵的形式派生,根密钥Kr直接计算派生出叶子节点的密钥值作为密钥矩阵中的密钥值.密钥矩阵中第x行第y列的密钥值计算公式为
K(x,y)=H(Kr,x‖y),
(1)
其中根密钥为Kr,H()代表SHA-256的摘要算法,‖表示串联的运算符号,使用x‖y能够保证不同数据块对应的加密密钥不同.例如,图5中K3,7由Kr计算,即K(3,7)=H(Kr,3‖7),以此类推,Kr能够计算得到所有的分块密钥.密钥需要存储矩阵结构,即存储行数和列数,其形式为
(2)
图5 密钥矩阵派生示意图
根据密码盒的配置,使用派生矩阵的M,N和根密钥Kr进行密钥派生,每个派生密钥都以相同形式直接加密对应的数据块.每个客户端计算节点派生出不同的加密密钥为文件加密,派生密钥过程由该节点执行,其依据文件数据的大小与块数,设置合适的密钥派生起始参数,派生一定范围的加密密钥.
本文所设计的根密钥使用文献[15]所提到的密码盒进行存储保护,密码盒使用非对称密钥加密或者对称密钥加密,以实现根密钥的保密与文件数据的完整;通常在速度(对称)与灵活性(公钥)之间进行权衡,以保证安全性及使用的高效性.根密钥是用KDS和用户公钥加密后存储在公有云中,私有云则负责加解密的过程.加密密钥封装成KMIP消息格式后在安全传输层中进行扩展,即利用扩展后的TLS_KMIP协议在公有云和私有云之间实现端对端的密钥传输.若在安全传输层上传送KMIP消息,则需要扩展TLS协议,重新定义结构及消息格式,如图6所示.
KMIP协议的请求和响应数据包中基本元素有4种,分别为标签(Tag)、类型(Type)、消息大小(Len)、值(Value).利用协议基本元素构造数据包中的操作和属性,例如“Get”和“Unique Identifier”,如图7所示.
图6 TLS_KMIP协议结构及消息格式
图7 KMIP消息示例
C/S 2端实现KMIP协议过程如图8所示.例如,客户端向服务端发出申请,请求一个128 b的AES对称密钥.2端在安全传输层建立连接后,申请数据包会被封装成KMIP容器,并填充操作和属性.编码器将KMIP容器信息编码为TTLV(tag-type-length-value)信息,而解码器则执行相反操作.信息到达服务端后,服务器会将信息翻译成密钥管理系统可理解的互操作消息格式.
图8 KMIP消息交换过程
密钥的交换包括数据加密上传和数据下载解密2个部分.KMIP的符号对照表如表1所示:
表1 密钥交换符号表
KMIP协议流程如图9所示,加密并上传文件过程如下:
① 用户新建明文密码盒〈Kr,MN,P0,P1,…〉以对f进行安全配置.
图9 密钥交换协议流程
② KDS接收从客户端发来的获得文件加密密钥请求和明文密码盒;KDS使用客户端公钥和KDS公钥对根密钥进行加密后,存储至密码盒中,再把加密密码盒传输至公有云上存储;加密后密码盒:〈EKUKDS(Kr),EKUA(Kr),MN,P0,P1,…〉.
③ 客户端接收KDS发来的加密密钥Kf,xi,yj并对文件进行加密,然后传输加密文件至公有云进行存储.
客户端申请解密存储在公有云上的加密文件,过程如下:
④ KDS从公有云上获得加密密码盒〈EKUKDS(Kr),EKUA(Kr),MN,P0,P1,…〉.
⑤ 当用户出现在KDS存储的权限列表后,客户端被允许使用私钥解密根密钥;使用密钥矩阵配置MN与解密得到的根密钥Kr共同计算得到文件数据加密密钥Kf,xi,yj.
⑥ 用户使用KDS发来的密钥Kf,xi,yj解密从公有云下载的加密文件.
图9中实线箭头表示利用TLS_KMIP协议进行交互.
云租户具有动态性,同时密钥的使用期限也有限制,定期或动态地更新密钥是实现密钥管理安全的重要一环.云服务器接收到加密的用户数据时,根据用户对资源的访问权限生成控制权限表.用户访问资源的权限会随着用户的授权密钥发生改变.在云环境中用户可以获得海量资源,解密资源需要对应的密钥,因此用户密钥更新的消耗也很大,但不同云用户对云资源可能具有相同的访问权限.为降低更新密钥的消耗,该方案将用户与资源进行归类,其中统一子类的用户具有相同的密钥,设计一个基于CRT的密钥更新方案,用以提高密钥更新效率,降低更新密钥带来的资源耗费.
1) 用户访问控制资源集.
云密钥管理系统提供生成用户访问矩阵,用于表示用户与资源之间的访问权限.资源集是指在用户访问矩阵中有相同访问权限的单元,而资源集树由不同用户对应的资源集生成,用对该资源集有访问权限的用户列表作为树的叶子节点,再使用MST方法最小化树中边的权重.数据所有者向用户分配身份验证密钥以用户类为密钥分配单位,并结合最小加权资源树中的最小加权Rst原则.根据逻辑图的原理,用户与对应的资源集连接.
2) 基于CRT的密钥更新方案.
定义1.i个素数(t1,t2,…,ti),秘密值为Dr,E()为加密函数,Xr为同余未知数.该方案加密授权用户的对应认证密钥(a1,a2,…,ai)得到i个随机数(Ea1(Dr),Ea2(Dr),…,Eai(Dr)),再通过建立如下中国剩余定理方程式(3),解出同余未知数.
(3)
在用户的动态访问权限发生变化时,用户无需接收新的认证密钥,而是通过计算新的Xr和Dr剔除更改权限的用户.当用户数量较大时,为了避免将CRT应用于每个用户,可根据访问权限是否相同将用户归为一个子用户类,其中每个子用户均适用CRT,子用户类中的所有用户共享Xr.
密钥传输过程中的完整性和保密性是由TLS_KMIP扩展协议实现的.TLS_KMIP协议由KMIP协议通过安全传输层协议扩展而来.私有云密钥服务端需要挑选合适的TLS密码套件对封装成标准密钥交换消息格式的密钥信息进行加密传输,从而保证通信过程的安全性.此外,本文方案的安全分析还涉及2种较为常见的攻击.
1) 敌手控制某些具有计算能力的客户端节点.本文方案中用户只持有自己的密钥,密钥节点由哈希结果组成,敌手无法逆向推出父密钥,因此同类子用户得到同一层次的密钥是十分困难的,对于非同类子用户的文件数据更无法访问.云环境中大量节点位于高性能服务集群中,而单个节点可访问的某一类文件却只占全部文件的0.1%.因此,当敌手占领少部分节点时,能获取的数据也只能是很少的一部分.
2) 敌手入侵公有云服务器.文件数据在云服务器上是加密存储的,即使敌手得到云服务器上的数据,也只是无法解密的“乱码”.敌手若要解密就必须得到数据加密密钥,而文件数据加密密钥由根密钥派生得到,根密钥在密码盒中进行存储.敌手若要取得根密钥就必须使用用户的私钥将密码盒打开,而海量用户各自拥有不同的私钥.因此敌手只获得云端加密文件是得不到关于文件内容的任何有效信息的.
该方案采用Java语言进行开发,使用MySQL数据库进行存储,节点间通信采用KMIP协议通信,SHA-256哈希函数为OpenSSL开源库中,将其作为密钥派生的哈希函数;同时,使用OpenSSL密钥库中的AES对文件进行加密以满足细粒度的文件数据加密要求,文件加密模式为XTS(XEX tweakable block cipher with ciphertext stealing).因为XTS-AES可以随机访问,且其加密和解密可以并行化,因此适用于网络存储的加密模式.
本文方案实验在个人电脑上进行仿真实现.其中,用户使用电脑自带的Windows操作系统,私有云控制节点、私有云计算节点、公有云服务节点由虚拟机采用Ubuntu操作系统,私有云节点功能是文件的加解密,公有云节点功能是文件搜索和文件存储.仿真环境配置如表2所示:
表2 仿真测试环境配置
3.2.1 存储开销分析
存储开销分析如表3所示.其中,树的叉数为b,树的深度为d.经典密钥存储方案指的是将加密密钥逐一进行分块存储.
表3 存储开销分析 b
图10 存储开销占比
以下通过采用4种不同叉数的密钥哈希树对比本文方案与原始方案的存储开销,如图10所示.
从图10可知,密钥树的b较小时,本文方案明显优于原始方案的存储开销,随着d的增加,存储开销占比曲线会趋于平稳.同时,本文方案密钥存储最小,占比下降至0.2以下,进一步优化了文献[12]方案.
3.2.2 计算开销分析
为对本文方案的计算开销和性能进行量化分析,接下来将该问题降维至密钥分发和密钥派生的输入输出(IO)问题,并测量2种IO数据.
1) 密钥分发IO.
图11对比了文献[12]方案和本文方案的密钥分发IO情况,2种方案基本没有差距,原因是通信消耗比密钥派生的消耗要大得多.
图11 密钥分发IO(叉数b=4)
图12 密钥派生IO对比图
2) 密钥派生IO.
从图12可以看出,挑选的派生树叉数分别为2,3,4,5,6,7,相同的深度在不同的叉数上表现出来的密钥派生IO情况基本一致,但相同叉数在不同的深度上表现出的密钥派生IO与密钥树深度呈负相关,深度越小,密钥派生效率越高,因此密钥派生的效率只与深度有关,与叉数无关.密钥树深度越小,需要哈希的次数就越少,所以当d=2时,由根密钥直接派生出密钥,不需要产生中间节点上的密钥,此时的密钥派生效率最高,密钥派生的效率比文献[12]有大幅度的提升.
受到文献[12]方案启发,本文提出了一种基于密钥派生矩阵的密钥存储管理方案,以解决由海量用户保存的文件数据引起的大量密钥管理问题.借助根密钥一次派生即可获得数据加密密钥,并且只需管理根密钥和密码盒配置,降低了对密钥存储管理的负担.在经过安全性分析、性能分析、实验测试后,证明本文提出的密钥派生方案省去了中间节点的计算消耗,在存储开销和计算开销方面明显优于现有方案.