XACML 编辑器使用 <Condition> 和字符串比较

Posted

技术标签:

【中文标题】XACML 编辑器使用 <Condition> 和字符串比较【英文标题】:XACML Editor using <Condition> and String Comparison 【发布时间】:2016-01-28 20:28:00 【问题描述】:

参考WSO2编辑器中&lt;condition&gt;逻辑(真/假)的实现。为什么 XACML 版本 3 策略编辑器拒绝任何其他面向字符串的比较函数,除了使用 "urn:oasis:names:tc:xacml:1.0:function:string-is-in" ?

示例:可接受的语法

<Rule Effect="Deny" RuleId="Deny-Rule1">
  <Target></Target>
   <Condition>
         <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:not">
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-is-in">
               <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">myGroup</AttributeValue>
               <AttributeDesignator Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" AttributeId="http://w3.red.com/subject/groupsUserBelong" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"></AttributeDesignator>
            </Apply>
         </Apply>
      </Condition>
      ..

导致错误的语法示例:所有其他字符串比较函数,包括 REGEX 函数:

     <Rule Effect="Deny" RuleId="Deny-Rule1">
       <Target></Target>
         <Condition>
             <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:not">
                <Apply FunctionId="urn:oasis:names:tc:xacml:3.0:function:string-contains">
                   <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">myGroup</AttributeValue>
                   <AttributeDesignator Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" AttributeId="http://w3.red.com/subject/groupsUserBelong" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"></AttributeDesignator>
                </Apply>
             </Apply>
          </Condition>
          .. 

当前的错误通常导致需要将一般策略方案从“拒绝”效果转变为“允许”效果,并结合“匹配”逻辑,从开发人员的角度来看这是不受欢迎的,因为“拒绝”规则用于具有更丰富的功能,例如用于错误处理的详细 ObligationExpressions。要应用&lt;Condition&gt; 语句,请在这种情况下生成更全面的代码。

我很高兴获得有关如何将&lt;Condition&gt; 语句与一般字符串比较函数一起使用的建议,例如:

. urn:oasis:names:tc:xacml:1.0:function:string-equal
. urn:oasis:names:tc:xacml:3.0:function:string-contains
. urn:oasis:names:tc:xacml:1.0:function:string-regexp-match
. urn:oasis:names:tc:xacml:3.0:function:string-equal-ignore-case

或其他生成布尔结果的字符串相关操作。

尝试用ALFA实现同样的逻辑,这里出处:

namespace com.red.XACML 
    import Attributes.*
    import attributes.*
    import com.red.XACML.Attributes.*

    rule notBGroups  
            deny
        
    rule bGroupsCobMail 
        target 
    condition
        stringOneAndOnly(subjectAttributes.groupsUserBelong)=="myGroup"
        permit

    

    policy bGroups  
        apply firstApplicable
        bGroupsCobMail
        notBGroups
                   
        

这也会引发与通过 WSO2 Try-It 函数相同的错误消息:

<Result>
<Decision>Indeterminate</Decision>
<Status>
<StatusCode Value="urn:oasis:names:tc:xacml:1.0:status:processing-error"/>
<StatusMessage>urn:oasis:names:tc:xacml:1.0:function:string-one-and-only expects a bag that contains a single element, got a bag with 7 elements</StatusMessage>
</Status>
<Attributes Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject">
<Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id" IncludeInResult="true">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">myname@red.com</AttributeValue>
</Attribute>
</Attributes>
</Result>
</Response>

看起来 AttributeDesignator 包需要另一个迭代循环才能解析元素。我们怎样才能做到这一点?

最新更新: 在这里陷入了一些圈子,由于 WSO2 XML 编辑器的语法拒绝,测试没有进展。

问题在于 AttributeID“http://w3.red.com/subject/groupsUserBelong”的属性指示符 返回一个包含七个元素的列表。这七个元素反映了该主题的所有数据,因此从逻辑上讲,7 的值是有意义的。

我的逻辑如下:我已经定义了一个组名变量,确实是一个像“myGroup”这样的String,那么我需要迭代该组的7个元素 LinkedHashSet 从 PIP 中返回,无论是否相关,并扫描每个元素以搜索“myGroup”之类的模式(或单词)。一旦发现 相等,布尔值“true”被设置为结果。现在在条件的外部部分,我计划添加一个 NOT 函数来反转布尔状态,因此条件将生成一个“拒绝”情况,即未找到该组,由此触发带有详细错误消息的 ObligationEpression。

看起来核心问题是如何迭代七个元素的列表以及如何在一个元素中找到单词,因为字符串子集是 不接受找不到词等功能。

 <Condition> 
         <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:not"> 
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal"> 
               <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-one-and-only"> 
                  <AttributeDesignator Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" AttributeId="http://w3.ibm.com/subject/groupsUserBelong" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false"></AttributeDesignator> 
               </Apply> 
               <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">myGroup</AttributeValue> 
            </Apply> 
         </Apply> 
      </Condition> 

<Result>
<Decision>Indeterminate</Decision>
<Status>
<StatusCode Value="urn:oasis:names:tc:xacml:1.0:status:processing-error"/>
<StatusMessage>urn:oasis:names:tc:xacml:1.0:function:string-one-and-only expects a bag that contains a single element, got a bag with 7 elements</StatusMessage>
</Status>

   <Condition>
         <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:not">
            <!--Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-subset"-->
               <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">myGroup</AttributeValue>
                  </Apply>
                  <AttributeDesignator AttributeId="http://w3.ibm.com/subject/groupsUserBelong" 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>
         </Condition>
<Result>
<Decision>Deny</Decision>
 Conclusion: the condition did not find the group.

编辑器通过此消息拒绝其他语法结构:

Entitlement policy is not updated. Error is :Unsupported Entitlement Policy. Policy can not be parsed 

最新更新: 此行为看起来像 WSO2 策略 XML 编辑器中的错误。该工具不支持:

A.3.12 高阶包函数

例如:任意样例

有关支持的逻辑,请参阅: http://docs.oasis-open.org/xacml/3.0/xacml-3.0-core-spec-os-en.html

可以使用以下“条件”语句模拟问题:

<Condition>
      <Apply FunctionId="urn:oasis:names:tc:xacml:3.0:function:any-of-any">
            <Function FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal"/>
               <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-bag">
                  <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">myGroup</AttributeValue>
               </Apply>
               <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-bag">
                  <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">myGroup</AttributeValue>
               </Apply>
            </Apply>
      </Condition>

【问题讨论】:

嗨克劳德,编辑没有告诉你原因吗?字符串包含适用于原子值,而不是值袋。属性指示符是包。这就是它不起作用的原因。 @David Brossard,从逻辑上看,您的解释是有道理的,通过打印它,属性指示符确实是一个包,在我的测试用例中,它是一个包含 7 个元素的列表,这些元素是自定义 PIP 的一部分AttributeFinder 返回对象。那么我怎样才能只引用一个字段,比如描述为 AttributeId=w3.red.com/subject/groupsUserBelong 的字段,而不是整个包?看起来我的问题是如何从 PIP 返回对象中寻址和加载属性。 使用string-one-and-only函数 @David Brossard,感谢您的提示。看起来我们的 AttributeDesignator 对象是嵌套格式,请参阅上面编辑器部分的详细信息,抛出意外的错误消息:“string-one-and-only 需要一个包含单个元素的包,得到一个包含 7 个元素的包。 " 克劳德,请仔细阅读我的回复。我认为您的问题来自您将属性指示符混淆的事实,这些属性指示符始终是带有原子值的值包。当您编写 stringOneAndOnly(a) 时,这意味着 a 必须包含一个值 - 不多也不少。如果要将 w3.red.com/subject/groupsUserBelong 与允许的组列表进行比较,请使用 stringAtLeastOneMemberOf(w3.red.com/subject/groupsUserBelong, allowedGroups) 或使用更高阶的函数,例如AnyOfAny 【参考方案1】:

如果你想比较两个包,例如

用户公民身份 允许的公民身份

您可以执行以下操作:

案例#1

userCitizenship 是单值的 allowedCitizenships 是单值的

您可以使用stringOneAndOnly(userCitizenship)==stringOneAndOnly(allowedCitizenships)

案例#2

userCitizenship 是单值的 allowedCitizenships 是多值的

(或相反)

    您可以使用stringIsIn(stringOneAndOnly(userCitizenship), allowedCitizenships)。 您还可以使用高阶函数,例如anyOf 或 allOf 如下anyOf(function[stringEquals], allowedCitizenships, stringOneAndOnly(userCitizenship))

案例#3

两个包都是多价值的。

以下是您的选择:

    您可以使用stringAtLeastOneMemberOf(userCitizenship, allowedCitizenships)。此功能适用于包。 您可以使用高阶函数AnyOfAny(function[stringEquals], userCitizenship, allowedCitizenships)

您可以在 XACML 中使用更多高阶函数来实现您正在寻找的确切行为。

【讨论】:

感谢您的指导。我已尝试按照您对案例 1,2 和 3 的建议由 ALFA 创建 XML 源,但仍被 WSO2 XML 编辑器拒绝整个策略。我已经针对 V3 模式验证了代码,并且它被声明为有效。请检查上面打印的样本中的详细信息。看起来核心问题在于 逻辑部分内的迭代。 我们的测试指向 XACML 第 3 版规范中描述的功能的实现。 A.3.12 高阶包函数 - any-of-any(参见上面的详细信息和代码示例)。它的使用会生成错误消息:“权利政策未更新。错误是:不支持的权利政策。无法解析政策”。

以上是关于XACML 编辑器使用 <Condition> 和字符串比较的主要内容,如果未能解决你的问题,请参考以下文章

优秀且易于使用的XACML GUI编辑器? [关闭]

允许访问 XACML 失败

XACML 政策 - 是不是正确?

XACML 策略位置

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

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