Authzforce - не удается создать простую политику ABAC

Я использую Authzforce 8.1.0 и уже создал несколько RBAC сценариев политики на основе примеров, приведенных в Руководство для пользователей и программистов, но я хотел бы создать простой ABAC сценарий.

Как новичок в языке XACML, я пытаюсь следовать некоторым примерам из здесь. В частности, я пытаюсь реализовать политику, аналогичную 4.1.1 Пример политики.

Политика, которую я хочу создать

Предположим, что корпорация Medi Corp (идентифицируемая по своему доменному имени: med.example.com) имеет политику контроля доступа, которая гласит на английском языке:

Любой пользователь с именем электронной почты в пространстве имен med.example.com может выполнять любые действия с любым ресурсом.

<?xml version="1.0" encoding="UTF-8"?>
   <Policy xmlns="urn:oasis:names:tc:xacml:3.0:schema:os"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="urn:oasis:names:tc:xacml:3.0:schema:os
           http://docs.oasis-open.org/xacml/FIXME.xsd"
           PolicyId="urn:oasis:names:tc:xacml:3.0:example:SimplePolicy1"
           Version="1.0"
           RuleCombiningAlgId="identifier:rule-combining-algorithm:deny-overrides">
     <Description>
       Medi Corp access control policy
     </Description>
     <Target/>
      <Rule
       RuleId= "urn:oasis:names:tc:xacml:3.0:example:SimpleRule1"
       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
                    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>
      </Rule>
    </Policy>

Когда я пытаюсь POST применить эту политику на {ip}:{port}/authzforce-ce/domains/{domainId}/pap/policies, я получаю следующую ошибку

Ошибка

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<error xmlns:ns2="http://authzforce.github.io/core/xmlns/pdp/6.0">
<message>Invalid parameters: cvc-elt.1: Cannot find the declaration of element 'Policy'.</message>
</error>

Все примеры, которые я видел в authzforce, начинаются с объявления <PolicySet> (в котором мы можем объявить несколько блоков <Policy>, поэтому я подумал, что это может быть проблемой, и попытался включить политику в policySet, как показано ниже:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<PolicySet
 xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17"
 PolicySetId="first_policyset_id"
 Version="1.0"
 PolicyCombiningAlgId="urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:permit-unless-deny">
 <Description>Policy for Github</Description>
 <Target />
 <Policy
   PolicyId="urn:oasis:names:tc:xacml:3.0:example:SimplePolicy1"
           Version="1.0"
           RuleCombiningAlgId="identifier:rule-combining-algorithm:deny-overrides">
  <Description>
       Medi Corp access control policy
     </Description>
     <Target/>
      <Rule
       RuleId= "urn:oasis:names:tc:xacml:3.0:example:SimpleRule1"
       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
                    Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
                    AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id"
                    MustBePresent="false"
                    DataType="urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name"/>
                </Match>
           </AllOf>
         </AnyOf>
       </Target>
      </Rule>
    </Policy>
</PolicySet>

но теперь я получаю следующее:

Ответ

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<error xmlns:ns2="http://authzforce.github.io/core/xmlns/pdp/6.0">
    <message>Failed to find a root PolicySet with id = 'first_policyset_id', Version=1.0,EarliestVersion=*,LatestVersion=*: Matched PolicySet 'first_policyset_id' (version 1.0) is invalid or its content is unavailable</message>
</error>

Каков правильный формат запроса XACML для создания такого простого сценария политики ABAC? Мы также будем очень признательны за пример запроса доступа к политике, заранее спасибо!


person NickAth    schedule 03.04.2020    source источник


Ответы (1)


В этом примере из раздела 4.1.1, к сожалению, есть известные проблемы, о некоторых из них я сообщил на список рассылки xacml-comment. Это должно быть исправлено в следующей версии спецификации XACML. А пока вам нужно исправить это:

  1. Полностью удалите xsi:schemaLocation. Поскольку местоположение http://docs.oasis-open.org/xacml/FIXME.xsd неверно, и AuthzForce уже использует свое собственное местоположение для схемы XACML.
  2. RuleCombiningAlgId identifier:rule-combining-algorithm:deny-overrides неверен. Заменить на urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides.

Я также подтверждаю, что REST API AuthzForce Server принимает только PolicySets в качестве входных данных на конечной точке /pap/policies, поэтому вам нужно обернуть свою политику в PolicySet, как вы это сделали. Но вам следует изменить PolicyCombiningAlgId на urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:only-one-applicable, если вы хотите, чтобы результат PolicySet был эквивалентен политике.

- РЕДАКТИРОВАТЬ 2020-04-06--

Итак, фиксированный набор политик таков:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<PolicySet 
 xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17"
 PolicySetId="PolicySet_1"
 Version="1.0"
 PolicyCombiningAlgId="urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:only-one-applicable">
 <Description>Sample PolicySet</Description>
 <Target />
 <Policy 
  PolicyId="urn:oasis:names:tc:xacml:3.0:example:SimplePolicy1"
  Version="1.0"
  RuleCombiningAlgId="urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides">
  <Description>Medi Corp access control policy</Description>
  <Target/>
  <Rule
   RuleId= "urn:oasis:names:tc:xacml:3.0:example:SimpleRule1"
   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
           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"
           MustBePresent="true"/>
         </Match>
       </AllOf>
     </AnyOf>
   </Target>
  </Rule>
 </Policy>
</PolicySet>
person cdan    schedule 04.04.2020
comment
Спасибо @Cyril за большую помощь, нужно было исправить еще кое-что, чтобы политика была принята, например: 1) удаление xmls и xmlns:xsi из <Policy> и добавление атрибута MustBePresent в атрибут AttributeDesignator, поскольку он является обязательным. Вы можете включить окончательный результат в свой ответ, и я приму его: pastebin.com/gfTphtLu - person NickAth; 05.04.2020
comment
Хорошо, я добавил к своему ответу окончательный результат, вы можете его принять :-) - person cdan; 06.04.2020