Зачем комбинировать алгоритмы контроля доступа? - PullRequest
2 голосов
/ 05 мая 2020

Я пытаюсь решить, какую технологию / методологию авторизации использовать для проекта, а XACML имеет много интересных функций. Одна вещь, которую я не могу осмыслить, - это необходимость комбинирования алгоритмов. Есть ли сложные сценарии ios, где они нужны?

Скажите, что вместо этого доступ к типу ресурса (или какому-либо другому) является Разрешенным или Запрещенным по умолчанию. Правило определяет условие либо для разрешения, либо для отказа (но не для обоих одновременно).

Если есть какой-либо отказ, он отклоняется (немедленно). Если он «запрещает по умолчанию» и нет разрешения, он также отклоняется. Правила могут иметь приоритет, и разрешение / запрет на любом более высоком уровне будет иметь приоритет над теми, которые ниже него.

Правила будут более частичными, чем разрешение / запрет, а не одно большое правило с расширенными алгоритмами объединения.

Am Мне не хватает какого-то важного сценария ios (возможно), на который такой подход не распространяется? Возможно, на этот вопрос сложно ответить :) Надеюсь, что кто-то с большим опытом работы с XACML и / или контролем доступа сможет пролить свет на дизайнерское мышление и свой опыт работы с такими политиками.

Заранее спасибо!

РЕДАКТИРОВАТЬ: (в ответ Джорджу, потому что он слишком длинный)

Супер спасибо, что ответил Дэвиду! Прочтите много ваших постов и статей, хороший материал.

Я слышу, что вы говорите, и здесь много тонкостей (чтение списка рассылки по некоторым дизайнерским решениям и оценочные logi c, уф, волосатая штука :) Но похоже, что иерархическая структура - это то, что добавляет много сложности, и я не совсем понимаю, зачем это нужно. мог бы просто иметь эти два правила (если я правильно понимаю XACML)

PERMIT: unit = "bu1" 

DENY: unit = "bu1" AND apiPath == "/finance" AND objectType== "trade" AND trade.amount > user.allowedAmount 
  • Предоставлять доступ, если пользователь находится в модуле
  • При определенных c обстоятельствах deny
  • Может даже отказаться от ограничения бизнес-подразделения правила DENY, если это правило всей компании, которое, по-видимому, должно быть

Кажется, проще индивидуально адаптировать правила, чем они быть частью одного большого правила, и действительно ли нужно думать о них как об одном правиле, если вы пишете их вот так? Думаю, у вас будет общий образ мышления, разрешающий общие случаи и запрещающий исключения.

Итак, второй пример, вот почему я думаю, что вам действительно нужны «уровни приоритета» для решения некоторых вопросов.

Priority 1:

PERMIT:  megaemergency = true 

Priority 2:

PERMIT:  emergency = true AND u.approvalLimit >= c.amount.

Priority 3:

PERMIT: u.region = c.region AND u.approvalLimit >= c.amount.

Поскольку он замыкается на PERMIT или DENY на любом «уровне приоритета», и они оцениваются по порядку, не будет ли результат таким же? И тому, кто создает правила с более низким приоритетом, не обязательно знать о правилах с более высоким приоритетом.

Последний пример:

PERMIT: u.citizenship == "U.S" AND u.enteringFrom == "Canada" 
DENY: u.citizenship != "U.S" AND u.enteringFrom == "Canada"

(я имею в виду, что должны были бы будут и другие правила:)

Так как ЗАПРЕТ отменяет разрешение, а любой ОТКАЗ отрицает, что вы настроены. при таком подходе ... Может быть, у меня голова пукнула :)

Еще раз извините, круг вопросов шире.

1 Ответ

2 голосов
/ 06 мая 2020

Запретить по умолчанию - определенно хороший подход, но иногда имеет смысл иметь больше гибкости и определять, как правила (или политики) могут быть объединены.

Вот что говорится в стандарте:

Полная политика, применимая к конкретному запросу решения, может состоять из ряда отдельных правил или политик. Например, в приложении для обеспечения конфиденциальности личных данных владелец личной информации может определять определенные аспекты политики раскрытия информации, тогда как предприятие, которое является хранителем информации, может определять некоторые другие аспекты. Чтобы принять решение об авторизации, должна быть возможность объединить две отдельные политики для формирования единой политики, применимой к запросу. Источник

  1. Имейте в виду, что XACML не просто возвращает разрешение или отказ. Он может возвращать Permit, Deny, NotApplicable и Indeterminate.
  2. Политики XACML - это не простой список проверок, который вы обычно видите в правилах управления доступом к сети / брандмауэра. Политики XACML - это дерево (или несколько деревьев) политик, где чем глубже, тем лучше, а чем уже, тем лучше. Как только вы начнете строить деревья, вам понадобится механизм разрешения конфликтов, известный как алгоритм комбинирования.

Распространенным шаблоном при написании политик XACML является определение иерархической структуры политик. Вы делаете это, потому что хотите, чтобы ваша политика была управляемой. Итак, давайте представим, что вы - Acme In c. и у вас есть 5 бизнес-единиц, и у вас есть 5 API, которые, в свою очередь, имеют 5 методов.

Ваша политика может выглядеть как следующая заглушка (в ):

policyset acme{
    apply firstApplicable
    policyset bu1{
        target clause unit == "bu1"
        apply firstApplicable
        policyset financeApi{
            target clause apiPath == "/finance"
            apply firstApplicable
            policy buyTrade{
                target clause objectType == "trade"
                apply firstApplicable
                rule denyIfAmountTooLarge{
                    deny
                    condition trade.amount > user.allowedAmount
                    on deny{
                        obligation notify {
                            message = "You cannot approve this transaction because..."
                        }
                    }
                }
            }
        }
    }
}

Если бы он был отклонен по умолчанию и сначала отклонил, то я не смог бы иметь несколько политик параллельно (для BU1, BU2 ...). Я не смог бы так легко вкладывать политики. Также может быть вероятность, что я по ошибке откажу или разрешаю доступ. Мне нужно контролировать на каждом уровне, каким может быть результат и что делать, если мы получим NotApplicable или Indeterminate обратно.

Эффективная структура политики ... для времени выполнения и времени разработки

Одним из основных недостатков списков управления доступом или правил стиля NA C является тот факт, что вы потенциально можете получить слишком много правил, и трудно понять, какие правила описывают какой доступ. В NA C, например, как узнать, разрешен или запрещен UDP на данном порте. Из какого диапазона IP-адресов?

Более продвинутые языки политик, такие как XACML и ALFA, дают вам возможность создавать дерево политик. Это означает, что вы можете организовать свои политики в виде древовидной структуры, которая:

  1. может быть оценена быстрее - просто отсеките ветви, которые не применяются
  2. можно управлять и понимать (людьми) легче. Прокрутка списка из более чем 1000 правил неуправляема. Однако открытие ветвей и сворачивание других упрощает поиск нужной части.
  3. можно использовать повторно. Представьте, что правило для порта 8080 UDP и порта 8080 TCP одинаковое. Больше не нужно их дважды переписывать. Вы можете просто связать один полис / правило с другим и накапливать выгоды.

У разных полисов разные цели

Представьте, что вы страховая компания, обрабатывающая претензии. Ваша базовая политика такова: агент по заявкам может просматривать заявки только в своем регионе и может утверждать выплаты только в пределах их лимита. Итак, у вас есть разрешение, если u.region = c .region и u.approvalLimit> = c .amount.

Но что, если это чрезвычайная ситуация, вы хотите, чтобы все ваши сотрудники обслуживали все регионы. Итак, теперь вам нужна политика, которая может переопределить ограничение региона. Вы не можете сделать это в плоском списке, структура отрицает выигрыш. Здесь XACML / ALFA пригодится, потому что синтаксис и структура достаточно богаты для решения этих сценариев. ios.

Вот еще несколько, которые имеют смысл

Найдите все причины для отрицания доступ

Иногда вы не хотите отрицать, как только можете. Вы хотите сообщить конечному пользователю все причины отказа в доступе. Например, обработчик претензий не может одобрить претензию, потому что (а) сумма слишком велика, (б) регион не совпадает с регионом сотрудника и (c) существует конфликт интересов. Если вы сообщили пользователю частичную информацию, вы бы заставили пользователя повторить попытку утверждения 3 раза и получить отказ 3 раза.

Найдите первую причину для отказа в доступе

Это противоположно предыдущее утверждение и наиболее распространенный паттерн: вы хотите раскрывать как можно меньше и отрицать как можно скорее. Ваша модель может работать здесь.

Разрешить, только если все проверки разрешены

Это также известно как шаблон Берга. Вместо того, чтобы говорить:

  • отклонить, если регион указан неверно
  • отклонить, если сумма слишком велика
  • разрешить утверждение претензии

Вы могли бы сказать allow if - region is right - amount is under limit

В этом случае вы хотите собрать все решения о разрешениях, а затем перевернуть их, если это необходимо. Это требует переопределения разрешений и запрета-если-разрешение. Вы не сможете сделать это, используя только стратегию запрета.

Внимание

Будьте осторожны с политиками запрета. Что, если вы напишете политику, которая гласит:

  • запретить въезд из Канады в США, если гражданство не США.

В XACML, если по какой-то причине значение для гражданства нет, то в доступе не будет отказано. Мы не знаем, является ли пользователь американцем или нет. Так что вам нужно подумать и о наличии ценности.

Дополнительная литература

Axiomatics имеет отличную запись об алгоритмах объединения . Предлагаю вам это проверить.

...