每个用户一个XACML文件是一个好方法吗?

时间:2015-06-09 20:34:03

标签: wso2 wso2is erp xacml xacml3

方案:

我正在为WSO2 IS 5.0.0开发自定义PAP。我有简单的管理规则,例如:

  

用户 Bob 可以读取 订单分支 XYZ

     

用户 Bob 可以创建 发票分支 PTO

我打算为每个用户编写一个包含许多规则的策略,每个规则包含资源和操作作为目标,并在条件下测试分支和用户。

以下是一个例子:

<Policy xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" PolicyId="UserPolicy" RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable" Version="1.0">
   <Target></Target>
   <Rule Effect="Permit" RuleId="Rule-User-1">
      <Target>
         <AnyOf>
            <AllOf>
               <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-regexp-match">
                  <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">/api/Orders/*</AttributeValue>
                  <AttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"></AttributeDesignator>
               </Match>
               <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                  <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">GET</AttributeValue>
                  <AttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"></AttributeDesignator>
               </Match>
            </AllOf>
         </AnyOf>
      </Target>
      <Condition>
         <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:and">
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:any-of">
               <Function FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal"></Function>
               <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">user@company.com.br</AttributeValue>
               <AttributeDesignator AttributeId="http://wso2.org/claims/emailaddress" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"></AttributeDesignator>
            </Apply>
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:or">
               <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:any-of">
                  <Function FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal"></Function>
                  <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">XYZ</AttributeValue>
                  <AttributeDesignator AttributeId="branch" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:environment" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"></AttributeDesignator>
               </Apply>
               <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:any-of">
                  <Function FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal"></Function>
                  <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">PTO</AttributeValue>
                  <AttributeDesignator AttributeId="branch" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:environment" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"></AttributeDesignator>
               </Apply>            
            </Apply>
         </Apply>
      </Condition>
   </Rule>
   <Rule Effect="Permit" RuleId="Rule-User-2">
            <Target>
         <AnyOf>
            <AllOf>
               <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-regexp-match">
                  <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">/api/Orders/*</AttributeValue>
                  <AttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"></AttributeDesignator>
               </Match>
               <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                  <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">POST</AttributeValue>
                  <AttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"></AttributeDesignator>
               </Match>
            </AllOf>
         </AnyOf>
      </Target>
      <Condition>
         <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:and">
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:any-of">
               <Function FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal"></Function>
               <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">user@company.com.br</AttributeValue>
               <AttributeDesignator AttributeId="http://wso2.org/claims/emailaddress" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"></AttributeDesignator>
            </Apply>
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:or">
               <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:any-of">
                  <Function FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal"></Function>
                  <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">PTO</AttributeValue>
                  <AttributeDesignator AttributeId="branch" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:environment" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"></AttributeDesignator>
               </Apply>            
            </Apply>
         </Apply>
      </Condition>
   </Rule>
   <Rule Effect="Deny" RuleId="DenyRule-User"></Rule>
</Policy>        

问题:

如上所述,对于一个权限问题,我有太多行。我正在使用ERP系统,它可以拥有许多资源(API),并且用户可以在其上下文中拥有许多分支来访问。我认为,对于每个用户一个文件的这种方法,我会有大文件,而且我不知道它是否会导致PDP和我的ERP性能不佳。

问题:

有人在这里看到更好的方法吗?

1 个答案:

答案 0 :(得分:3)

不,这不是一个好方法。

您正在使用XACML,就像使用ACL或RBAC系统一样。相反,您希望根据更高级别的政策对授权进行建模。

您的要求是:

  

用户Bob可以读取分支XYZ的订单吗?

在这个例子中,为什么Bob可以在分支XYZ中读取订单?用户是否属于该分支?换句话说,授权逻辑是什么?例如,以下是否会进行适当的重写?

A user with the role == manager can do the action == view 
on a resource of type==order if order.branch == user.branch.

重写可以更好地扩展,因为它适用于任何用户,任何订单和任何分支。

  

用户Bob可以创建分支机构PTO的发票吗?

同样,您可以按如下方式重写此示例:

A user with the role == purchase manager can do the action == create 
on a resource of type==invoice if order.branch == user.branch.

我所做的是确定需求中的构建块(或属性),并将您的需求重写为授权规则。从那以后,您可以选择使用ALFA()来实施规则。如果您使用Eclipse的ALFA插件,结果将立即转换为XACML 3.0。

这就是Axiomatics Policy Server中的样子:

Axiomatics Policy Server - Policy Editor

我希望这有帮助, 大卫。