Зачем нужны и 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>