XACML 政策。应用函数字符串子集给出意外结果
Posted
技术标签:
【中文标题】XACML 政策。应用函数字符串子集给出意外结果【英文标题】:XACML policy. Apply function string-subset giving unexpected result 【发布时间】:2016-11-07 20:53:34 【问题描述】:我正在使用从git 下载的balana。
我正在研究一个策略规则,如果策略的字符串包是请求中匹配属性的子集,则该规则应该只允许。
例如。请求包含属性"letter=a, letter=b"
,策略使用字符串子集来比较从请求到字符串包的字母属性集。我已经尝试了两个子集的顺序(子集字母 stringbag 与子集 stringbag 字母),但是当我的测试请求应该得到“Deny
”时,它们都返回“Permit
”。
示例政策
<Policy xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" PolicyId="policy1"
RuleCombiningAlgId="urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides" 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">
myguid0123456789
</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" />
</Match>
</AllOf>
</AnyOf>
</Target>
<Rule Effect="Deny" RuleId="securityLevel">
<Condition>
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:integer-greater-than">
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:integer-one-and-only">
<AttributeDesignator AttributeId="securityLevel" Category="tags" DataType="http://www.w3.org/2001/XMLSchema#integer" MustBePresent="true" />
</Apply>
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#integer">
9000
</AttributeValue>
</Apply>
</Condition>
<AdviceExpressions>
<AdviceExpression AdviceId="channel-security-too-low" AppliesTo="Deny">
<AttributeAssignmentExpression AttributeId="urn:oasis:names:tc:xacml:2.0:example:attribute:text">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
Message security is over 9000! It's not good cap'n, I cannae make it go any faster!
</AttributeValue>
</AttributeAssignmentExpression>
</AdviceExpression>
</AdviceExpressions>
</Rule>
<Rule Effect="Permit" RuleId="caveats">
<Condition>
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-subset">
<AttributeDesignator AttributeId="caveats" Category="tags" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true" />
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-bag">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
A
</AttributeValue>
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
B
</AttributeValue>
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
C
</AttributeValue>
</Apply>
</Apply>
</Condition>
<AdviceExpressions>
<AdviceExpression AdviceId="data-caveat-not-on-channel" AppliesTo="Deny">
<AttributeAssignmentExpression AttributeId="urn:oasis:names:tc:xacml:2.0:example:attribute:text">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
caveat advice fail
</AttributeValue>
</AttributeAssignmentExpression>
</AdviceExpression>
</AdviceExpressions>
</Rule>
<Rule RuleId="permit-rule" Effect="Permit" />
</Policy>
我正在通过这个测试请求:
请求
<Request xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" CombinedDecision="false" ReturnPolicyIdList="true">
<Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action">
<Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" IncludeInResult="true">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
send
</AttributeValue>
</Attribute>
</Attributes>
<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">
99991699
</AttributeValue>
</Attribute>
</Attributes>
<Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource">
<Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id" IncludeInResult="true">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
myguid0123456789
</AttributeValue>
</Attribute>
</Attributes>
<Attributes Category="tags">
<Attribute AttributeId="securityLevel" IncludeInResult="true">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#integer">
8000
</AttributeValue>
</Attribute>
<Attribute AttributeId="caveats" IncludeInResult="true">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
A
</AttributeValue>
</Attribute>
<Attribute AttributeId="caveats" IncludeInResult="true">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
B
</AttributeValue>
</Attribute>
</Attributes>
</Request>
所以,我的想法(因为我不确定有什么方法可以否定它)是
它隐式地将条件的否定匹配与效果的否定相关联。如果这是真的,我的直觉是,可以的匹配子集应该说“允许”,但如果它不匹配条件,它会改为说“拒绝”。
由于没有目标语句,我的直觉是它“应该”尝试评估所有请求的条件,因此不匹配条件不应该导致规则跳过被评估。
无论如何,看看样本,我希望它说“我的政策接受 A、B,但你有 A、B、C,所以我不得不拒绝你。”不幸的是,这不是它正在做的事情,我不知道为什么。请帮忙。 x_x
【问题讨论】:
【参考方案1】:您的政策和请求中有几个问题。
首先,在XML和XACML中<element>value</element>
不一样
<element>
value
</element>
如果您是这样发送请求并且您的策略是这样存储的,那么您要检查的值是' A '
、' B '
等等。这将是一个问题。
其次,您将拒绝覆盖组合算法与您的策略 P 结合使用。P 包含 3 条规则 R1、R2 和 R3。 R1 是拒绝规则。如果适用,则返回拒绝,并且不考虑 R2 和 R3。如果 R1 不适用,则 PDP 转到 R2 和 R3。如果 R2 适用,则可能的决定是允许,但 PDP 仍需要检查 R3,以防它返回拒绝。
如果 securityLevel > 9000,您将收到拒绝。
如果securityLevel
最后,R3 始终授予您访问权限。因此,无论您在第二条规则中做什么,第三条都会授予您访问权限。换句话说,R2 根本没有任何用途。
我在 Axiomatics Policy Server 中测试了您的策略,并且可以在模拟器中看到该行为。你应该和 Balana 一样。
您还应该检查目标中的 securityLevel,而不是在过度杀伤的情况下。
它隐含地将条件的否定匹配与效果的否定相关联。
XACML 中没有任何隐含的内容。 Permit 的反义词是 NotApplicable。
由于没有目标语句,我的直觉是它“应该”尝试评估所有请求的条件,因此不匹配条件不应该导致规则跳过被评估。
如果规则中没有目标,则直接进入它考虑的条件。它不会跳过规则。但在你的情况下,它返回 NotApplicable。
如果你想达到你想要的,使用组合算法首先适用并将 R3 从 Permit 更改为 Deny。
查看XACML blog 了解更多信息。
【讨论】:
我实际上确实将它作为以上是关于XACML 政策。应用函数字符串子集给出意外结果的主要内容,如果未能解决你的问题,请参考以下文章