Зачем нужны и PolicySet, и Policy?

Я прочитал спецификации 3.0 и у меня возник вопрос:

Я обнаружил, что PolicySet и Policy имеют много общих черт, таких как алгоритмы объединения и т. Д. И для обеспечения большего количества уровней PolicySet также может быть самодостаточным. Если так, то почему бы не объединить PolicySet и Policy в единую концепцию с именем Policy и сделать так, чтобы Policy содержал другие политики и правила?


Обновление:

Говоря о Правиле, на самом деле Правило также мало отличается от Политики, за исключением того, что Правило имеет Условие и Эффект и не имеет алгоритма объединения. Сейчас я думаю о том, чтобы объединить три концепции: PolicySet, Policy, Rule в единую новую политику. Эта политика является самостоятельной и может иметь свои условия и последствия. Если его алгоритм объединения возвращает Intermediate, используйте собственный эффект. Вся политика не применяется, если ее собственное условие не удовлетворяет запросу. Я лично думаю, что эта модель с одним понятием является более краткой и понятной, чем PolicySet, Policy и Rule.

Например, для четырехуровневой политики (если существует потребность в четырехуровневой политике для крупного предприятия), XACML будет выглядеть следующим образом:

PolicySet -> PolicySet(s) -> Policy(s) -> Rule(s)

Моя модификация будет:

Policy -> Policy(s) -> Policy(s) -> Policy(s)

По сравнению с двухуровневым набором политик XACML и политикой и правилом уровня, я думаю, что более простые четырехуровневые политики были бы более понятными?

1 ответ

Решение

Факт, что оба существуют, является причудой языка. Вы можете представить язык с листовым элементом (правило) и ветвью (политика).

И Policy, и PolicySet очень похожи. При моделировании в XACML вы можете ассимилировать их.

У вас будет политика, которая может содержать правила XOR других политик, но не обе одновременно

РЕДАКТИРОВАТЬ

После редактирования ОП, здесь немного больше контекста.

Структурные элементы XACML

XACML представляет 3 структурных элемента:

  • PolicySet (PS)
  • Политика (P)
  • Правитель)

Как указывает OP, PolicySet может содержать Policy и PolicySet, что позволяет создать общее дерево, настолько глубокое, насколько этого хочет автор (PS -> PS -> PS... -> P -> R),

Содержимое PolicySet, Policy и Rule

Все три элемента (PS, P, R) могут содержать:

  • Целевые элементы: цель - это то, что определяет область действия элемента. Цель состоит из структуры AND/OR/AND и соответствия атрибутов, например role=='manager' OR role=='editor',
  • Обязательства и рекомендации: обязательства и рекомендации - это заявления, которые возвращаются вместе с решением от PDP (точка принятия решения) обратно в PEP (пункт применения политики)

Объединение алгоритмов

Поскольку элементы PolicySet и Policy могут содержать дочерние элементы, им необходим механизм для разрешения конфликтов между дочерними элементами. Этот механизм называется алгоритмом объединения. Поэтому и элементы PolicySet, и элементы Policy имеют свойство алгоритма объединения. Поскольку PolicySets содержат другие PolicySets и / или элементы Policy, алгоритм объединения в PolicySet называется алгоритмом объединения политики. Поскольку элементы Политики содержат только Правила, алгоритм объединения называется алгоритмом объединения правил.

Еще одна особенность XACML заключается в том, что список алгоритмов объединения для политик почти такой же, как и для правил. Заметные различия:

  • только один применимый существует только для политик.
  • on-allow-apply-second существует только для политик.

Вот список в нотации ALFA (ALFA - это псевдоязык, разработанный Axiomatics для упрощения разработки политики XACML):

namespace System {
    ruleCombinator denyOverrides = "urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides"
    ruleCombinator permitOverrides = "urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:permit-overrides"   
    ruleCombinator firstApplicable = "urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable"
    ruleCombinator orderedDenyOverrides = "urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:ordered-deny-overrides"
    ruleCombinator orderedPermitOverrides = "urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:ordered-permit-overrides"
    ruleCombinator denyUnlessPermit = "urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-unless-permit"
    ruleCombinator permitUnlessDeny = "urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:permit-unless-deny"

    policyCombinator denyOverrides = "urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:deny-overrides"
    policyCombinator permitOverrides = "urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:permit-overrides"
    policyCombinator firstApplicable = "urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:first-applicable"
    policyCombinator onlyOneApplicable = "urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:only-one-applicable"
    policyCombinator orderedDenyOverrides = "urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:ordered-deny-overrides"
    policyCombinator orderedPermitOverrides = "urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:ordered-permit-overrides"
    policyCombinator denyUnlessPermit = "urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:deny-unless-permit"
    policyCombinator permitUnlessDeny = "urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:permit-unless-deny"
    policyCombinator onPermitApplySecond = "urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:on-permit-apply-second"
}

Цели и условия

Цели

Как указывалось ранее, целевые элементы могут существовать в любом из PolicySet, Policy и Rule. Цель имеет заданную структуру элементов AND/OR/AND, чтобы объединить совпадения атрибутов, то есть сравнение заданного атрибута с заданным значением. XACML предоставляет длинный список функций, которые можно использовать.

В цели могут использоваться только функции, которые принимают 2 атомарных значения и возвращают логическое значение, например == (или urn:oasis:names:tc:xacml:1.0:function:string-equal). Другие функции, например, sum (urn:oasis:names:tc:xacml:1.0:function:integer-add) использовать нельзя.

условия

В частности, есть одна действительно полезная вещь, которую не могут сделать целевые элементы: сравнить два атрибута вместе, т.е. установить связь. Представьте, например, что вы хотите написать Политику, которая гласит:

Врачи могут просматривать медицинскую карту пациента, которому они назначены.

Или, другими словами, Permit if userId == assignedDoctorId,

Это где элементы Условие вступают в силу. Условие является выражением, которое может использовать любую функцию, доступную в XACML. Общий результат условия должен быть логическим, но теперь вы можете делать такие вещи, как sum(age, limit)>5 или же userId == assignedDoctorId,

И тут возникает еще одна странность: элементы условия могут использоваться только внутри элемента правила. Итак, если вы хотите выразить отношение в XACML, вам нужно иметь хотя бы одно правило. И поскольку элемент Правила не может жить сам по себе. У вас должен быть хотя бы один элемент политики.

Таким образом, наименьшая возможная политика XACML (с использованием ALFA):

namespace example{
    policy policyExample{
        apply denyOverrides
        rule allowAll{
            permit          
        }
    }
}

И получившийся код XACML XML:

<?xml version="1.0" encoding="UTF-8"?>
 <!--This file was generated by the ALFA Plugin for Eclipse from Axiomatics AB (http://www.axiomatics.com). 
 Any modification to this file will be lost upon recompilation of the source ALFA file-->
<xacml3:Policy xmlns:xacml3="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17"
    PolicyId="http://axiomatics.com/alfa/identifier/example.policyExample"
    RuleCombiningAlgId="urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides"
    Version="1.0">
    <xacml3:Description />
    <xacml3:PolicyDefaults>
        <xacml3:XPathVersion>http://www.w3.org/TR/1999/REC-xpath-19991116</xacml3:XPathVersion>
    </xacml3:PolicyDefaults>
    <xacml3:Target />
    <xacml3:Rule 
            Effect="Permit"
            RuleId="http://axiomatics.com/alfa/identifier/example.policyExample.allowAll">
        <xacml3:Description />
        <xacml3:Target />
    </xacml3:Rule>
</xacml3:Policy>
Другие вопросы по тегам