可变动RBAC模型的密钥管理研究①
2018-11-14魏弋翔程绍银
蒋 凡,魏弋翔,程绍银
1(中国科学技术大学 信息安全测评中心,合肥 230027)
2(中国科学技术大学 计算机科学与技术学院,合肥 230027)
1 引言
访问控制是信息安全中最为基础的方面之一[1],而RBAC正是一种解决办法.在RBAC中,一个多级结构被定义为拥有不同权限的不同角色的集合,将用户映射到角色,给角色赋予权限,把用户与权限的直接联系舍弃,通过角色来联系与管理[2].NIST标准RBAC模型分为RBAC0 (core RBAC,核心RBAC)、RBAC1(hierarchy RBAC,分级 RBAC)、RBAC2 (constraint RBAC,约束 RBAC)和 RBAC3 (combine RBAC,组合RBAC)四个子模型[3],其中在RBAC1中引入了角色的继承关系.这个标准模型统一了人们对于RBAC的认识[4].于是RBAC模型可以被抽象为具有支配关系的集合,有限继承的RBAC1模型正是线性以及树形结构的多层结构.在此基础上,可以使用密钥来区分不同角色,以达到权限与角色对应的目的.这个需求会出现在大部分的多层结构组织的访问控制系统中.在这样的系统中的密钥管理面临的一大挑战性的问题就是如何保证角色能获得自身的密钥[5]和期望每一个处于这个系统中的用户都能从它自身的密钥计算出它的下级集合的密钥,即便是在频繁变化的系统中.系统的变动是使用中的必然,容易预见,用户的角色会发生变化,每一个角色也有可能会发生变化(例如增加角色、删除角色,权限的升级与降级).所以密钥管理应该在保证安全性的同时高效地生成或改变密钥.如何在系统发生改变时做出响应即是本文章讨论的重点[6].
为了更容易地理解这个场景,想象有一个多职位的企业.其中每一个职位都会有下辖的职位,例如总经理下有销售经理等.这样一来,不同职位对应着不同的角色.显然,不同角色对应着不同的访问权限.这样一来就出现了一个问题: 当某职位有人员调动时,该角色的密钥应当发生改变,否则本不该知道密钥的、不属于该角色的成员仍能掌握该密钥.
真正核心的问题在于,如何保证一个祖先节点能够推测出密级远低于它的节点的密钥[7].更进一步地,如果一个用户离开了这个系统或者离开了其中某个部门,要想使得该用户原节点之下的信息不再被该用户获知,则这些节点的密钥都需要作出相应更改.
在这篇文章中,我们提出了一种新的高效的密钥管理方法.这篇文章按以下结构组织: (1)在第2节中介绍了该模型的多层结构和密钥分配方法; (2)在第3节中,对已有的密钥管理方法做了一个回顾; (3)在第4节中,介绍了我们的模型并阐述了理论基础;(4)在第5节对该方法进行安全性证明与实验; (5)最后对本文进行了总结.
2 问题定义
2.1 密级模型
正如在前文提到过的一样,在这个访问控制模型中最基本的是“角色”,每个角色对应一个密级.可以如下定义这个问题[8].
这些实体根据密级被分割为不同的子组,即成为角色.每个角色是用户的一个集合,对应了一个密级,将其称为SCi.这样在定义中,每个SCi就是一些实体的集合,所有的SCi组成的集合称作SC.现在我们可以定义SC的偏序关系.对于两个类SCi和SCj,若SCi对SCj具有访问权限,则称SCj从属于SCi,以≤表示这个关系.这样定义之后有以下几个特性[9]:
1) 传递性: 假设有三个不同的密级集合,SCi,SCj,SCk,如果有 SCi≤SCj且 SCj≤ SCk,那么 SCi≤SCk.
2) 自反性: 对任何密级集合 SCi都有 SCi≤SCi.
3) 非对称性: 如果 SCi≤SCj且 SCj≤SCi那么必定有i=j.话句话说,和 SCj是对应于同一角色的密级集合.
如果在一张图上表示这个结构,可以明显地看出三种构型: 线性,树形和有向无环图(DAG),如图1.所示.在一般情况下,从有向无环图到线性结构是一个逐步特化的过程.但是线性结构与树形结构和有向无环图有很大的区别,因为线性与树形结构的每一个节点均只有一个直接支配节点.在应用上来说,这两种结构更符合现实中的情景,和有限继承的RBAC模型契合,所以本文着重讨论这线性与树形两种结构.
图1 三种结构类型示意图
2.2 密钥分配
在一开始,需要为每个角色分别指定一个初始的密钥.方法如下[10]:
(1) 为每个角色分别指定一个互不相同的质数.对于每个v∈V,选择一个与其他质数p均不同的质数pv.
(2) 利用这些质数,通过如下方法,为每个角色生成一个标记(token).
(3) 随机选择两个不同的大质数p和q,计算n=p·q.然后选择根密钥k0使得1 (4) 对于每一个v∈V,计算出modn.其中Av表示从属于v的所有密级集合的集合. 这个标记的优点在于,非常简单地标记了不同角色之间的从属关系.对于角色SCi≤SCj(i≠j),一定有tj|ti.这一点很好证明. 但是,上述有两点问题.第一点是计算出的tv可能非常大[11].另一点是,所有的密钥都与k0有紧密的联系,因此当密钥系统发生了改变时,不管是角色还是角色中的用户改变,几乎都必须从根向下更新一遍.这意味着每当变化发生,密钥将被重新分配.这篇文章关注的重点则是如何减少变化发生时的修改次数. Hassen等人提出的密钥管理方法利用了额外空间来存储密钥表.他们将此方法称为“对线性多层结构的基于密钥表的密钥管理方法”(KTLHs)[12].第一次使用KTLHs时,它会随机生成一个K1,然后每一个Kt+1都能使用一个单向哈希函数H来生成,Kt+1=H(Kt).这样一来,对于每一个SCt的成员来说,任意密级集合SCu(SCu≤SCt)的密钥可以通过u–t次哈希函数来得到.密钥表将记录下每个密级集合已经得到的密钥以及版本号,用Ktp来表示密级集合SCt在进行过第p–1次更新后的密钥.更新密钥时,将会进行以下操作: 以密级集合SCt发生了改变为例. (1) 控制中心随机生成一个新的密钥Ktp+1. (2) 对每个满足SCc≤SCt的SCc,使用单向函数H计算出Kcp+1并发送至相应的集合. (3) 对每个满足SCt≤SCs的SCs,发送消息对(t,Ktp+1)至对应集合. (4) 每个密级集合更新自己的密钥表. 考虑一个有5个密级集合的系统,其中SC3的一位成员离开系统.那么SC1的成员所持有的密钥表在运行了上述算法后将如表1所示.这样,若SC1的成员想要访问SC5的资源,只需要运行两次H(K32). 这个情形是SCu的成员升级或降级至SCt,为了方便描述,不妨设SCu≤SCt. 表1 成员持有的密钥表 (1) 控制中心随机生成一个新的密钥Ktp+1. (2) 然后对每个满足 SCu-1≤SCc≤SCt+1的 SCc,使用单向函数H计算出Kcp+1并发送至相应的集合. (3) 满足SCt≤SCs的SCs将会收到消息对(t,Ktp+1);满足 SCu–1≤SCs的 SCs将会收到消息对 (u,Kup+1). (4) 每个密级集合更新自己的密钥表. 密级集合只会通过两种方式发生改变,即增加和删除.这个改变可以视为在改变的节点处做了加入/离开操作.举例来说,当SCt被添加的时候,使原本的SCt降级为SCt+1,然后对SCt做SCt上的相应的加入/离开操作. 当连续且不同的改变发生时,密级集合的密钥表可能表得非常大,使得这个方法接近或等价于“非依赖方法”.比如角色中的成员自上而下发生改变时.在之前举例的情境中,则是从SC2,SC3直至SC5发生改变.在这些改变发生完成后,SC1的密钥表将分别记录下所有密级集合的密钥.如表2所示. 本文提出了一种新的密钥管理方法,引入参数的密钥管理方法(Parameters Table-based key management scheme for Hierarchies,PTH).它在保持与“依赖方法”相同的获取下级密钥的速度的同时比KTLHs时的存储空间改变更小. 这个模型是依赖模型的一个改进模型,在计算下级密钥方面有相同的复杂度,在系统的变动发生时更新次数有很大的减少.每个角色仅存储自身的密钥和一个参数,这个参数用来参与计算下级密钥.这样保证了系统所消耗的空间与系统的角色数是成正比的,并且该比例是稳定的. 表2 极端情形下成员持有的密钥表 如图2所示,每个角色存储它自己的密钥和参数i两个信息. 图2 在变化时发生的更新 K0作为根密钥由中心控制器直接随机生成. 对于每个不是根节点的角色,Kt=H(Kt–1,it–1),H(K,i)=gK+i. 当SCt的成员发生变动时,以下操作会被执行: 1) SCt选择一个随机数r,计算出Ktnew=Kt∙gr. 2) 计算并更新itnew. 3) 上级密钥的参数it–1new更新. 算法1.结构的建立与用户变动Data: 由 CA 生成的K0 Result: 各自保存自身密钥的 RBAC 模型 1 initialization;2 foreach 非根节点角色 do 3Kt=H(Kt-1,it-1);4 end 5 while SCt发生变动 do 6 SCt 选择随机数r;7 计算 ;inew Knew t=Kt.r 8 ;t=(Kt⊕it)⊕Knewt 9 ;10 end inew t-1=(Kt-1⊕it-1+r)⊕Kt-1 可以看出,每一个变动的只对邻近的角色的有影响,而且只更新其参数.每一次变动只有两个密钥集合的信息会被更新. 算法2.角色变动Data: 由 CA 生成的K0 Result: 各自保存自身密钥的 RBAC 模型1 initialization;2 while SCt 删除 do 3 SCt的直接指派关系移交至其直接父亲(假设为SCt–1);4 ;5 end 6 while SCt 插入子节点 SCt+1 do 7 SCt 的直接指派关系移交至 SCt+1 ;8 设置新参数itnew;Kt+1=H(Kt,inewt )inew t-1=Kt⊕it⊕Kt-1 9 计算 ;10 ;inew t+1=Kt+1⊕Kt⊕it 11 ;12 end inew t-1=Kt⊕it⊕Kt-1 在实现与测试中,密钥与参数进行异或运算作为单向函数的参数,可以保证密钥与参数的规模在使用过程中保持不变. 因为线性多层结构和树形多层结构有一个重要的共同点,即都只有一个直接的上级节点,所以树形多层结构可以被看作是线性多层结构的一个扩展.有一点区别在于,树形结构由于子节点更多,所以需要更多的空间来存储参数序列.这样,下级节点的密钥计算如图3所示. 图3 计算并更新密钥 定理1.这个更新方法保证了一个密级集合不能够获取上级集合的密钥. 证明.假设有一个函数Dec可以通过给定的信息输出上级集合的密钥.不妨设该函数形为: 1) 这里,该公开模p循环群,g为其生成元. 2) Alice选择一个随机数a作为密钥.那么公钥则是(g,ga,p). 3) 在这个情境下,Dec则输出a–i.而其中i=0. 这等价于利用Elgamal加密算法的公钥输出了其私钥,而这在目前是公认计算不可行的.证明完毕. 这个结论的成立也是非常直观的.对于不同的x和i,算出的x'是有可能相同的.Dec不可能在仅知道x'的情况下输出确切的x.由于这个方法有和Hassen等人提出的方法同样的更新时机,这个方法也满足他们提出的两个安全特性. 如果用N来代表密级集合的个数(也即角色数),用ui表示密级集合SCi的成员数量.SCi中成员的变动概率为p.那么这个系统发生的变动总数为: 虽然没有一个特定的规则或公式去求得具体的p和u,但是显而易见的是,越下级的SCi的p和u倾向于越大.不妨简单地假设pi=ki,ui=mi,其中k和m是两个指定的参数.在本文的方法中,每次变动的更新次数是一致的,可以算出T=O(N); 而在密钥表模型中,T是不确定的,在一些极端情况下,可能出现T=O(N2).可以说,密钥表方法是使用了更多的表更新次数换取了更少的获取下级密钥的时间. 基于密钥表的密钥管理几乎只能用于一个纯线性的结构中.在纯线性的模型中,KTLH的消耗与角色数呈正相关.在同样的变动次数下,其响应时间受系统中角色数的影响.如图4所示. 可以看出,由于本文提出模型的单向函数基于离散对数,而处于安全考虑,其循环群的阶数得较大,所以在系统初始化时的构建中耗时较长.但是在其后的频繁变动中,由于每次独立变动的耗时几乎相同,其消耗仅与变动次数相关.在大规模的多角色多层级的系统中,相较于KTLH将拥有更高的效率. 在角色变动中,有类似的表现.如图5所示. 图4 线性结构用户变动响应效率对比 图5 线性结构角色变动响应效率对比 本文介绍了一个可以被用于基于角色的多层系统中的新的密钥管理方法,这个方法满足Hassen等人提出的安全要求.除了在线性的多层结构中有良好的表现,这个密钥管理方法可以轻松的扩展至树形结构.这个方法保持了与依赖方法推测下级密钥相同的复杂度,并且降低了在变动发生时的更新次数.该方法的优点在于,对于一个可能频繁变动的系统来说,其消耗仅与变动次数相关,可以更好得应用于一个多角色多层级的大规模系统当中.3 KTLHs
3.1 加入/离开
3.2 升级/降级
3.3 密级集合变化
3.4 空间消耗增多的情形
4 本文方法
4.1 模型结构
4.2 线性模型
4.3 树形模型
5 安全性证明及实验
5.1 安全性
5.2 计算复杂度
5.3 真实场景模拟
6 结论与展望