Как сделать логическое И для объединения правил для XACML - PullRequest
3 голосов
/ 30 марта 2020

Мой сценарий - у меня есть политика с несколькими правилами, и все правила должны быть истинными, чтобы политика была истинной. Например:

Policy A
       - Rule 1
       - Rule 2
       - Rule 3

Для применения Policy A мне нужно, чтобы все три правила вернули true, и если хотя бы одно из них вернет false, следует go проверить другие политики в моем наборе политик.

Сейчас у меня есть

<!-- shortened for brevity -->
<Policy RuleCombiningAlgId="...:deny-overrides">
         <Rule id="1" Effect="Permit">
                ...
         </Rule>
         <Rule id="2" Effect="Permit">
                ...
         </Rule>
         <Rule id="3" Effect="Permit">
                ...
         </Rule>
</Policy>

Я думаю, что моя проблема в том, что ни одно из моих правил не возвращает "Запретить", но я изначально думал, что если это не разрешено, это должно быть запрещено , Я подумала надеть не все мои правила, но это сделало бы их не элегантными.

Если это уместно, я использую библиотеку Authzforce.

1 Ответ

4 голосов
/ 30 марта 2020

все правила должны быть истинными, чтобы политика была истинной

В терминах XACML, я полагаю, вы имеете в виду: политика должна возвращать разрешение, если и только если все правила внутри возвращаются Разрешать. Я не могу придумать ни одного алгоритма объединения правил в стандарте XACML, который просто делает это. Поэтому я предлагаю два варианта:

Вариант A: обернуть каждое правило в политику deny-исключением-Разрешение и использовать allow-исключением-deny вверху уровень (Policy A становится PolicySet A).

    <?xml version="1.0" encoding="utf-8"?>
    <PolicySet PolicySetId="A" PolicyCombiningAlgId="...:permit-unless-deny">
         <Policy RuleCombiningAlgId="...:deny-unless-permit">
           <Rule id="1" Effect="Permit">
                ...
           </Rule>
         </Policy>
         <Policy RuleCombiningAlgId="...:deny-unless-permit">
           <Rule id="2" Effect="Permit">
                ...
           </Rule>
         </Policy>
         <Policy RuleCombiningAlgId="...:deny-unless-permit">
           <Rule id="3" Effect="Permit">
                ...
           </Rule>
         </Policy>
    </PolicySet>

В этом случае PolicySet A возвращает разрешение тогда и только тогда, когда ( iff ) никакая политика не возвращает Deny (по определению allow- -день алгоритм). Поскольку каждая Политика возвращает Разрешение, если Правило возвращает Разрешение, иначе Запретить (по определению алгоритма deny -лючение-разрешения), это эквивалентно: Политика А возвращает Разрешение, если все Политики возвращают Разрешение, т.е. если все Правила возвращают Разрешение.

Вариант B: реализовать новое расширение для алгоритма объединения для AuthzForce .

...