Проверка правил XACML между ресурсом и предметом с помощью XPath

Я не могу понять, как написать правило, которое решало бы это требование:

Предположим, у меня есть такой запрос:

<Request>
  <Attributes Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject">
    <Content>
      <Categories>
        <Category name="cat1">
          <CategoryValue>A</CategoryValue>
          <CategoryValue>B</CategoryValue>
          <CategoryValue>C</CategoryValue>
        </Category>
        <Category name="cat2">
          <CategoryValue>B</CategoryValue>
          <CategoryValue>E</CategoryValue>
          <CategoryValue>F</CategoryValue>
        </Category>
      </Categories>
    </Content>
  </Attributes>
  <Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource">
    <Content>
      <Categories>
        <Category name="cat1">
          <CategoryValue>A</CategoryValue>
        </Category>
        <Category name="cat2">
          <CategoryValue>A</CategoryValue>
          <CategoryValue>E</CategoryValue>
          <CategoryValue>F</CategoryValue>
          <CategoryValue>G</CategoryValue>
        </Category>
      </Categories>
    </Content>
  </Attributes>
</Request>

Я хочу написать политику, содержащую правило с эффектом Разрешить, когда для каждого из Category элементов ресурса субъект имеет Category с одинаковыми @name и если оба этих Category элемента имеют по крайней мере один общий CategoryValue.

В этом примере выше:

  • У ресурса есть cat1 с A - у субъекта есть cat1 с одним значением A: Permit
  • У ресурса есть cat2 с A, E, F, G - у субъекта есть cat2 со значением E (или F): Разрешить
  • Конечный результат правила: разрешение

Мой вопрос не в том, какие functionId мне следует использовать, а в том, как я могу объединить эти условия, чтобы правило вело себя так, как я описал? Как сравнить GenericValue элементов узлов с одинаковым @name?

Я думаю, мне придется использовать функцию string-at-least-one-member-of между значениями объекта и ресурса «cat1», затем между субъектом и ресурсом «cat2», но настоящая трудность заключается в том, что PDP не имеет представления о @name элементов Category , поэтому я не могу жестко закодировать его прямо в правиле, и я не знаю, как выбрать их, в частности, для выполнения проверки.

Есть идеи по этому поводу?


person Kwoinkwoin    schedule 29.02.2016    source источник


Ответы (1)


Во-первых, ваш запрос недействителен. Вам не хватает некоторых элементов, например.

  • ReturnPolicyIdList = "истина"
  • CombinedDecision = "истина"

Во-вторых, я бы рекомендовал вам не использовать XPath в XACML. Это затрудняет написание ваших политик (отсюда и ваш вопрос), их трудно поддерживать и трудно читать (аудит). Это в некотором смысле противоречит цели XACML. Пусть PEP выполняет тяжелую обработку XML и отправляет атрибуты со значениями атрибутов, а не содержимое XML.

Кроме того, вы не можете контролировать итерацию по различным значениям элементов / атрибутов в XML в XACML. Я могу реализовать ваш вариант использования с конкретным значением @name, но не могу сделать это с массивом значений.

Предполагая одно значение, вам нужно будет реализовать следующее условие:

<xacml3:Rule RuleId="axiomatics-example-xacml30" Effect="Permit" xmlns:xacml3="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17">
     <xacml3:Target/>
     <xacml3:Condition >
          <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-at-least-one-member-of">
               <xacml3:AttributeSelector Path="/Categories/Category[@name='cat1']/CategoryValue/text()" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"/>
               <xacml3:AttributeSelector Path="/Categories/Category[@name='cat1']/CategoryValue/text()" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"/>
          </xacml3:Apply>
     </xacml3:Condition>
</xacml3:Rule>

Но вы не можете перебирать разные значения

person David Brossard    schedule 02.03.2016
comment
хорошо, я сделаю, как вы говорите, предварительно обработав XML в PEP. Спасибо за этот ответ :) - person Kwoinkwoin; 02.03.2016
comment
можно ли достичь той же цели, используя MDP или что-то подобное? - person Antonio La Marra; 25.05.2021
comment
Да, определенно, использование PEP для создания mdp дает вам больше контроля - person David Brossard; 26.05.2021