基于堆栈的访问控制的制作方法

文档序号:6418931阅读:157来源:国知局
专利名称:基于堆栈的访问控制的制作方法
相关申请本申请是1997年12月11日提交的、序号为08/988,431号美国专利申请的部分连续申请,其中美国专利申请的发明名称为“对资源访问的控制”,其内容通过引用包括在此。
下列美国专利申请是本申请的依据,并通过引用包括在此申请中。
1997年12月11日提交的、序号为____号美国专利申请,其发明名称为“在计算机系统中提供安全性的保护域”。
1997年12月11日提交的、序号为____号美国专利申请,其发明名称为“安全级别解决方案、装载和定义”。
1997年12月11日提交的、序号为____号美国专利申请,其发明名称为“分类的、参数化的且可扩展的访问控制许可”。
1997年6月26日提交的、序号为08/883,636号美国专利申请,其发明名称为“用于通信信道的与层次无关的安全性”。
1998年2月26日提交的、序号为60/076,048号美国临时专利申请,其发明名称为“分布式计算系统”。
1998年3月20日提交的、序号为09/044,923号美国专利申请,其发明名称为“租用存储器的方法和系统”。
1998年3月20日提交的、序号为09/044,838号美国专利申请,其发明名称为“在分布式系统中用于委托确认租用的方法、装置和产品”。
1998年3月20日提交的、序号为09/044,834号美国专利申请,其发明名称为“在分布式系统中用于分组成员资格租用的方法、装置和产品”。
1998年3月20日提交的、序号为09/044,916号美国专利申请,其发明名称为“用于失效检测的租用”。
1998年3月20日提交的、序号为09/044,933号美国专利申请,其发明名称为“在基于事件的系统中用于传输行为的方法”。
1998年3月20日提交的、序号为09/044,919号美国专利申请,其发明名称为“在分布式系统中用于事件通知的对象的延迟重构和远程装载”。
1998年3月20日提交的、序号为09/044,938号美国专利申请,其发明名称为“用于远程方法启用的方法和设备”。
1998年3月20日提交的、序号为09/045,652号美国专利申请,其发明名称为“用于确定性散列以识别远程方法的方法和系统”。
1998年3月20日提交的、序号为09/044,790号美国专利申请,其发明名称为“在决定分布式系统中用于确定远程对象之状态的方法和设备”。
1998年3月20日提交的、序号为09/044,930号美国专利申请,其发明名称为“在分布式系统中用于进行与远程过程调用相关联的处理的可下载的智能代理”。
1998年3月20日提交的、序号为09/044,917号美国专利申请,其发明名称为“远程方法的挂起和继续”。
1998年3月20日提交的、序号为09/044,835号美国专利申请,其发明名称为“在数据库中用于多入口和多模板匹配的方法和系统”。
1998年3月20日提交的、序号为09/044,839号美国专利申请,其发明名称为“在数据库中用于原地修改的方法和系统”。
1998年3月20日提交的、序号为09/044,945号的美国专利申请,其发明名称为“在数据库中用于类型安全属性匹配的方法和系统”。
1998年3月20日提交的、序号为09/044,931号的美国专利申请,其发明名称为“在分布式系统中的动态查找服务”。
1998年3月20日提交的,序号为09/044,939号的美国专利申请,其发明名称为“在分布式系统中用于提供为与一个装置通信而使用的可下载代码的设备和方法”。
1998年3月20日提交的、序号为09/044,826号的美国专利申请,其发明名称为“便于访问查找服务的方法和系统”。
1998年3月20日提交的、序号为09/044,932号的美国专利申请,其发明名称为“在分布式系统中用于动态地验证信息的装置和方法”。
1998年2月26日提交的、序号为09/030,840号的美国专利申请,其发明名称为“在网络上进行动态分布计算的方法和装置”。
1998年3月20日提交的,序号为09/044,936的美国专利申请,其发明名称为“用于持久共享存储空间的交互式设计工具”。
1998年3月20日提交的,序号为09/044,934的美国专利申请,其发明名称为“基于多形态令牌的控制”。
1998年3月20日提交的、序号为09/044,944的美国专利申请,其发明名称为“基于堆栈的安全性要求”。
1998年3月20日提交的,序号为09/044,837的美国专利申请,其发明名称为“安全性要求的按照方法指定”。
背景技术
本发明针对计算机系统中的安全措施,尤其针对这样的系统和方法,它们根据代码源和委托方的身份控制对资源的访问,这里正以所述委托方的名言执行代码。
当大量使用计算机系统时,各种组织变得越发依赖于它们。计算机系统的故障会严重地防碍组织的工作。因此,使用计算机系统的组织很容易受用户的攻击,用户可以有意或无意地造成计算机系统发生故障。
一种损害计算机系统安全性的途径是使计算机系统执行在该计算机系统上完成有害动作的软件。存在各种类型的安全性措施,它们可以用来防止计算机系统执行有害软件。一个例子是用“病毒”检查程序检查计算机系统执行的所有软件。但是,病毒检查程序只搜索非常特殊的软件指令。因此,病毒检查程序无法识破许多软件窜改机理。
另一种常用的、用来防止软件窜改计算机资源的措施是“信任开发者方法(trusted developers approach)”。根据该信任开发者方法,系统管理者对软件进行限制,使得计算机系统只能访问由信任软件开发者开发的软件。信任开发者例如可以包括众所周知的卖主或内部开发者。
信任开发者方法的基本原则是,由开发者创建计算机程序,并且相信一些开发者生产的是不危害安全性的软件。信任开发者方法的基本原则还有,计算机系统只执行这样的程序,它们存储在由系统管理者控制的位置上。
目前已经开发的、用于运行应用程序的方法包括,自动和立即执行通过网络从远程源下载的软件代码。当网络包括的远程源处于系统管理者的控制之外时,信任开发者方法不起作用。
有一种传统的尝试可以使信任开发者方法适应于能够执行来自远程源之代码的系统,这种尝试称为信任源方法。信任源方法的的一个重要概念是,从哪里接收程序(即,程序的“源”)的位置标识了程序的开发者。结果,可以用程序源确定该程序是否来自一个被信任的开发者。如果源与信任的开发者相关,那么认为该源是“信任源”,并且允许执行代码。
信任源方法的一种实施称为沙盒法(sand box method)。沙盒法允许执行所有代码,但对远程代码有约束。具体地说,沙盒法允许所有信任代码对计算机系统的资源作全访问,而允许所有远程代码对资源作有限访问。通常在计算机系统拥有者或管理者的直接控制下,信任代码存储在本地的计算机系统上,这里系统的拥有者或管理者负责信任代码的安全性。
沙盒法的一个缺点是该方法不太灵活,因为它限制远程代码访问相同有限资源集。于是,当来自几个源的远程代码试图访问相同的资源时,矛盾就产生了。因此,传统的系统经常限定来自一个源的远程代码访问一组计算机资源,并且限定来自另一个源的远程代码访问另一组不同的计算资源。例如,系统限定通过网络从有关第一计算机的源装入的远程代码可以访问一组文件,并且类似地限定通过网络从有关第二计算机的源装入的远程代码可以访问另一组文件。
与沙盒法相比,提供安全性措施允许更大的灵活性,它包括在委托方和许可之间建立一组复杂的关系。“委托方”是计算机系统中给予许可的实体。委托方的例子包括用户、组织、过程、对象和线程。“许可”是计算机系统允许委托方执行一特定动作或功能的授权。
向委托方分配许可的任务因复杂的过程可以包含多源代码的相互作用而复杂化。例如,由一委托方(例如,线程)正在执行的第一信任源的代码可以引起执行第二信任源的代码,然后引起执行第三不信任源的代码。
即使当执行第二信任源代码和第三不信任源代码时委托方保持不变,执行第二信任源代码时适合于委托方的访问特权可能不同于执行第三不信任源代码时适合于委托方的访问特权。因此,当委托方执行的代码源改变时,适合该委托方的访问特权可以动态地变化。
当名义上执行代码的委托方改变时,访问特权也可以动态地变化。有时,一个委托方以另一个委托方的名义执行代码。例如,当一个计算机上的委托方请求访问另一个远程计算机上的资源时,该请求会在远程计算机上调用“远程”委托方,以便处理该请求。远程委托方对请求的处理包括执行信任源的代码和不信任源的代码。在这些情况下,传统系统继续使代码访问特权基于代码源,不考虑名义上执行代码的委托方。由于没有考虑名义上执行代码的委托方,所以传统系统忽视了一种妨害安全性的可能情况。
基于以上描述,显然希望开发一种用于确定合适代码访问特权的安全机制。

发明内容
符合本发明原理的系统和方法用以下方法解决上述需求,即根据代码源和名义上执行代码的委托方来确定对代码的访问控制。由于根据这些因素中的一种或两者调节代码访问,所以可以提高计算机系统中的安全性。
符合本发明原理的一个系统调节资源访问,其中所述资源是由计算机上执行的一个操作所请求的。所述操作调用多个方法,这些方法在执行期间会对代码进行操作。系统包括一个策略文件、一个调用堆栈和一个执行装置。策略文件存储了对资源的许可。许可根据代码的源和代码的执行者同意对资源进行特定类型的访问。调用堆栈按操作的调用次序存储方法和执行者的表示。当调用堆栈上所有方法和执行者的许可所授权的访问类型包含操作所请求的方法时,执行装置同意访问该资源。
附图概述包括在本说明书中并构成说明书一部分的附图示出了本发明的一个实施例,附图和说明书一起说明了本发明的目的、优点和原理。在这些附图中

图1示出了符合本发明原理的计算机网络;图2示出了在符合本发明原理的一个实施例中图1的计算机;图3示出了在图2计算机上执行的代码流;图4例示了一种用于说明保护域之使用的安全性机制;图5例示了通过使用图4的策略文件而实现的策略;图6示出了与图2计算上执行的线程相关的调用堆栈;和图7是一流程图,示出了在符合本发明原理的一个实施例中图6检查许可方法所执行的处理。
详细描述下面对本发明的详细描述参照了附图。在不同图中的相同的标号表示相同或相似的单元。还有,下面的详细描述并不限制本发明。本发明的范围由所附的权利要求书来限定。
符合本发明原理的系统和方法通过对代码灵活指定访问特权,提高了安全性。这些系统和方法不仅使访问特权依赖于代码源(即,代码是否被信任或不信任),而且使访问特权依赖于名义上执行代码的委托方的身份(即,请求执行代码的委托方是否被信任或不信任)。
分布式系统的概述符合本发明的方法和系统在具有各种部件(包括硬件和软件)的分布式系统(“例示的分布式系统”)中工作。例示的分布式系统(1)允许系统用户在具有许多设备的网络上共享服务和资源;(2)为编程人员提供允许开发稳健的且安全的分布式系统的工具和编程模式;以及(3)简化管理分布式系统的任务。为了完成这些目标,例示的分布式系统使用JavaTM编程环境,允许代码和数据以无缝的方式在装置间移动。因此,将例示的分布式系统放在Java编程环境的顶层,并且该分布式系统使用此环境的特性,包括由它提供的安全性以及很强的类型定义能力。1997年Sams.net出版的题为《Java 1.1开发者指南》对该Java编程环境作了更清楚的描述,其作者为Jaworski。
在例示的分布式系统中,不同的计算机和装置联合起来作为单个系统出现在用户的面前。由于作为单个系统出现,所以例示的分布式系统提供了简单的访问,以及单个系统能够提供的共享能力,并且不丧失个人计算机或工作站的灵活性和个人化响应。例示的分布式系统可以包含成千上万个装置,它们由地理位置分散的用户操作,但这些用户都同意委托、管理和策略的基本主张。
在例示的分布式系统内有服务的各种逻辑分组,其中服务由一个或多个装置提供,而每个逻辑分组称为“Djinn”。“服务”是指用户、程序、装置或另一服务可以访问的资源、数据和功能,并且所述资源、数据和功能是可以计算的、存储相关的、通信相关的,或者与访问另一用户相关。作为Djinn一部分而提供的服务的例子包括诸如打印机、显示器、盘片等装置;诸如应用程序、实用程序等软件;诸如数据库和文档等信息;以及系统的用户。
用户和装置都可以参加Djinn。当加入Djinn时,用户或装置对Djinn增加零项或多项服务,并且可以在受安全性约束的情况下访问其所包含的任何一个服务。因此,装置和用户联合成一个Djinn,共同访问其服务。在编程上,Djinn的服务作为Java编程环境的对象而出现,其中Java编程环境可以包括其它对象、用不同编程语言编写的软件部分,或者硬件装置。一个服务具有一个接口,用于定义对该服务可请求的操作,并且服务的类型决定了构成该服务的接口。
图1例示了分布式系统1000,它包括通过网络1400连接互连的计算机1100、计算机1200和装置1300。计算机1100和1200可以包括任何传统的计算机,诸如IBM兼容机,甚至是“哑”(dumb)终端。在典型的操作期间,计算机1100和1200可以建立客户一服务器关系,以便发送和获得数据。
装置1300可以是许多装置中的任何一种,诸如打印机、传真机、存储装置、计算机或其它装置。网络1400是局域网、广域网或互联网。尽管在构成例示的分布式系统1000时,仅示出了两个计算机和一个装置,但本领域的熟练技术人员应该理解,例示的分布式系统100可以包括另外的计算机或装置。
图2更详细地示出了计算机1100,显示了例示分布式系统1100的许多软件部件。本领域的熟练技术人员应该理解,计算机1200或装置1300可以用类似的方式构造。计算机1100包括存储器2100、辅助存储装置2200、中央处理器(CPU)2300、输入装置2400和视频显示器2500。存储器2100包括查询服务2110、发现服务器2120和JavaTM运行时系统2130。Java运行时系统2130包括JavaTM远程方法调用系统(RMI)2140和JavaTM虚拟机(JVM)2150。辅助存储装置2200包括JavaTM空间2210。
如上所述,例示的分布式系统1000基于Java编程环境,因此它使用Java运行时系统2130。Java运行时系统2130包括JavaTM应用程序设计接口(API),允许程序在Java运行时系统的顶层运行,以便按独立于平台的方式访问各种系统功能,包括主操作系统的窗口化功能和网络化能力。由于Java API为与移植了Java运行时系统2130的所有操作系统提供了单个公共的API,所述在Java运行时系统顶层运行的程序以独立于平台的方式运行,不必考虑主平台的操作系统或硬件配置。Java运行时系统2130作为JavaTM软件开发套件的一部分提供,而JavaTM软件开发套件可以向加州Mountain View市的太阳微系统公司购买。
JVM 2150也促进了平台独立。JVM 2150象抽象计算机那样工作,它按字节代码的形式接收来自各程序的指令,并且通过动态地将字节代码转换成诸如目标代码等执行形式来解释这些字节代码,然后执行。RMI 2140通过允许在一个计算机或装置上执行的对象调用另一个计算机或装置上某对象的方法,来方便远程方法调用。RMI可以位于JVM内,并且RMI和JVM两者都作为Java软件开发套件的一部分提供。
查询服务2110定义了一特定Djinn可以使用的服务。也就是说,可以存在不止一个Djinn,因此例示的分布式系统1000内有不止一个查询服务。对于Djinn内的每个服务,查询服务2110包括一个对象,并且每个对象包括各种便于访问相应服务的方法。查询服务2110及其访问在共同待批的美国专利申请第09/044,826号中有更详细的描述,该专利申请的名称为“便于访问查找服务的方法和系统”,先前已通过引用包括在本申请中。
在称作引导和加入或者发现的过程中,发现服务器2120检测何时将新的装置加到例示的分布式系统1000中,并且当检测新的装置时,发现服务器将一个查询服务2110的引用传送给新的装置,从而新装置可以向查询服务登记其服务,并且变成Djinn的一员。在登记后,新装置变成Djinn的一员,并且它可以访问查询服务2110中包含的所有服务。引导和参加的过程在共同待批的美国专利申请第09/044,939号中有更详细的描述,该专利申请的发明名称为“在分布式系统中用于提供为与一个装置通信而使用的可下载代码的设备和方法”,先前已通过引用包括在此。
Java空间2210是例示分布式系统1000内各程序使用的一个对象资源库,用于存储对象。诸程序使用Java空间2210持久地存储对象,并且使这些对象可以被例示分布式系统内的其它装置访问。Java空间在共同待批的美国专利申请第08/971,529号中有更详细的描述。该专利申请的发明名称为“使用多形态入口和入口匹配的数据库系统”,已转让给共同的受让人,其申请日为1997年11月17日,其内容通过引用包括在此。本领域的熟练技术人员应该理解,例示的分布式系统1000可以包含许多查询服务、发现服务器和Java空间。
功能概述提供了一种安全性强制机制,它允许对线程的访问许可根据目前正在执行的代码的源和执行者随时间而变化。代码源表示代码来自一个信任源还是一个不信任源。执行者表示名义上执行代码的委托方。例如,执行者可以是名义上在客户机计算机上操作过程或程序的一个特定用户,或者一个特定组织。
当正在执行一个来自信任源的例程时,一般允许执行该例程的线程可以更多地访问资源。同样,信任执行者可以更多地访问资源。
当一个例程调用另一个例程时,执行这些例程的线程与这两个例程共用的许可相关。因此,将线程的访问等级限制成小于或等于允许任何一个例程的访问等级。
本机制允许某些例程有“特权”。当确定线程是否能够执行一个动作时,只检查与特权例程以及在线程之调用层次中位于该特权例程以上的例程相关的许可。
根据符合本发明的一个实施例,这里描述的安全性机制用许可对象和保护域对象来存储用于模拟系统安全性策略的信息。后文将更详细地描述这些对象的特性和使用,以及用于动态确定线程之时变访问特权的技术。
信任源和不信任源图3示出了计算机1100(图2)中执行的代码流3100。代码流3100由诸如JVM 2150等代码执行单元3200执行,并且源于零个或多个不信任流3300,或者零个或多个信任源3400。不信任源3300和信任源3400可以是文件服务器,包括与互联网相连的文件服务器,或者其它类似的设备。不信任源一般不受计算机1100之操作人员的直接控制。这里将来自不信任源的代码称为不信任代码。
由于不信任代码被认为会给安全性带来较大的风险,所以通常将不信任代码可以访问的计算机资源组限制成那些不会威胁安全性的资源。来自信任源的代码通常是信任开发者开发的代码。信任代码被认为是可靠的,并且对安全性的威胁大大小于不信任代码。
这里,将通过网络从远程源装入的并且立即执行的软件代码称为远程代码。一般,远程源是一个分立组织或个人的计算机系统。远程源通常与互联网相联。
不信任代码通常是远程代码。但是,来自计算机1100本地源的代码会给安全性带来较大的风险。可以将来自这类本地源的代码视为不信任源的不信任代码。同样,可以认为来自一特定远程源的代码是可靠的,并且风险相对较小,因此可以将其视为来自信任源的信任代码。
根据符合本发明的一个实施例,用一种安全机制来实现以下安全性策略,即允许信任代码比不信任代码可以访问更多的资源,即使信任代码和不信任代码由同一委托方执行。一种安全性策略确定代码执行单元3200将允许代码流3100中的代码完成哪个动作。许可和保护域的使用通过允许相对较复杂的许可分组和关系,而允许策略超越简单的信任/不信任的二分法策略。
参照图4将更详细地描述可以与分类许可结合使用的保护域和策略。
信任执行者和不信任执行者在名义上操作计算程序的用户或组织(或者在某些情况下,该程序本身)被称为“执行者”(即,在名义上将访问资源的委托方)。例如,计算机1200上的程序执行者(“客户机执行者”)可以不同于计算机1100上的程序执行者(“服务器执行者”)。
代码执行单元3200以客户机执行者的名义通过RMI 2140(图2)接收请求。作为响应,代码执行单元3200执行线程之类的操作,以便处理请求。线程负责获得合适的代码和或资源,以满足请求,并且一般将允许线程以服务器执行者和客户机执行者中任何一个或两者的名义进行操作。
代码执行单元3200允许授权的执行者或“信任执行者”更多地访问计算机资源,因为信任执行者不会给安全性带来很大的风险。信任执行者可以包括系统操作人员,它们需要更多地访问计算机资源,以便处理系统更新或类似任务。未授权的执行者或者“不信任执行者”用不同方式对待。不信任执行者被认为会给安全性带来较大的风险,因此它们只能有限地访问计算机资源。
根据符合本发明的一个实施例,用一种安全性机制来实现以下安全性策略,即允许信任执行者比不信任执行者能够访问更多资源,即使信任和不信任执行者请求来自单一源的代码。一种安全性策略确定了代码执行单元3200将允许哪些动作。许可和保护域的使用通过允许相对较复杂的许可分组和关系,而允许策略超越简单的信任/不信任的二分法策略。
现在,参照图4将更详细地描述可以与分类许可结合使用的保护域和策略。
安全性机制举例图4例示了用于说明保护域之使用的安全性机制。例示的安全性机制包括策略文件4100、策略对象4200、域映射器对象4300,和一个或多个保护域对象4400。用代码执行单元3200实现安全性机制(图3)。
代码执行单元3200执行其从代码流3100(图3)接收到的代码。为了便于说明,假设来自代码流3100的代码是面向对象的软件。结果,代码是方法的形式,而所述方法与属于类的对象相关。响应于代码执行单元3200执行的代码所体现的指令,代码执行单元3200建立一个或多个对象4500。一个对象是一个数据结构,该数据结构所含的数据与使用该数据的过程或功能相结合。所有对象属于一个类,诸如类4600。属于一类的每个对象有相同的字段(“属性”)和相同的方法。方法是用来操作对象的过程、功能或例程。对象被称为对象所属的类的一个“实例”。
一个或多个类定义包含在来自代码流3100的代码中。属于一类的对象的字段和方法由类定义来限定。代码执行单元3200用这些类定义来创建对象,这些对象是由类定义定义的类的实例。
这些类定义由编程人员编写的源代码生成。例如,使用Java开发套件的编程人员将符合Java编程语言的源代码输入源文件。源代码体现了类定义和用来生成字节代码的其它指令,其中所述字节代码用于控制代码执行单元3200的执行。用于定义类并且生成由代码执行单元执行的代码的技术(诸如Java虚拟机)是本领域技术人员熟知的。
由来自代码流3100的类定义所定义的每个类都与类名4620和代码标识符4640相关。代码执行单元3200在类4600与其类名4620和代码标识符4640之间保持一种联系。代码标识符4640表示代码的源。
“代码源”是表示从哪里接收到计算机指令的实体。代码源的例子包括文件或永久对象,它存储在通过网络连接的数据服务器上;快闪EPROM阅读器,它读取存储在快闪EPROM上的指令;或系统库集。
在符合本发明的一个实施例中,代码标识符4640是一个包含统一资源定位器(“URL”)4642和一组公共加密密钥4644的组合记录。URL标识一个特定的源。URL 4642是一个串,用来唯一标识与互联网相连的任何服务器。URL4642还可以用来指示计算机1100的本地源。一般来说,URL 4642包括文件指示以及文件目录,其中文件目录是服务器正提供的代码流的源。
这里,将公共加密密钥称为“密钥”,它用来使数字签名生效,其中数字签名可以包含在用来传输相关代码和数据的文件中。Schneier在1996年所著的“应用加密学”更详细地描述了公共加密密钥和数字签名。密钥4644可以包含在文件中,包含在使密钥与源相关的数据库中(例如URL),或者可以用其它技术访问。
可以使一个类与包含在文件中的签字签名相关,而这里所述的文件是用来传输定义该类的代码的,或者可以将类的类定义与一数字签名具体关联。与一个有效数字签名相关的类称为被签名。有效数字签名是可以用存储在数据库中的已知密钥验证的数字签名。如果一个类与一个不能被验证的数字签名相关,或者该类与任何数字签名无关,那么该类称为未签名。未签名的类可以与一个缺省密钥相关。一个密钥可以与一个名称相关,而所述名称可以用来在数据库在查找所述密钥。
尽管将一个代码标识符格式描述成包括表示源的数据(即,加密密钥和URL),但也可以使用其它格式。可以用表示代码源的其它信息或其组合来表示代码标识符。
执行者标识符4700表示代码的执行者。“代码的执行者”是在名义上执行该代码的委托方(例如,用户或组织)。执行者的例子可以包括例如“约翰T.施密斯”等个人,或者诸如“太阳微系统股份有限公司”等组织。因此,“执行者标识符”是代表执行者的标识符形式。执行者标识符的可能例子包括串名、计算系统登录名和雇员编号。当服务器通过RMI接收到来自一客户机的请求时,该服务器可以要求将客户机执行者的授权作为正在以客户机执行者的名义执行客户机程序的证据。
保护域和许可根据符合本发明的一个实施例,保护域用来加强计算机系统内的安全性。当以执行者的名义正在执行来自一个或多个源的代码时,保护域可以看作是一组授予一个或多个执行者的许可。许可是计算机系统作出的授权,它允许委托方执行一特定的动作或功能。一般地说,许可包括同意用一种特定的方法访问计算机资源。授权的一个例子是同意将一特定目录“写”在文件系统(例如,/home)中。
在计算机系统中可以用许多方式来表示许可。例如,包含文本指令的数据结构可以表示许可。诸如“许可执行者写/somedirectory/somefile”等指令表示允许以委托方“执行者”的名义对“/somedirectory”目录中的“somefile”文件进行写操作。该指令表示同意哪个特定的动作,允许执行该动作的执行者,以及同意在其上执行该特定动作的计算机资源。在该例中,被授权的特定动作将以委托方“执行者”的名义进行“写”。同意在其上执行特定动作的计算机资源是计算机1100之文件系统中的一个文件“/somedirectory/somefile”。在本例中,用本领域熟练技术人员已知的传统形式表达了该文件以及包含该文件的目录。
许可还可以用对象表示,这里称为许可对象。对象的属性表示一特定许可。例如,一个对象可以包括“写”的动作属性和“/somedirectory”的目标资源属性。许可对象可以具有一个或多个许可验证法,这些方法用来确定由该许可对象表示的特定许可是否授权被请求的许可。
策略许可、执行者和代码源之间的关联构成了系统的安全性策略。系统的策略可以用一个或多个包含指令的文件来表示。每个指令在一特定的访问标识符和一特定的授权许可之间建立一种映射。访问标识符由一个执行者标识符和一个代码标识符组成。当以指令中访问标识符的执行标识符所规定的执行者的名义操作对象时,指令中规定的许可适用于所有属于下述类的对象,其中所述类与指令中访问标识符所规定的代码标识符相关。
图5例示了通过使用策略文件4100(图4)而实现的策略。例示策略文件4100中的指令格式是<“permission”><executor><URL><key name><action><target><executor>标识代码的执行者;<URL>与对应于<key name>的密钥的结合构成一代码源;而<action>和<target>表示一许可。密钥与密钥名相关。密钥和对应的密钥名一起存储在一个密钥数据库中。密钥名可用来寻找密钥数据库的密钥。例如,考虑以下指令permission executorl file//somesource somekey write/tmp/*上述指令表示授权对“executorl”执行者的许可,许可其用一对象在“/tmp/*”中写任何文件,而所述对象属于与“file//somesource”-“somekey”(即,URL-密钥名)代码源相关的类。
隐含许可一个许可不必正好与另一个许可匹配,才能认为其被另一个许可所“包含”。当第一许可包含第二许可,但不与第二许可匹配时,称第一许可为“隐含”了第二许可。例如,一个要在诸如“c/,”目录中写任何文件的许可隐含了一个要在诸如“c/thisfile.”的目录中写任何具体文件的许可。作为另一个例子,一个准许“太阳微系统股份有限公司的所有在职雇员”读取“d/log”文件的许可隐含着一个准许“同一组织中某个具体雇员”读取“d/log”文件的许可。
如果用许可对象表示许可,那么该许可对象的验证法包含了用于确定一个许可是否被另一个隐含的代码。例如,一个要将文件写入目录中的许可隐含了一个要将特定文件写入该目录的许可,并且一个要从目录中读取文件的许可隐含了要从该目录中读取特定文件的许可。但是,写许可不隐含读许可。
策略实施对象可以用各种对象将访问标识符表示的策略实现成策略文件4100中包含的许可映射。根据图4所示的实施情况,为了有效地且方便地实施策略,提供了策略对象4200、域映射器对象4300、一个或多个保护域对象4400,以及一个或多个访问标识符4800。
策略对象4200是用于存储例如从策略文件4100中获得的策略信息的对象。具体地说,策略对象4200提供了访问标识符到许可的映射,并且策略对象4200是根据策略文件4100内的指令构造的。在策略对象4200内,访问标识符及其相关的授权许可可以用数据结构或对象来表示。
当域映射器对象4300遇到新的访问标识符4800时,根据请求建立保护域对象4400。当接收到一个访问标识符4800时,域映射器对象4300确定保护域对象4400是否已经与该访问标识符4800相关。域映射器对象4300保持这样的数据,它们表示哪些保护域对象已经建立以及与这些保护域对象相关的访问标识符。如果一个保护域对象已经与访问标识符相关,那么域映射器对象4300将访问标识符和保护域对象的映射加到由域映射器对象4300保持的访问标识符和保护域对象的映射中。
如果一个保护域对象与访问标识符无关,那么建立一个新的保护域对象,并且将其与许可填充(populate)。根据策略对象4200中访问标识符与许可的映射关系,将保护域对象与映射到该访问标识符的那些许可填充。最后,如前所述,域映射器对象4300将该访问标识符与保护域对象的映射关系加到访问标识符与保护域对象的映射中。
在符合本发明的其它实施例中,不把访问标识符与保护域对象的映射存储在域映射器对象中,而是将映射作为静态字段存储在保护域类中。保护域类是保护域对象4400所属的类。无论有多少对象属于一个类,该类只有一个静态字段的实例。表示保护域对象已经建立以及与该保护域对象相关的访问标识符的数据存储在保护域类的静态字段中。
静态方法用来访问和更新上述静态数据。用整个类的名义调用静态方法,并且无需参照具体的对象就可以调用静态方法。
调用堆栈举例用上述许可对象、保护域对象和策略对象来确定线程的访问权。根据符合本发明的一个实施例,这类访问权根据线程目前正在执行哪个代码以及正在以哪个执行者的名义执行线程,而随时间变化。导致执行线程目前正在执行之代码的调用顺序反映在线程的调用堆栈中。应该参照例示的调用堆栈说明对安全性机制的操作过程,这种安全性机制以允许访问权随时间变化的方式加强了访问权。
图6是一方框图,它包括与线程6200相关的调用堆栈6100,在线程6200中,对象4500-1的方法6300调用另一对象4500-2的方法6300-2,方法6300-2调用又一对象4500-3的方法6300-3,方法6300-3再调用访问控制器对象6500的检查许可方法6400。
线程6200是在计算机1100上执行的线程。调用堆栈6100是一堆栈数据结构,它表示在任何给定实例下线程6200调用的方法的调用层次。在图6所示的实例下,调用堆栈6100为线程6200执行的但还没有结束的每个方法都包含一个帧(例如帧6100-1)。
每帧对应于已被线程6200调用但还没有结束的方法。各帧在调用堆栈6100上的相对位置反映了与帧对应的方法的调用次序。当一个方法结束时,从调用堆栈6100的顶层除去对应于该方法的帧。当调用一个方法时,对应于该方法的帧加到调用堆栈6100的顶层上。
每帧都包含有关方法以及对应该帧的对象的信息。根据该信息,通过调用由代码执行单元3200为每个对象提供的“获得类”方法,可以确定该方法的类。然后,根据代码执行单元3200保持的联系,确定此类的代码标识符。每帧还包含在名义上执行线程的执行者的执行者标识符(例如,执行者标识符4700-1)。然后,将执行者标识符和代码标识符组成一个访问标识符(例如,访问标识符4800-1)。根据域映射器对象4300中的映射,可以确定与给定帧的访问标识符相关的保护域对象。
例如,假设线程6200调用方法6300-1。当执行方法6300-1时,线程6200调用方法6300-2。当执行方法6300-2时,线程6200调用方法6300-3。当执行方法6300-3时,线程6200调用方法6400。这里,如图6所示,调用堆栈6100表示方法的调用的层次。帧6100-4对应于方法6400,帧6100-3对应于方法6300-3,帧6100-2对应于方法6300-2,帧6100-1对应于方法6300-1。当线程6200结束方法6400时,从调用堆栈6100中去除帧6100-4。
方法/许可关系调用堆栈6100上的每个帧与一组许可相关。对于一给定的帧,其许可组由保护域对象确定,而保护域对象与针对给定方法的代码的源以及在名义上执行代码的委托方相关。现在继续参照图6,描述帧、保护域和许可之间的关系。
保护域对象4400-1从访问标识符4800-1映射,其中访问标识符4800-1由执行者标识符4700-1和对象4500-1的类的代码标识符组成。对象4500-1的方法6300-1以执行者标识符4700-2的名义调用对象4500-2的方法6300-2。保护域对象4400-2从访问标识符4800-2映射,其中访问标识符4800-2由执行者标识符4700-2和对象4500-2的类的代码标识符组成。对象4500-2的方法6300-2以执行者标识符4700-3的名义调用对象4500-3的方法6300-3。保护域对象4400-3从访问标识符4800-3映射,其中访问标识符4800-3由执行者标识符4700-3和对象4500-3的类的代码标识符组成。
当用保护域对象组织和确定特定执行者和代码源的访问权时,必须提供一些机制用以确定线程的访问权,其中线程具有一调用堆栈,调用堆栈具有多个方法,而方法的代码来自多个源,或者方法的代码被请求以多个委托方的名义执行。根据符合本发明的一个实施例,如下文将更详细描述的,该确定由访问控制器对象完成。
访问控制器举例根据符合本发明的一个实施例,用访问控制器对象确定某个线程是否可以执行一特定的动作。具体地说,在资源管理对象访问一资源之前,资源管理对象(例如,对象6300-3)调用访问控制器对象6500的检查许可方法6400。
在说明的例子中,资源管理方法6300-3调用访问控制器对象6500的检查许可方法6400,以便确定是否授权访问该资源。为了做出该决定,访问控制器对象6500的检查许可方法6400执行参照图7所述的步骤。
确定是否授权一个动作根据符合本发明的一个实施例,如果在发出一个授权请求时与线程相关的每个保护域对象中都包含执行一动作所需的许可,那么同意执行该动作。如果在与一保护域对象相关的一个或多个许可中包含了某个许可,那么称该许可包含在所述保护域对象中。例如,如果某个动作要求许可以“Bob”委托方的名义对“e/tmp”目录中的文件进行写操作,那么如果保护域对象4400-1明显包含或隐含该许可,那么该被要求的许可将包含在保护域对象4400-1中。
假设当线程6200通过调用检查许可方法6400请求确定是否同意执行一动作时,线程6200正在执行6300-3。再假设线程6200已调用了方法6300-1、方法6300-2和方法6300-3,并且当线程6200调用方法6400时这些方法还没有结束。当请求确定授权时与线程6200相关的保护域对象由保护域对象4400-1、4400-2和4400-3表示。
对于本例中所给的调用层次,如果保护域对象4400-1中包含的唯一许可是“写入e/tmp”,那么不会将下述所需许可授权给线程6200,其中所述所需许可是执行以下动作,即以“Bob”的名义对文件“d/sys/pwd”进行写操作。不授权的理由是,保护域对象4400-1中包含任何许可不包括所需求的许可。
特权方法有时需要同意执行下述动作,即执行一个方法,但不考虑与线程之调用层次中位于该方法之前的诸方法相关的保护域对象。更新口令是这种需要的一个例子。
具体地说,由于口令文件的安全性要求是严格的,所以将更新口令文件所需的许可局限于非常少的专用保护域对象。一般地说,这类保护域对象与来自信任代码和信任执行者的对象的方法相关,其中信任执行者提供其自身的安全性机制。例如,用于更新口令的方法可以在为用户更新新口令之前向该用户要求旧的口令。方法还要求在名义上请求更新的委托人的授权,并且只对授权的委托方准许更新口令。
由于将更新口令的许可局限于来自特定源的代码和以特定授权委托方执行的代码,所以不允许来自其它源或委托方的代码更新口令。即使在诸如图6所示的情况下,来自一远程源(方法6300-1)代码试图通过调用具有更新口令之许可的信任代码(方法6300-3)来改变口令,也是这样。在该情况下拒绝方法的理由是,调用层次中至少有一个方法(方法6300-1)不具备必要的许可。
根据符合本发明的一个实施例,提供了一种特权机制,用以允许本身不具有许可的方法执行动作,通过调用具有许可的特殊“特权”方法执行这些动作。通过把被认为与“线程相关”保护域对象局限于与“特权”方法和调用层次中在该特权方法之后的诸方法相关的保护域对象,可以获得上述结果。
通过调用例如称为beginPrivilege的特权对象的一个方法,方法可以使其本身获得特权(即,允许特权机制)。通过调用例如称为endPrivilege的特权对象的另一个方法,方法可以使其本身失去特权(即,禁止特权机制)。以下代码举例说明一项技术,该技术用于调用方法允许或禁止特权机制。尽管代码示例可以象太阳微系统股份有限公司的Java编程语言,但该例只是说明性的,不代表实际的代码实施。
<pre listing-type="program-listing"><![CDATA[Privileged p=new Privileged();p.beginPrivilege();try{[sensitive code]} finally{ p.endPrivilege();}]]></pre>
代码示例的第一行建立一特权对象。第二行调用允许特权机制的特权对象的beginPrivilege方法。“try finally”语句确保在执行“finally”之后的代码块时不考虑执行“try”和“finally”之间块期间所发生的事。因此,总是调用特权对象(“p.endPrivilege()”)的特权禁止方法。
例如,可以使用上述代码限制方法6300-3中实际访问口令文件的部分。访问口令文件的部分将包含在用“[sensitive code]”表示的块中。由上述代码示例说明的技术明确地将特权机制允许和禁止的责任交给了编程人员。
通常,当执行一特权方法时,线程可以调用与不包括特权保护域对象中所包含许可的其它保护域对象相关的后续方法。当线程正在执行一后续方法时,如果所要求的许可包含在与该后续方法和调用层次中位于该后续方法特权方法之间的任何方法相关的保护域对象中时,只同意由该线程请求的动作。用这种方式限制特权机制的好处是,当特权方法调用不信任代码和不信任执行者的方法时,可以防止不信任代码和不信任执行者的方法有效地“借用”与信任代码和信任执行者的特权方法相关的许可。
在符合本发明的另一个实施例中,方法通过调用访问控制器类的静态方法使其本身具备特权或不具备特权。该访问控制器类是访问控制器对象所属的类。如以下代码示例所证明的,使用与访问控制器类相关的静态方法避免了必须建立一特权对象来允许特权机制。
以下代码示例说明了一项技术,该技术调用允许或禁止特权机制的方法。为了便于说明,假设访问控制器类的名称是AccessControl。尽管代码示例可以象太阳微系统股份有限公司的Java编程语言,但该例只是说明性的,不代表实际的代码实施。
<pre listing-type="program-listing"><![CDATA[AccessControl.beginPrivilege();try{ [sensitive code]} finally{ AccessControl. endPrivilege();}]]></pre>允许调用线程可以在调用层次的不同层面上调用同一方法。例如,方法X可以调用方法Y,方法Y可以调用方法X。结果,可以二次调用作为特权方法被调用的方法,诸如6300-2,但在第二次调用时不允许特权机制。为了在使特权机制工作时适当地确定与线程相关的保护域对象,提供一种机制,用以跟踪特权方法的哪一次调用允许特权机制。将线程允许特权机制的调用称为“允许调用”。
用于跟踪特定方法的哪次调用是允许调用的一项技术是,在对应于每个允许调用的帧中设置一标志。其实现方法是,当在执行一方法期间调用每个特权允许对象的特权允许方法时,在对应于每个允许调用的帧中设置特权标志6150。
根据符合本发明的一个实施例,每个帧都有一个特权标志值。当把任何帧加入调用堆栈6100时,特权标志的初始值表示相应的方法没有被特权。当相应方法具有特权时,任何帧的特权标志只设置为表示相应方法被特权的值。
在允许特权机制的某个方法结束之后,特权标志6150的值不会转移方法的下一次调用。标志值不会转移的原因是,当把对应于该方法的新帧加入调用堆栈6100时,将特权标志的初始值设置成表示相应方法没有特权。当特权方法结束,用这种方法保持特权标志的值可以禁止特权机制,不必考虑编程人员是否明确地禁止特权机制。
图7是一流程图,示出了图6中检查许可方法6400所执行的处理。参照图6,假设线程6200调用方法6300-1。在执行方法6300-1期间,线程6200调用方法6300-2,然后是方法6300-3。再假设方法6300-2被特权。
在步骤7100,当资源管理对象接收到一个访问对象的请求时,调用检查许可方法6400确定是否同意执行被请求的动作。在图6,方法6300-3通过调用访问控制器对象6500的检查许可方法6400,并且把执行动作所需的许可作为参照传给它,来请求访问一对象。
步骤7200-7500定义了一个循环,在该循环中,检查与调用堆栈中诸帧相关的许可。循环继续,直至遇到一特权方法,或者检查完调用堆栈中的所有帧。为了便于说明,将当前正被检查特权的帧称为“选定帧”,并将与该帧相关的方法称为“选定方法”。
在步骤7200,就与选定帧相关的许可中是否有一个包含所要求的许可作出判断。与一帧相关的许可是与该帧相关的保护域对象的许可。如果步骤7200的判定是与选定帧相关的许可包含了所需要的许可,那么控制行至步骤7300。
在循环的第一次迭代期间,检查紧挨在与访问控制器对象之检查许可方法相关的帧之前的那个帧。在本例中,与检查许可方法6400相关的帧是帧6100-4。紧挨在帧6100-4之前的帧是帧6100-3。结果,在循环的第一次迭代期间,将检查帧6100-3。帧6100-3与保护域对象4400-3相关。如果与保护域对象4400-3相关的许可包括所需要的许可,那么控制行至步骤7300。
在步骤7300中,就选定方法的调用是否表示允许调用做出判断。该判断基于与选定方法相对应的帧的特权标志。如果判定选定方法的调用不代表允许调用,那么控制行至步骤7400。在本例中,帧6100-3的特权状态没有被设置成指示帧表示允许调用。因此,控制行至步骤7400。
在步骤7400中,选择下一个帧。根据调用堆栈6100表示的调用层次,下一帧是当前帧下面的帧。在本例中,当前帧6100-3下面的帧是帧6100-2。对应于帧6100-2的方法是方法6300-2。
在步骤7500中,就是否在步骤7400中选定了一个帧作出判断。如果选中了一个帧,那么控制返回步骤7200。在本例中,由于选中了帧6100-2,所以控制行至步骤7200。在步骤7200中,所做的判定是,与帧6100-2相关的保护域对象(保护域对象4400-2)包括一个包含所需许可的许可,因为在本例中,与保护域对象4400-2相关的许可明显包含所需的许可。然后,控制行至步骤7300。
在步骤7300中,所做的判定是,选定方法的调用表示允许调用,因为特权标志6150表示与帧6100-2对应的调用是允许调用。发送一消息,表示许可请求是有效的。然后,许可检查结束。
当选定方法表示允许调用时在步骤7300结束许可检查,因此对被请求动作的授权基于有特权的保护域对象以及与允许调用后所调用的方法相关的任何保护域对象。
现在,假设在本例中永远不调用特权机制。因此,在步骤7300中,所做的判定是,对选定方法的调用不代表允许调用,因为特权标志6150表示与帧6100-2对应的调用不是允许调用。
在步骤7400中,因为当前帧6100-2下面的帧是帧6100-1,所以被选中的下一帧是帧6100-1,并且与帧6100-1相对应的方法是方法6300-1。在步骤7500中,所做的判定是,在步骤7400选定了下一帧。因此,控制再次返回步骤7200。
在步骤7200中,所做的判定是,与帧6100-1相关的保护域对象(保护域对象4400-1)不包括所需的许可,因为在本例中,与保护域对象4400-1相关的许可中没有一个包含所需的许可。于是,控制行至步骤7600。
在步骤7600中,发送一消息,表示不同意执行被请求的动作。在符合本发明的一个实施例中,通过抛出一个异常错误来发送该消息。
当至少有一个与线程相关的保护域对象不包括含所需许可的许可时,不同意执行被请求的动作。只有当请求判断是否同意执行一动作时与线程相关的所有保护域对象都包括所需的许可的情况下,才同意执行该动作。
在符合本发明的一个实施例中,当一线程(“母线程”)产生另一线程的卵(“子线程”)时,与母线程相关的保护域对象被子线程“继承”。例如,当产生子线程时,通过保留母线程的调用堆栈,可以继承保护域对象。当执行图7所示的步骤,以便判断是否同意执行一动作时,将转移的调用堆栈视作好象它包括母线程的调用堆栈。
在符合本发明的另一实施例中,子线程不继承母线程的保护域对象。在本例中,将转移的调用堆栈视作好象它不包括母线程的调用堆栈。
根据与线程相关的保护域对象来决定是否同意该线程执行一动作的一个好处是,许可可以基于线程正在执行的代码的源,以及在名义上执行代码的委托方。
如前所述,对象是用代码执行单元3200接收到的代码从类定义建立的。线程正在执行的代码源是方法的代码源。方法的代码源是用来定义该方法之对象所属的类的类定义的源。代码的执行者是在名义上正在执行代码的委托方。这可以包括在客户机系统上操作的过程或程序的执行者。
如前所述,由于保护域对象与方法的代码源或代码执行者相关,所以授权给线程的许可可以基于被线程调用的每个方法的代码源或代码执行者。因此,经组织,来自特定源的代码或者以特定委托方的名义所执行的代码可以与适合安全性目的的许可相关。
上述特权机制的一个优点是,在敏感操作的性能中,安全性是关键的,它可以被限制成来自信任源的方法以及以信任执行者的名义执行的方法。另外,可以以基于较小保密代码的方法的名义完成这些操作。完成敏感操作的方法一般依赖于其自身的安全性机制(例如,口令授权方法)。当一线程调用特权机制时,将一般会给安全性带来较大风险的特权域的许可范围限制为允许调用。这可以防止了特权方法内调用的方法(诸如根据不信任代码或不信任执行者的方法)获得能力执行会给安全性带来较大风险的操作。
尽管以上描述了一种用于跟踪哪个调用是允许调用的方法,但其它各种用于跟踪允许调用的方法也是可行的。因此,应该理解,本发明不限于用于跟踪允许调用的任何特定方法。
结论符合本发明原理的系统和方法提供了一种加强安全性和机制,在该机制中,线程的访问许可根据正在执行的代码的源和执行者随时间而变化。
以上对本发明实施例的描述提供了说明和描述,但不打算穷举或限制本发明于所揭示的明确形式。根据上述原理可以进行各种变化和改变,或者可以通过发明实践来获得这些变化和改变。本发明的范围由权利要求书及其等效物来限制。
尽管将符合本发明的系统和方法描述成在例示的分布式系统和Java编程环境下工作,但本领域的熟练技术人员应该理解,本发明可以在其它系统和其它编程环境中实行。另外,尽管将本发明的一些方面(aspect)描述成存储在存储器中,但本领域的熟练技术人员应该理解,这些方面还可以存储在其它类型的计算机可读的媒体上,或者从其它类型的计算机可读媒体中读出。其它类型的计算机可读媒体例如可以是辅助存储装置,如硬盘、软件或CD-ROM;来自互联网的载波;或者其它形式的RAM或ROM。Sun,Sun Microsystems,Sun logo,Java和基于Java的商标是太阳微系统股份有限公司在美国和其它国家的商标或注册商标。
权利要求
1.一种资源访问调节系统,其中所述资源是计算机上执行的一个操作所请求的,所述操作在执行期间调用对代码进行操作的多个功能,其特征在于,所述系统包括策略文件,用于存储对每个功能的许可,所述许可根据代码的源和代码的执行者对资源的访问类型进行授权;调用堆栈,它按所述操作调用的次序,将功能和执行者作为帧来存储;和执行装置,当调用堆栈上所有功能和执行者的许可所授权的访问类型包括所述操作所请求的访问时,所述执行装置同意访问所述资源。
2.如权利要求1所述的系统,其特征在于,每个帧都包括代码标识符,用于为功能中的一个对应功能标识代码的源;和执行者标识符,用于标识在名义上正在执行代码的执行者。
3.如权利要求2所述的系统,其特征在于,所述策略文件包括多个保护域对象,它们与调用堆栈中的每个帧相对应,并且通过映射代码标识符和执行者标识符,为每个功能设置访问许可。
4.如权利要求1所述的系统,其特征在于,所述执行装置包括一访问控制器,该访问控制器用于确定是否授权所述操作,以便对所述资源执行被请求的访问类型,所述访问控制器包括用于判断与调用堆栈上每个帧相关的许可是否包含被请求的方法类型的装置;用于当许可中有些许可不包含被请求访问类型时拒绝被请求访问的装置;和用于当所有许可都包含被请求的访问类型时同意访问所述资源的装置。
5.如权利要求1所述的系统,其特征在于,每个帧都包括一特权标志,该标志表示对应的功能是否是有特权的功能。
6.如权利要求5所述的系统,其特征在于,所述执行装置包括一访问控制器,该访问控制器用于确定是否授权所述操作,以便对所述资源执行被请求的访问类型,所述访问控制器包括用于判定诸帧中有一个具有一设定特权标志的装置;用于判断与调用堆栈上具有所述设定特权标志的帧之后的每个帧相关的许可是否包含被请求的方法类型的装置;用于当许可中有些许可不包含被请求访问类型时拒绝被请求访问的装置;和用于当所有许可都包含被请求的访问类型时同意访问所述资源的装置。
7.一种资源访问调节方法,其中所述资源是计算机上执行的一个操作所请求的,所述操作在执行期间调用对代码进行操作的多个功能,其特征在于,所述方法包括以下步骤存储对每个功能的许可,所述许可根据代码的源和代码的执行者对资源的访问类型进行授权;按所述操作调用的次序,将功能和执行者作为调用堆栈中的帧存储起来;和判断调用堆栈上每个功能和执行者的许可所授权的访问类型是否包含所述操作所请求的访问;以及当调用堆栈上所有功能和执行者的许可所授权的访问类型都包含所述操作所请求的访问时,同意访问所述资源。
8.如权利要求7所述的方法,其特征在于,每个帧都包括一特权标志,该标志表示对应的功能是否是有特权的功能,所述判断步骤包括以下子步骤发现诸帧中有一个具有一设定的特权标志;以及确定与调用堆栈上具有所述设定特权标志的帧之后的每个帧相关的许可是否包含被请求的访问类型。
9.如权利要求8所述的方法,其特征在于,所述同意步骤包括以下子步骤当许可中有些许可不包含被请求访问类型时,拒绝被请求访问;以及当所有许可都包含被请求的访问类型时,同意访问所述资源。
10.一种资源访问调节系统,其中所述资源是计算机上执行的一个操作所请求的,所述操作在执行期间调用对代码进行操作的多个功能,其特征在于,所述系统包括用于存储对每个功能的许可的装置,其中所述许可根据代码的源和代码的执行者对资源的访问类型进行授权;用于按所述操作调用的次序,将功能和执行者作为调用堆栈中的帧来存储的装置;和用于判断调用堆栈上所有功能和执行者的许可所授权的访问类型是否包括所述操作所请求的访问的装置;以及用于当调用堆栈上所述功能和执行者的许可所授权的访问类型都包含所述操作所请求的访问时同意访问所述资源的装置。
11.如权利要求10所述的系统,其特征在于,每个帧都包括一特权标志,该标志表示对应的功能是否是有特权的功能,所述判断装置包括用于发现诸帧中有一个具有一设定的特权标志的装置;以及用于确定与调用堆栈上位于具有所述设定特权标志之帧之后的每个帧相关的许可是否包含被请求的访问类型的装置。
12.如权利要求11所述的系统,其特征在于,所述同意装置包括用于当许可中有些许可不包含被请求访问类型时拒绝被请求访问的装置;以及用于当所有许可都包含被请求的访问类型时同意访问所述资源的装置。
13.在一种资源访问调节系统中,所述资源是计算机上执行的一个操作所请求的,所述操作在执行期间调用对代码进行操作的多个功能,所述系统包括策略文件,用于存储对每个功能的许可,所述许可根据代码的源和代码的执行者对资源的访问类型进行授权;调用堆栈,它按所述操作调用的次序,将功能和执行者作为帧来存储;以及执行装置,在所述系统中使用一种对请求访问所述资源进行调节的方法,其特征在于,所述方法包括以下由所述执行装置执行的步骤判断与调用堆栈上每个帧相关的许可是否包含被请求的访问类型;以及当许可中有一些许可不包含被请求的访问类型时,拒绝所述被请求的访问;以及当所有许可都包含被请求的访问类型时,准许访问所述资源。
14.如权利要求13所述的方法,其特征在于,每个帧都包括一特权标志,该标志表示对应的功能是否是有特权的功能,并且所述判断步骤包括以下子步骤发现诸帧中有一个具有一设定的特权标志;以及确定与调用堆栈上位于具有所述设定特权标志的帧之后的每个帧相关的许可是否包含被请求的访问类型。
15.如权利要求14所述的方法,其特征在于,所述拒绝步骤包括以下子步骤当与具有所述设定特权标志之帧以后的诸帧相关的许可中有些许可不包含被请求访问类型时,拒绝被请求的访问;以及所述准许步骤包括以下子步骤当与具有所述设定特权标志之帧以后的诸帧相关的所有许可都包含被请求的访问类型时,同意访问所述资源。
16.一种计算机可读的媒体,该媒体包含用于计算机执行一动作的指令,所述动作是由计算机上执行的程序所请求的,所述程序在执行期间调用对代码进行操作的多个功能,所述计算机包括策略文件,用于存储对每个功能的许可,所述许可根据代码的源和代码的执行者对动作类型进行授权;调用堆栈,它按所述程序调用的次序,将功能和执行者作为帧来存储;以及执行装置,其特征在于,所述指令使所述执行装置执行以下步骤判断与调用堆栈上每个帧相关的许可是否包含被请求的动作类型;以及当许可中有一些许可不包含被请求的动作类型时,拒绝所述被请求的动作;以及当所有许可都包含被请求的动作类型时,执行被请求的动作。
17.如权利要求16所述的计算机可读媒体,其特征在于,每个帧都包括一特权标志,该标志表示对应的功能是否是有特权的功能,并且所述判断步骤包括以下子步骤发现诸帧中有一个具有一设定的特权标志;以及确定与调用堆栈上位于具有所述设定特权标志之帧以后的每个帧相关的许可是否包含被请求的访问类型。
18.如权利要求17所述的计算机可读媒体,其特征在于,所述拒绝步骤包括以下子步骤当与具有所述设定特权标志之帧以后的诸帧相关的许可中有些许可不包含被请求访问类型时,拒绝被请求的访问;以及所述执行步骤包括以下子步骤当与具有所述设定特权标志之帧以后的诸帧相关的所有许可都包含被请求的访问类型时,同意访问所述资源。
19.一种数据处理系统,其特征在于,包括存储器,所述存储器包括程序,该程序在执行期间调用对代码进行操作的多个功能,策略文件,用于存储对每个功能的许可,所述许可根据代码的源和代码的执行者对动作类型进行授权;调用堆栈,它按所述程序调用的次序,将功能和执行者作为帧来存储;以及运行时环境,它接收来自所述程序的对一动作类型的请求,判断与调用堆栈上每个帧相关的许可是否包含被请求的动作类型,并且当调用堆栈上所述功能和执行者的许可所授权的动作类型都包含被请求的动作类型时,同意所述被请求的动作类型;和处理器,它执行所述运行时环境和所述程序。
全文摘要
一种资源访问调节系统,其中资源是由计算机上执行的操作所请求的。所述操作在执行期间调用对代码进行操作的多个方法。所述系统包括策略文件,调用堆栈和执行装置。策略文件用于存储对每个资源的许可。所述许可根据代码的源和代码的执行者对资源的特定访问类型进行授权。调用堆栈按所述操作调用的次序,存储方法和执行者的表示。当调用堆栈上所有方法和执行者的许可所授权的访问类型都包括所述操作所请求的访问时,执行装置同意访问所述资源。
文档编号G06F9/46GK1298512SQ99805489
公开日2001年6月6日 申请日期1999年2月18日 优先权日1998年2月26日
发明者R·谢夫勒, 龚利 申请人:太阳微系统公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1