以文本方式查看主题 - 中文XML论坛 - 专业的XML技术讨论区 (http://bbs.xml.org.cn/index.asp) -- 『 XML安全 』 (http://bbs.xml.org.cn/list.asp?boardid=27) ---- XML 安全: 使用 XACML 控制信息访问 (http://bbs.xml.org.cn/dispbbs.asp?boardid=27&rootid=&id=20077) |
-- 作者:菜籽 -- 发布时间:7/1/2005 10:10:00 PM -- XML 安全: 使用 XACML 控制信息访问 为适当的人提供适当的访问权限和首先拥有信息同样重要(如果不是更重要的话)。可扩展访问控制标记语言(或 XACML)提供了创建策略和规则来控制信息访问的机制。本文中,作者 Manish Verma 将继续关于 XML 问题的讨论,介绍如何在应用程序中集成 XACML。 关于 XML 安全的上一篇文章中,我讨论了安全性断言标记语言(Security Assertion Markup Language,SAML)。本文将讨论可扩展访问控制标记语言,并从上一期留下的问题开始。SAML 提供了进行验证和授权断言以及传递断言的机制,而 XACML 则提供了定义进行必要的授权决策所需规则的语言。 比如,假设这样一个场景:某一主体请求访问目标资源,策略执行点(PEP)在决定将目标资源发布给主体之前,要使用策略决策点(PDP)进行检查。访问目标资源请求的生成,以及后续的允许或拒绝访问响应,都属于 SAML 的范围。XACML 解决了 PEP 与 PDP 之间的策略决策交换问题。 访问控制 XACML 典型的访问控制和授权场景包括三个主要实体:主体、资源和动作以及它们的属性。主体请求得到对资源执行动作的权限。比如,访问请求“允许财务经理在财务服务器上的发票文件夹中创建文件”中,主体是“财务经理”,目标资源是“财务服务器上的发票文件夹”,动作是“创建文件”。 在专有访问控制系统中,这些实体及其属性的信息保存在资料库中。这种资料库称为访问控制链表(ACL)。不同的专有系统有不同的实现 ACL 的机制,因此难以交换和共享信息。 XACML 的目标 创建一种可移植的、标准的方式来描述访问控制实体及其属性。 SAML 标准提供了允许第三方实体请求验证和授权信息的接口。内部如何处理这些授权请求则由 XACML 标准解决。XACML 不但处理授权请求,而且还定义了一种机制,来创建进行授权决策所需的规则、策略和策略集的完整基础设施。我将在 XACML 详解中详细说明这些概念。 既然 SAML 与 XACML 分享同一个领域,那么这两种规范很可能最终会合并成一个规范,希望如此。 XACML 体系结构 图 1. XACML 主要组件 PDP 评估请求中的相关策略和规则后会作出决策。可以应用的策略有多种,PDP 并没有评估所有的策略,而是根据策略目标选择相关的策略进行评估。策略目标包括关于主体、动作和其他环境属性的信息。后面的策略目标创建一节中将说明 PDP 选择评估策略的完整过程。 为了获得策略,PDP 要用到策略访问点(PAP),PAP 编写策略和策略集,供 PDP 使用。PDP 也可以调用策略信息点(PIP)服务检索与主体、资源或者环境有关的属性值。PDP 作出的授权决策被发送到 PEP。PEP 履行义务,并根据 PDP 发送的授权决策允许或拒绝访问。 XACML 详解 要记住,XACML 有三个顶层组件:策略、PEP 和 PDP。为定义的请求创建 XACML 基础设施的过程,也是紧密围绕这三个组件进行的。图 2 说明了这些组件之间的联系: 图 2. 策略语言模型 XACML 策略 现在说明如何创建能够处理该请求的策略,策略的范围应该比请求的范围广。您可以创建一个这样的策略:secf.com 名称空间中有电子邮件名的所有用户都可以对资源 file:///D:/Documents/Administrator/Desktop/Project Plan.html 执行任何操作。注意,策略比请求更具一般性。 规则组合算法 Deny-overrides(拒绝覆盖): 只要有一条规则的评估为 Deny,那么最终授权决策也是 Deny。 策略包括几种子组件:目标、规则、规则组合算法和义务。理解策略就必须理解这些子组件(subcomponent)。现在来看看各种子组件的重要性: 目标(Target):每个策略只有一个目标。该目标有助于确定策略是否与请求有关。策略和请求的相关性决定了是否要为请求评估该策略。这是通过定义目标中的三类属性(主体、资源、动作)及其属性值来实现的。目标中不一定都有这三类属性。将这些属性的值与请求中具有相同属性的值进行比较,如果匹配(对其应用某些函数之后,将会看到它们是否匹配),则认为该策略是相关的,并对其进行评估。 清单 1. 创建策略 // Create policy identifier and policy description // Rule combining algorithm for the Policy URI combiningAlgId = new URI(OrderedPermitOverridesRuleAlg.algId); CombiningAlgFactory factory = CombiningAlgFactory.getInstance(); RuleCombiningAlgorithm combiningAlg = // Create the rules for the policy List ruleList = createRules(); // Create the policy // Display the policy on the std out
清单 1 说明了 policy 的创建过程。真是这样吗?policy 创建的主要部分是子组件的创建。该清单仅仅说明了如何将这些子组件组合成 policy 对象。不过,它确实说明了 policy 的总体结构。策略的组成过程如下: 选择策略的规则组合算法。我使用了 ordered-permit-override 算法,因此将按照策略中规定的顺序评估规则。 策略目标创建 然后将说明如何通过编程来实现这些目标。XACML 提供了一种称为 AttributeDesignator 的机制,用它来比较请求与策略目标中的属性值。 利用 AttributeDesignator,可以通过定义属性名和类型来指定一个属性。此外,还可以指定属性值,也就是在目标中规定与请求中的属性值进行比较的那个值。要进行比较,需要选择一个预置的函数。该函数以及 AttributeDesignator 都可以用来创建 TargetMatch 对象。您可以创建多个 TargetMatch 对象,每个对象对应一个属性。同一类的所有 TargetMatch 对象放在一个列表中,并传递给 Target 对象。这个 Target 对象就是用来创建 Policy 的目标对象。 策略的形式应该如下所示:“允许 secf.com 名称空间中列有电子邮件名的任何用户对资源 file:///D:/Documents/Administrator/Desktop/Project Plan.html 执行任何动作。”对于该策略,可以创建包含两个属性的目标,分别用于主体和资源。不需要为动作创建属性,因为要创建的策略对动作没有任何限制。 清单 2 说明了策略目标的创建。因为要比较请求中主体电子邮件字段的值和目标中规定的字段的值,因此对于主体,可以在目标中指定属性 urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name(电子邮件 ID)。在目标中定义属性类型(urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name)、属性名(urn:oasis:names:tc:xacml:1.0:subject:subject-id)和比较函数(urn:oasis:names:tc:xacml:1.0:function:rfc822Name-match)。 该函数将目标中规定的属性值与请求中具有相同属性的值进行比较。资源类型 http://www.w3.org/2001/XMLSchema#anyURI 的属性也是按照类似的步骤进行比较的。 清单 2. 创建策略目标 public static Target createPolicyTarget() throws URISyntaxException { // Attributes of Subject type List subject = new ArrayList(); URI subjectDesignatorType = StringAttribute subjectValue = new // get an instance of the right function for matching TargetMatch subjectMatch = new TargetMatch( subject.add(subjectMatch); List resource = new ArrayList(); URI resourceDesignatorType = // Match function for the resource-id attribute AttributeDesignator resourceDesignator = AnyURIAttribute resourceValue = // Get an instance of the right function for matching TargetMatch resourceMatch = new TargetMatch( resource.add(resourceMatch); // Put the subject and resource sections into their lists // Create and return the new target. No action type
规则的创建 继续创建处理授权请求(请参阅“XACML 详解”中的第一张图片)所需要的 XACML 组件,现在需要创建适当的规则。创建规则实质上就是创建相应的条件,如清单 3 所示。查看代码,可以看到它完成了以下三项操作: 创建规则目标。 要创建的符合该请求的规则应该是:“如果主体 mverma@secf.com 属于组 owner,并尝试打开资源 file:///D:/Documents/Administrator/Desktop/Project Plan.html,那么允许访问。” 创建这样的规则,首先要创建目标,以便针对将处理的请求评估规则。创建规则目标的方式类似于策略目标的创建方式。然后,将规则的 effect 定义为 Permit。为了让规则返回 effect 的值,关联条件必须返回 True。清单 4 中的代码说明了条件的创建。 清单 3. 创建规则 public static List createRules() throws URISyntaxException { // Step 2: Define the effect of the rule // Step 3: Get the target for the rule // Step 4: Get the condition for the rule // Step 5: Create the rule // Create a list for the rules and add the rule to it List ruleList = new ArrayList(); return ruleList; }
AttributeDesignator 返回值 清单 4 说明了规则条件的创建。与为策略目标创建 AttributeDesignator 的方式基本相同,也需要创建 AttributeDesignator 对象,比较请求中的属性值和条件中规定的值。在这里,我们感兴趣的属性是主体所属的 group。如果要让条件返回 True,那么 group 属性的值必须是 owner。 惟一要补充的是,必须满足以下条件:使用函数从 AttributeDesignator 返回的多个值中提取一个值。该例中使用函数 urn:oasis:names:tc:xacml:1.0:function:string-one-and-only。关于处理 AttributeDesignator 中的多个值的更多信息,请参阅 AttributeDesignator 返回值。 正如从清单 4 中可以看到的,需要创建 AttributeDesignator 对象来定义希望与请求中的值进行比较的属性。比较算法是用来比较属性值的。然后要定义可以从 AttributeDesignator 返回的那些值中选出一个值的函数。最后创建 Apply 对象,它类似于目标中创建的 TargetMatch 对象。Apply 对象的目的是对从袋子(由 AttributeDesignator 返回)中选择的值应用比较函数,将它与条件中规定的值进行比较。 清单 4. 创建规则条件 public static Apply createRuleCondition() throws URISyntaxException { // Define the name and type of the attribute // Pick the function that the condition uses // Choose the function to pick one of the List applyArgs = new ArrayList(); factory = FunctionFactory.getGeneralInstance(); // Create the AttributeDesignator // Create the Apply object and pass it the // Add the new apply element to the list of inputs StringAttribute value = new StringAttribute("owner"); // Finally, create and return the condition
这样,策略创建任务就完成了。我们简单回顾一下策略创建过程。首先,要创建必要的策略子组件:策略目标、规则和规则组合算法。不用为策略创建义务,因为它们是可选的。创建规则实质上意味着创建规则目标和条件,这些都使用它们自己的代码清单作了说明。这里使用的所有的策略子组件都是用来创建策略的。 创建处理授权请求所需 XACML 组件的下一步是创建 PEP。PEP 的作用是什么呢?它为您创建的所有这些 XACML 组件创建授权请求! 策略实施点(PEP) 现在,您已经看到了策略的创建和 PEP 请求的生成,剩下的只有创建 PDP 了。 策略决策点(PDP) 因为 XACML 规范没有规定把策略和请求传递给 PDP 以便评估请求的具体机制,所以可以选择您认为方便的任何机制。该例中,策略和请求是作为命令行参数传递给 PDP。 注意,PDP 仍然基于需要服务的请求类型。它是一种通用组件,接受任何请求和相关的策略集合,并为可用的策略评估请求。清单 6 说明了如何创建 PDP,以及如何用它来评估来自 PEP 的请求。PDP 创建和请求评估的详细过程将在清单 6 后介绍。 清单 6. 创建 PDP public static void main(String[] args) throws Exception { requestFile = args[0]; for (int i = 1; i < args.length; i++) // Step 3: Set up the PolicyFinder that this PDP will use // Step 4: Create the PDP // Get the request send by the PEP // Step 5: Evaluate the request. Generate the response. // Display the output on std out
下面将一步步地说明 PDP 的创建和请求评估: 从命令行参数获得请求和策略文件。 到此为止,处理请求需要创建的三种主要 XACML 组件 —— 策略、PEP 和 PDP —— 都已经介绍完毕,并给出了相应的例子。 结束语 本文介绍了创建基本的 XACML 组件的过程: 策略,包括规则和策略目标
|
-- 作者:菜籽 -- 发布时间:7/1/2005 10:15:00 PM -- 图片没有显示,不知怎么把图片显示? |
-- 作者:菜籽 -- 发布时间:7/31/2005 11:53:00 PM -- 原文在本版资源里面可以找到,里面有显示的图片! |
-- 作者:lphdx -- 发布时间:8/22/2005 5:15:00 PM -- 怎么没有图片阿 |
-- 作者:yinnanzzy -- 发布时间:10/13/2006 6:58:00 PM -- 谢谢!!! |
-- 作者:zsa -- 发布时间:11/21/2006 12:25:00 PM -- 学习呀!! |
-- 作者:laipigongzi -- 发布时间:6/13/2007 3:45:00 PM -- 顶 |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
3,644.531ms |