XACML 策略 - 获得“不确定”响应

Posted

技术标签:

【中文标题】XACML 策略 - 获得“不确定”响应【英文标题】:XACML policy - getting "indeterminate" response 【发布时间】:2017-10-16 13:39:13 【问题描述】:

我正在尝试在 WSO2 中探索 XACML。我在 WSO2 IS 5.3.0 中使用以下策略

    <Policy xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17"  PolicyId="InStorePolicy" RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable" Version="1.0">
       <Target>
          <AnyOf>
             <AllOf>
                <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                   <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">access</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>
       <Rule Effect="Permit" RuleId="Rule_for_employee">
          <Target>
             <AnyOf>
                <AllOf>
                   <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                      <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">Employee</AttributeValue>
                      <AttributeDesignator AttributeId="http://test.org/claim/role" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"></AttributeDesignator>
                   </Match>
                </AllOf>
                <AllOf>
                   <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                      <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">Manager</AttributeValue>
                      <AttributeDesignator AttributeId="http://wso2.org/claims/role" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" 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:string-at-least-one-member-of">
                <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-bag">
                   <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">private/support</AttributeValue>
                   <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">private/team</AttributeValue>
                </Apply>
                <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>
             </Apply>
          </Condition>
       </Rule>
       <Rule Effect="Permit" RuleId="Rule_for_manager">
          <Target>
             <AnyOf>
                <AllOf>
                   <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                      <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">Manager</AttributeValue>
                      <AttributeDesignator AttributeId="http://wso2.org/claims/role" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" 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:string-at-least-one-member-of">
                <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-bag">
                   <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">private</AttributeValue>
                   <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">private/business</AttributeValue>
                   <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">private/leadership</AttributeValue>
                </Apply>
                <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>
             </Apply>
          </Condition>
       </Rule>
       <Rule Effect="Deny" RuleId="Rule_deny_all"></Rule>
    </Policy>        

我创建了具有经理和员工角色的用户。但是当我使用具有以下值的“Tryit”时,我得到“不确定”

动作:访问, 主题:员工1, 资源:/私人/团队

另外,我在服务器控制台中收到“找不到 AttributeDesignator 属性”错误。我找不到更多详细信息。

谁能帮我理解这个问题?

-阿尔比·莫肯

【问题讨论】:

我尝试使用 WSO2 IS 5.4.0 alpha 并且它在那里工作。但是我使用的是预打包的 WSO2 IS,因为我必须将它与 WSO2 API Manager 一起使用,如下所述link 是否有可用于 5.4.0 alpha 和相应 WSO2 APIM 的预打包版本? 【参考方案1】:

我使用 Axiomatics Policy Server 尝试了您的策略,我相信我可能已经找到了您的问题的根本原因。您的某些属性标记为MustBePresent。这是一个可选标志,如果设置为 true,则如果您的属性没有值,则评估将返回 Indeterminate。

访问审查

以下是授予访问权限的三种不同方式:

    stringAtLeastOneMemberOf(stringBag("private/support" , "private/team") , Attributes.resource.resource_id ) AND "access" == Attributes.action.action_id AND "Employee" == http://test.org/claim/role

    "Manager" == http://wso2.org/claims/role AND stringAtLeastOneMemberOf(stringBag("private/support" , "private/team") , Attributes.resource.resource_id ) AND "access" == Attributes.action.action_id

    "Manager" == http://wso2.org/claims/role AND "access" == Attributes.action.action_id AND stringAtLeastOneMemberOf(stringBag("private" , "private/business" , "private/leadership") , Attributes.resource.resource_id )

上面的符号使用ALFA,授权的缩写语言。

政策审核

这就是您的政策在政策编辑器中的样子。

顺便说一句,您的政策中有一些奇怪的东西:

    您使用了 2 个相似但不同的属性标识符(http://wso2.org/claims/role 和 http://test.org/claim/role)。这是故意的吗? 没有描述您的任何政策和规则,这使得理解它们变得更加困难。 我不确定您是否需要将属性标记为MustBePresent。我通常不这样做,但这可能是一种偏好。 当一个简单的目标可以使用时,您可以使用条件

之前

之后

下面的比前面的更容易阅读。

示例请求/响应

以下示例利用 XACML 的 JSON 配置文件 (Wikipedia | Blog post)


    "Request": 
        "AccessSubject": 
            "Attribute": [
                
                    "AttributeId": "http://test.org/claim/role",
                    "Value": "Employee"
                
            ]
        ,
        "Resource": 
            "Attribute": [
                
                    "AttributeId": "urn:oasis:names:tc:xacml:1.0:resource:resource-id",
                    "Value": "private/support"
                
            ]
        ,
        "Action": 
            "Attribute": [
                
                    "AttributeId": "urn:oasis:names:tc:xacml:1.0:action:action-id",
                    "Value": "access"
                
            ]
        ,
        "Environment": 
            "Attribute": []
        
    

以及匹配的响应


  "Response" : 
    "Decision" : "Permit",
    "Status" : 
      "StatusCode" : 
        "Value" : "urn:oasis:names:tc:xacml:1.0:status:ok",
        "StatusCode" : 
          "Value" : "urn:oasis:names:tc:xacml:1.0:status:ok"
        
      
    
  

【讨论】:

谢谢!在我设置 MustBePresent 'false' 后,它起作用了

以上是关于XACML 策略 - 获得“不确定”响应的主要内容,如果未能解决你的问题,请参考以下文章

如何评估 XACML 策略

WSO2 身份服务器 XACML JSON 请求导致“不确定”[找不到 AttributeDesignator 属性]

XACML Authzforce PDP 自定义策略

XACML 策略位置

比较 XACML 策略中的两个多元素属性

即使策略规则中缺少该属性,具有附加属性的 XACML 3.0 请求也匹配