发明的详细描述
本发明涉及向具有分层关系的数据库对象提供基于区域的安全性的系统和方法。与为每一对象更新单独的安全性描述符相反,本发明引入了区域的概念,借此从给定对象与区域而非分层结构的关联得到该给定对象的安全性。这与需要各个对象描述并在继承分层结构之间置入安全性的经典体系结构相反。以此方式,数据库处理和存储可被保存,因为众多对象可能共享可在各个区域的更全局的范围上定义的类似的安全属性。在一个方面中,提供使数据库安全性和管理更容易的系统。该系统包括存储在对象之间具有分层关系的多个对象的数据库组件。区域组件为对象子集定义安全区,并将安全性数据映射到该子集,其中安全区独立于对象之间的分层关系、并与其去耦、或分离。
如本申请中所使用的,术语“组件”、“系统”、“对象”、“区”等意指计算机-相关实体,或者是硬件、硬件和软件的组合、软件或执行中的软件。例如,组件可以是,但不限于,运行在处理器上的进程、处理器、对象、可执行代码、执行的线程、程序和/或计算机。作为说明,运行在服务器上的应用程序和该服务器本身都可以是组件。一个或多个组件可以驻留在进程和/或执行中的线程内,且组件可以位于一台计算机上和/或分布在两台或多台计算机之间。而且,这些组件可从其上存储各种数据结构的各种计算机可读介质上执行。组件可经由本地和/或远程进程,诸如根据含有一个或多个数据包的信号进行通信(例如,来自一个组件的数据与本地系统、分布式系统中的另一组件和/或跨诸如因特网的网络与其它系统经由信号进行交互)。
首先参考图1,根据本发明的一方面示出了对象安全性系统100。系统100包括与区域组件120相关联的关系数据库110(例如,SQL或其它类型的数据库),区域组件120定义一个或多个对象安全区130。一般而言,当作出了对象安全性改变时,对象分层结构的各个节点(例如,见分层结构中参考标号140处的一个对象)不会被一个一个单独地更新。相反,由每个130处的各个安全区的区域组件120分配安全性策略。通过将对象映射至安全区130而不是一个一个单独地更新每一对象,数据库110处的读取操作的次数可被减少。因此,区域组件120将安全性策略映射从其中更新每一对象的继承分层结构变换成其中对象区共享类似的安全性策略的对象安全性域。以此方式,当对象的安全性策略改变时,可通过仅更新安全区130缩减的子集而非更新经典继承分层结构中的每一个别对象,来传播安全性更新的较小子集。注意到,可采用继承概念在系统100中传播策略,然而,继承是位于安全区130之间而非树中对象之间的常规继承。因此,是在以安全性域而非对象域建模的组件之间存在继承。这暗示了,各个对象之间的安全性映射是位于对象及其相关联的区130之间而非为各个对象140显式划定的。因此,区域组件120向所标识的对象的区域提供安全性,且实质上与将安全性改变传播给分层结构中的所有对象的常规对象分层结构去耦、分离或被独立。
一般而言,可对数据库110中的项目分配一(标识符)ID用作安全性描述符。数据库包括具有被称为SDID(安全性描述符ID)列的[Table!Item]表。该SDID是例如在隐藏的SQL系统表中存储和维护的安全性描述符的唯一ID。可通过公用视图来展示系统表(例如,Sys.Security_Descriptor)。下表是关于安全性描述符可如何被插入基本对象模型或与之相关联的简化说明:
[Table!Item]:将项目与安全性描述符ID相关联。
_ItemID(项目ID) | ... | _SDId | ... |
| | | |
| | | |
[Sys.Security_Descriptor]:将ID映射到安全性描述符的内容。
Sd_id | Type(类型) | SecurityDescriptor(安全性描述符) | ... |
| | | |
| | | |
为了有效地将安全性描述符ID(SD ID)分配给对象项目,SD区域技术是部分基于对于大多数对象项目往往共享相同的安全性描述符的观察。SD区域是共享相同或相似SD ID的一组项目(它们不必如常规系统中的那样为邻接的)。一般,以上所示[Table!Item]中的所有项目可被分组到不同的SD区域。可按照一个SD区域的SD可从上述安全性域中另一SD区域的SD继承来建立SD区域的关系。基本上,建立可与相应的对象项目树进行比较的SD区域树,但它具有较少的节点,如以下关于图2和3所示。SD区域树因此可被用于有效地更新项目的SD。一般,当创建安全性项目树时,创建三个SD区域来将SD分配给树中基本上所有的项目。因此,一个SD区域用于根项目(其中,定义了显式的SD),另一SD区域用于各个容器项目,而最后一个SD用于非容器项目。
现在参考图2和3,根据本发明的一方面示出了示例安全性域变换200和300。在图2的200处,示出了对象树的节点,其中210处的黑节点是根项目;220处的灰节点是容器项目,而230处的白节点是非容器项目。如240处所示,当更新项目的安全性标识符(SD)(例如,通过改变SD的所有者、分组、访问控制列表等)时,项目所属的SD区域可被分成三个子组或子集。安全性改变一般通过被称为访问控制条目(ACE)的数据来反映,该数据可以是显式或隐式的形式。当将显式的ACE添加到项目的SD时,可在该项周围创建新的SD区域。在这种情况中,创建三个了SD区域,一个用于项目(添加显式ACE的项目)本身、一个用于其容器孩子,另一个用于其非容器孩子。参考图3,示出了当非传播显式ACE被添加到310处的项目上的SD时的更复杂情况,其中如320处所示,在项目周围创建了五个新区域。在这种情况中,在330为项目本身(即添加显式ACE的项目)创建了一个区域,在340处为其直接容器孩子创建了一个区域,在350处为其直接非容器孩子创建了一个区域,在360处为其非直接容器孩子创建了一个区域,在370处为其非直接非容器孩子创建了一个区域。
概括图2和3,当项目的SD被显式更新(不是通过继承)时,创建新区域。一般而言,取决于对SD进行的更新创建3或5个新区域(其它数目也有可能)。如果添加了非传播ACE,则创建五个SD区域,在其它情况中,一般创建三个SD区域。作为示例,把SD包含非继承属性(在大多数情况中为非继承ACE)的项目假定为根项目。如上所述,取决于SD中显式ACE的类型,容器类型根项目可拥有3或5个SD区域。如果非容器其SD具有显式的属性,它可具有其自己的SD区域。如果移除了根项目SD的所有显式属性,则该根项目所拥有的SD区域可被折叠到其双亲项目的SD,这将减少一个一个单独地对象安全性更新。每一SD区域可被表示为Security_Hierachy(安全性分层结构)表中的行,诸如下例:
[Table!Security_Hierachy]:存储SD继承关系,并建立项目来共享相同的安全性描述符。
_SDIdParent(SDID双亲) | _SDId | RootItemID(根项目ID) | _IsContainer(是否为容器) | _Scope(范围) |
| | | | |
| | | | |
上表的列可包括作为SD区域的ID的_SDId字段;作为所继承的安全属性源自的SD的ID的_SDIdParent字段;作为定义显式SD的项目的ID的_RootItemID;如果SD应用于容器则为1如果应用于非容器则为0的_IsContainer字段;以及如下编码的_Scope字段:0:SD应用于根项目,1:SD仅应用于根项目的孩子,2:SD应用于根项目的直接孩子,3:SD应用于根项目的非直接孩子。
注意到,当引导数据库时,按需可创建三个默认的安全性描述符:一个描述符用于顶端的根项目,一个描述符用于所有的容器孩子,而另一描述符用于所有非容器孩子。因此,在顶端的根项目上也可创建三个SD区域。一般,随后批量创建的所有项目均可具有SD之一作为其默认的SD。当将显式ACE添加到项目时,可如上所述创建新的SD区域。
图4根据本发明的一方面示出了示例安全性接口400。各个安全性接口400可被提供用于与上述基于区域的考虑相交互。以下将描述可应用的少量接口示例。这些可包括用于检索安全性数据的接口410、用于设置安全性信息的接口420、以及将在以下更详细描述的用于保持链接(holding link)的接口。以下代码片段是这些接口400中某些的公共声明的示例。
Public sealed class Item Security
{
public ItemSecurity(Guid itemId)
public string GetSDDLSecurity()
public GenericSecurityDescriptor GetSecurity()
public void SetSDDLSecurity(string sd,SECURITY_INFORMATION si)
public void SetSecurity(GenericSecurityDescriptor gsd,
SECURITY_INFORMATION si)
public string GetUserEffectiveSecurity()
public void AddHoldingLink(Guid itemId)
public void RemoveHoldingLink(Guid itemId)
}
以下提供安全性接口410到430的简要描述:
public string GetSDDLSecurity()——检索SDDL字串格式的项目上的整个安全性描述符。它包括继承和显式地访问控制列表。
public GenericSecurityDescriptor GetSecurity()——检索受管ACL类GenericSecurityDescriptor格式的项目上的整个安全性描述符。
public void SetSDDLSecurity(string sd,SECURITY_INFORMATION si)设置项目上的安全性描述符。该函数忽略所继承的ACE。它从其双亲和其它保持链接重新生成继承ACE。它可被调用来设置所有者、分组、控制标志或显式ACE。SECURITY_INFORMATION指示安全性描述符的哪一部分要被更新。
public void SetSecurity(GenericSecurityDescriptor gsd,
SECURITY_INFORMATION si)——设置项目上的安全性描述符。将受管ACL类作为输入参数。
public void AddHoldingLink(Guid itemId)——当向项目添加新保持链接时,更新项目上的安全性描述符。
public void RemoveHoldingLink(Guid itemId)——当从项目移除新保持链接时,更新项目上的安全性描述符。
public string GetUserEffectiveSecurity()——检索包含与当前安全性内容相关的ACE的项目上的安全性描述符。
图5根据本发明的一个方面示出了区域组件处理500。在510处,提供了区域定义。这些包括作为共享相同SD的一组项目的安全性描述符(SD)区域。该组项目不必形成邻接树。安全性分层结构(SH)行是以下所列[Table!Security_Hierachy]表中的一行。每一SD区域在表中应具有一SH行。
_ParentSDId | _SDId | RootItemId | _IsContainer | _Scope |
SD0 | SD1 | ItemId | 0 | 3 |
| | | | |
上表中的一行被称为SH行,它对应于一SD区域。该表中的行指示共享相同安全性描述符(上例中的SD1)的一组项目(可以是单个项目)。该组项目由公共的根(ItemId)、公共的类型(容器或非容器)以及范围定义。范围可任选来支持不同的操作系统安全性模型。
在520处,描述了区域合并和创建的考虑。在此方面中,可在以下条件下创建一个新的SD区域:
1.对非容器项目进行了SD改变。
在以下条件下可创建三个新的SD区域:
1.对容器项目进行了SD改变,且
2.该SD改变不包括非传播ACE。
在以下条件下可创建五个新的SD区域:
1.对容器项目进行了SD改变,且
2.该SD改变包括非传播ACE。
在以下条件下可合并SD区域:
1.双亲SD通过刷新(flushing)孩子SD来实施SD继承。或者
2.从SD中移除了显式ACE。
在530处,提供了可在关于图6所述的以下算法中采用的各个符号。这些概念包括:
_Item或*——应用该操作的当前项目系统。
SDId(x)或SDId—项目x上的安全性描述符的sd_id。
SDId_NC(x)或SDId_NC——应用于项目x的非容器孩子对象的SDId。
SDId_C(x)或SDId_C——应用于项目x的容器孩子对象的SDId。
SDId_NC2(x)或SDId_NC2——应用于项目x的直接非容器孩子对象的SDId。
SDId_C2(x)或SDId_C2——应用于项目x的直接容器孩子对象的SDId。
SDId_NC3(x)或SDId_NC3——应用于项目x的非直接非容器孩子对象的SDId。
SDId_C3(x)或SDId_C3——应用于项目x的非直接容器孩子对象的SDId。
SHRow(x,i,j)——[Table!Security_Hierachy]表中_RootItemId=x,_IsContainer=i,_Scope=j的行
UpdateItemSD(OldSDId,NewSDId,RootItem,IsContainer,Scope)——更新当前SDId=OldSDId、祖先为RootItem(根项目)、Scope在NewSDId内的类型(IsContainer)的所有项目的SDId。
UpdateSDBlob(SDId)——如果其孩子的SDId未能与其SDId形成循环,则更新该SDId及其孩子的安全性描述符的内容。例如,当对于在[Table!Security_Hierachy]表中没有自己的行的文件项目(带SD1)上添加保持链接(SD0)时,将创建三行(SD0,SD1,_Item,0,0)、(SD1,SD0,_Item,0,1)、(SD1,SD0,_Item,1,1)。此处为该项目的孩子项目重新使用SD0以显著地减少[Table!Item]表中更新的次数。
UpdateSDId(SDId,SDId_New)——更新[Table!Security_Hierachy]中_SDId=SDId的当前项目的行,以便令_SDId=SDId_New。
UpdateParentSDId(SDIdPar,SDIdPar_New)——更新[Table!Security_Hierachy]中_ParentSDId=SDIdPar的行以便使_ParentSDId=SDIdPar_New。
CreateNewSD(SDId)——从当前SD加上所进行的改变(添加/移除ACE、添加移除/保持链接)来创建新SD。
图6根据本发明的一方面示出示例区域处理算法600。在此方面中,可采用至少三个单独或组合的算法600来实现区域处理。这包括在610处设置安全性描述符;添加保持链接620;以及在630处的移除保持链接算法。对于设置安全性描述符610,有各种方式来改变对象上的安全性描述符,至少包括:
·添加/移除可继承显式ACE。
·添加/移除应用于该项目及其所有孩子的可继承显式ACE。
·添加/移除仅应用于其孩子的可继承显式ACE。
·添加/移除仅应用于该项目及其直接孩子的可继承显式ACE。
·添加/移除仅应用于孩子容器的可继承显式ACE。
·添加/移除仅应用于孩子对象的可继承显式ACE。
·添加/移除仅应用于某种类型的对象的可继承显式ACE。
·改变安全性描述符的所有者。
·改变安全性描述符的分组。
·改变安全性描述符控制标志。
i.停止ACE继承
ii.开始ACE继承
iii.改变仅用于该项目的其它控制标志。
在620处,当将保持链接添加到项目时,取决于该保持链接是否具有可继承ACE以及该项目上的SD的SE_DACLE_PROTECED标志是否开启,可以或不可以改变该项目上的安全性描述符。然而,应更新[Table!Security_Hierachy]表。当将保持链接添加到一项目上时,如果该项目还没有指定的行,则应在[Table!Security_Hierachy]表中添加该项目的三个新行。为了减少[Table!Item]表中的更新,可使用以下格式来创建这些行:(SD0,SD1,*,0,0)、(SD1,SD0,*,0,1)、(SD1,SD0,*,1,1),其中SD0是保持链接的目标项目的老的SDId,SD1是目标项目的新的SDId。按此方案,应仅需更新[Table!Item]表中的源项目。基于该方案,如果稍后将显式不可继承ACE添加到该项目,则不会在[Table!Item]表中执行更新。在630处,可假定要移除的保持链接的安全性描述符的SDId为SDId_HD。在移除保持链接的情况中,SD区域可折叠,因此可合并[Table!Security_Hierachy]表中的各行。
图7根据本发明的一方面示出了用于数据库对象安全性的示例安全性区域处理700。尽管,为了描述的简单,该方法被表示和描述为一连串或多个动作,可以理解和领会,本发明不受动作的顺序的限制,因为,根据本发明,某些动作可以按不同的顺序和/或与此处所示和所描述的其它动作同时发生。例如,本领域的技术人员可以理解和领会,方法可以替换地被表示为诸如状态图中的一连串互相关联的状态或事件。而且,并非所有示出的动作都是实现根据本发明的方法所必需的。
前进至图7的710,考虑到经典的对象分层结构中的任何潜在更新,通过移除要被更新(安全性方面)的每一对象的需求,使数据库中的各个对象的安全性描述符从该分层结构中去耦或分离。在720处,利用了一个或多个安全性描述符来为驻留在数据库中的对象定义对象区域。如上所述,这可包括折叠或合并来自相似或不相似对象树中的对象安全性数据,以便定义安全性区域或对象子集,它们预定与该区域类似的安全性数据。而且,这样的区域数据可被定义在数据库的行中,其中包括属于该区域的对其它对象的结果性关系。在730处,对数据库中每个所选的区域设置对象安全性策略。如上所述,取决于访问控制条目的类型(隐式/显式)和对象分层结构中安全性改变的位置,从这样的设置中可创建各个安全性区域。在740处,在经典对象域与本发明的安全性域之间发生变换,以便在数据库内传播安全性改变。这可包括当向给定对象请求安全性改变时在该对象周围创建区域子集(例如,取决于安全性改变的类型,创建三或五个区域)。
参考图8,用于实现本发明各方面的示例性环境810包括计算机812。计算机812包括处理单元814、系统存储器816和系统总线818。系统总线818将包括但不限于系统存储器816的系统组件耦合至处理单元814。处理单元814可以是任何种类可用的处理器。也可以使用双微处理器和其它多处理器体系结构作为处理单元814。
系统总线818可以是若干类型的总线结构中的任一种,包括存储器总线或存储器控制器、外围总线或外部总线、和/或使用各种可用的总线体系结构中的任一种的局部总线,可用的总线体系结构包括,但不限于,11位总线、工业标准体系结构(ISA)、微通道体系结构(MCA)、扩展的ISA(EISA)、智能驱动器电子接口(IDE)、VESA局部总线(VLB)、外围部件互连(PCI)、通用串行总线(USB)、高级图形接口(AGP)、个人计算机存储卡国际协会总线(PCMCIA)以及小型计算机系统接口(SCSI)。
系统存储器816包括易失性存储器820和非易失性存储器822。基本输入/输出系统(BIOS)包含在诸如启动时在计算机812中元件之间传递信息的基本例程,它通常存储在非易失性存储器822中。作为说明,而非限制,非易失性存储器822可以包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦ROM(EEPROM)或闪存。易失性存储器820可以包括用作外部高速缓存的随机存取存储器(RAM)。作为说明,而非限制,RAM以多种形式可用,诸如同步RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双倍数据速率SDRAM(DDR SDRAM)、增强型SDRAM(ESDRAM)、同步链路DRAM(SLDRAM)以及直接Rambus RAM(DRRAM)。
计算机812也包括可移动/不可以移动、易失性/非易失性计算机存储介质。例如,图8示出磁盘存储824。磁盘存储824包括,但不限于,如磁盘驱动器、软盘驱动器、磁带驱动器、Jaz驱动器、Zip驱动器、Ls-100驱动器、闪存卡或记忆棒的设备。另外,磁盘存储824可以包括独立或与其它存储介质结合的存储介质,包括但不限于,诸如光盘ROM设备(CD-ROM)、CD可记录驱动器(CD-R驱动器)、CD可重写驱动器(CD-RW驱动器)或数字多功能盘ROM驱动器(DVD-ROM)等的光盘驱动器。为了便于将磁盘存储设备824连接至系统总线818,一般使用诸如接口826等可移动或不可移动接口。
可以理解,图8描述了用户和在合适的操作环境810中描述的基本计算机资源之间担当中介的软件。这样的软件包括操作系统828。可被存储在磁盘存储824上的操作系统828用来控制和分配计算机系统812的资源。系统应用程序830利用了操作系统828通过存储在系统存储器816或者磁盘存储824上的程序模块832和程序数据834执行的资源管理。可以理解,本发明可以使用各种操作系统或操作系统的组合来实现。
用户通过输入设备836向计算机812输入命令或信息。输入设备836包括,但不限于,诸如鼠标、跟踪球、指示笔等定点设备、触摸垫、键盘、话筒、操纵杆、游戏垫、圆盘式卫星天线、扫描仪、TV调谐器卡、数码相机、数码摄像机、网络摄像头等。这些和其它输入设备经由接口端口838通过系统总线818连接至处理单元814。接口端口838包括,例如串行端口、并行端口、游戏端口和通用串行总线(USB)。输出设备840使用某些与输入设备836相同类型的端口。从而,例如,USB端口可以用于向计算机812提供输入,并向输出设备840提供来自计算机812的输出信息。输出适配器842被提供,以表示某些输出设备840,像监视器、扬声器和打印机以及其它需要专用适配器的输出设备840。作为说明而非限制,输出适配器842包括提供输出设备840和系统总线818之间的连接手段的显卡和声卡。应该注意,诸如远程计算机844等其它设备和/或设备系统同时提供输入和输出能力两者。
计算机812可在网络化环境中操作,该环境使用一台或多台诸如844的远程计算机的逻辑连接。远程计算机844可以是个人计算机、服务器、路由器、网络PC、工作站、基于微处理器的装置、对等设备或其它常见网络节点等,且通常包括上文相应于计算机812描述的许多或所有元件。为简洁起见,对于远程计算机844仅示出存储器存储设备846。远程计算机844通过网络接口848被逻辑连接至计算机812,并且然后通过通信连接850被物理地连接。网络接口848包括诸如局域网(LAN)和广域网(WAN)的通信网络。LAN技术包括光纤分布式数据接口(FDDI)、铜线分布式数据接口(CDDI)、以太网/IEEE802.3、令牌环/IEEE802.5等。WAN技术包括,但不限于,点对点链路、类似综合业务数字网(ISDN)及其变型的电路交换网络、分组交换网络和数字用户线(DSL)。
通信连接850指的是用来将网络接口848连接至总线818的硬件/软件。尽管为说明清楚,将通信连接850示为位于计算机812内,然而通信连接850也可以在计算机812外部。仅为示例的目的,连接至网络接口848所必需的硬件/软件包括内部和外部技术,诸如包括常规电话级调制解调器、线缆调制解调器和DSL调制解调器等的调制解调器、ISDN适配器以及以太网卡。
图9是本发明可与之交互的示例计算环境900的示意性框图。系统900包括一个或多个客户机910。客户机910可以是硬件和/或软件(例如,线程、进程、计算设备)。系统900也包括一个或多个服务器930。服务器930也可以是硬件和/或软件(例如,线程、进程、计算设备)。例如,服务器930可以容纳通过使用本发明来执行变换的线程。客户机910和服务器930之间的一种可能的通信可以是适用于在两个或多个计算机进程之间传输的数据包的形式。系统900包括可以被用来方便于客户机910和服务器930之间通信的通信架构950。客户机910可操作地连接至一个或多个客户机数据存储960,它可用来存储信息局部到客户机910。类似地,服务器930可操作地连接至一个或多个服务器数据存储940,它可被用来存储信息局部到服务器930。
以上描述包括本发明的示例。当然,不可能为描述本发明而描述每个可想象的组件或方法的组合,但是本领域的普通技术人员可以认识到,本发明的众多其它组合和排列是可能的。从而,本发明旨在包括落入所附权利要求书精神和范围内的所有这样的变更、修改和变化。而且,对于在详细描述和权利要求书中都使用的术语“包括”而言,当被用作权利要求书中的过渡词时,这样的术语旨在类似于解释术语“包含”的方式是包含性的。