XACML 3.0 и атрибут rfc822Name

Я новичок в XACML. Я использую Balana и думаю, что у меня есть базовые возможности, поэтому я экспериментирую с Target, Rule и Condition. Моя политика основывается на двух правилах. Первое правило применяется ко всем, у кого есть med.example.com (да, базовый пример OASIS) в имени субъекта, и если имя вашего субъекта [email protected], вы получаете РАЗРЕШЕНИЕ в качестве ответа. Я знаю, что это лишнее. Второе правило гласит, что каждый, кто не будет удовлетворять условию первого правила, получит отказ DENY. Я хочу использовать атрибут rfc822Name как в Target, так и в Condition. Является ли это возможным? Это мое определение политики:

<?xml version="1.0" encoding="UTF-8"?>
<Policy xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17
  http://docs.oasis-open.org/xacml/3.0/xacml-core-v3-schema-wd-17.xsd"
  PolicyId="urn:oasis:names:tc:xacml:3.0:example:PolicyWithDENYRule" 
  RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable"
Version="1.0">
<Description>
    Medi Corp access control policy
</Description>
<Target />
<Rule RuleId="urn:oasis:names:tc:xacml:3.0:example:OnlyJimShallPass"
    Effect="Permit">
    <Description>Any subject with an e-mail name in the med.example.com domain can perform any action on any resource.</Description>
    <Target>
        <AnyOf>
            <AllOf>
                <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:rfc822Name-match">
                    <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">med.example.com</AttributeValue>
                    <AttributeDesignator MustBePresent="false"
                        Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
                        AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id"
                        DataType="urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name" />
                </Match>
            </AllOf>
        </AnyOf>
    </Target>
    <Condition>
        <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:any-of">
            <Function FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal"/>
            <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">[email protected]</AttributeValue>
                    <AttributeDesignator MustBePresent="false"
                        Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
                        AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id"
                        DataType="urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name" />
        </Apply>
    </Condition>
</Rule>
<Rule Effect="Deny" RuleId="defaultRule" />

While I try to evaluate my request I got this exception:

java.lang.IllegalArgumentException: second arg has to be a bag
2017-05-19 09:33:34 ERROR FileBasedPolicyFinderModule:248 - Fail to load policy : /home/pezzati/workspace/SecurityProofOfConcept/src/test/resources/policywithdenyrule/policy.xml
java.lang.IllegalArgumentException: illegal parameter
at org.wso2.balana.cond.FunctionBase.checkInputsNoBag(FunctionBase.java:419)
at org.wso2.balana.cond.HigherOrderFunction.checkInputs(HigherOrderFunction.java:421)
at org.wso2.balana.cond.Apply.<init>(Apply.java:89)
at org.wso2.balana.cond.Apply.getInstance(Apply.java:227)
at org.wso2.balana.cond.Apply.getInstance(Apply.java:188)
at org.wso2.balana.cond.ExpressionHandler.parseExpression(ExpressionHandler.java:53)
at org.wso2.balana.cond.Condition.getInstance(Condition.java:177)
at org.wso2.balana.Rule.getInstance(Rule.java:237)
at org.wso2.balana.Policy.<init>(Policy.java:303)
at org.wso2.balana.Policy.getInstance(Policy.java:382)
at org.wso2.balana.finder.impl.FileBasedPolicyFinderModule.loadPolicy(FileBasedPolicyFinderModule.java:242)
at org.wso2.balana.finder.impl.FileBasedPolicyFinderModule.loadPolicies(FileBasedPolicyFinderModule.java:202)
at org.wso2.balana.finder.impl.FileBasedPolicyFinderModule.init(FileBasedPolicyFinderModule.java:91)
at org.wso2.balana.finder.PolicyFinder.init(PolicyFinder.java:149)
at org.wso2.balana.PDP.<init>(PDP.java:97)
at edu.pezzati.sec.xaml.XacmlTest.getPDP(XacmlTest.java:20)
at edu.pezzati.sec.xaml.PolicyWithDenyRule.init(PolicyWithDenyRule.java:37)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

Почему это исключение? XACML 3.0 говорит, что вы можете использовать AttributeDesignator в Condition. Есть ли какие-то ограничения, которые я пропускаю? Полный проект можно найти здесь. Посмотрите на тест PolicyWithDenyRule.


person Francesco    schedule 18.05.2017    source источник


Ответы (1)


Я заставил это работать. Я столкнулся с двумя значениями разного типа. Я изменил свой Condition таким образом:

<Condition>
  <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:any-of">
    <Function FunctionId="urn:oasis:names:tc:xacml:1.0:function:rfc822Name-equal"/>
    <AttributeValue DataType="urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name">[email protected]</AttributeValue>
    <AttributeDesignator MustBePresent="false"
      Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
      AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id"
      DataType="urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name" />
  </Apply>
</Condition>

Я изменил основную функцию с string-equal на rfc822Name-equal и изменил AttributeValue, который держит [email protected], с string на rfc822Name. Таким образом, функция основного условия может сверить rfc822Name атрибут с набором rfc822Name атрибутов, ведущих себя, как ожидалось. Я также обновляю свой проект на github, теперь он работает.

person Francesco    schedule 19.05.2017
comment
Просто для уточнения: сообщение об ошибке Balana java.lang.IllegalArgumentException: second arg has to be a bag неверно, поэтому здесь бесполезно. Действительно, второй аргумент в исходной политике — это AttributeDesignator, который всегда возвращает сумку, так что с этой точки зрения это правильно. Неверны только функция (равная строке) и тип данных первого аргумента (строка вместо rfc822Name). - person cdan; 23.05.2017
comment
@CyrilDangerville привет. Я вижу, у вас есть некоторый опыт работы с AuthZ. Можете ли вы указать мне некоторые документы или примеры кода? Спасибо. - person Francesco; 23.05.2017
comment
У меня есть некоторый опыт работы с XACML, но не с реализацией Balana как таковой, по крайней мере, не в последнее время (я пробовал это много лет назад, но это доставило мне слишком много хлопот, поэтому я отказался от него). Я использую другую альтернативу с открытым исходным кодом: AuthzForce (я являюсь одним из сопровождающих). Существует раздел Пример использования..., если вам нужен пример кода с Java API. Также имеется поддержка REST API (с пример кода). - person cdan; 24.05.2017
comment
... Я знаю, что другие используют OpenAZ, но я не пробовал. Затем идут коммерческие: Axiomatics, Oracle и т.д. - person cdan; 24.05.2017
comment
@CyrilDangerville хорошо, AuthzForce выглядит тоже хорошо. Я даю ему попробовать только сейчас. - person Francesco; 24.05.2017
comment
Раздел Использование поможет вам начать работу в большинстве случаев. В общем, класс BasePdpEngine является точкой входа, особенно. его методы getInstance(...). Затем большая часть информации находится в API Javadoc, который мы публикуем вместе с источниками на Maven Central (например, authzforce-ce-core-pdp-engine-XXX-javadoc.jar) с каждым выпуском, чтобы ваша среда IDE могла загружать и отображать их автоматически, если правильно настроить. Если что-то непонятно, вы можете задать вопрос по проблемам Github или воспользоваться списком рассылки. (см. раздел «Поддержка»). - person cdan; 13.07.2017