XACML - разница между условием AND и двумя правилами

В чем разница между XACML, который использует функцию AND, которая содержит два условия, например. одним условием будет время в диапазоне 1-6 и дата, равная 23/07/2015

А другой XACML будет иметь два правила, одно из которых будет временем в диапазоне 1-6, а другое - датой, равной 23/07/2015.

Я имею в виду, как они работают? Первое, функция AND должна быть истинной, чтобы получить эффект разрешения. Как насчет второго? Просто проверит, верно ли одно из этих двух правил и даст ли разрешение разрешение, или оба правила должны быть верными, как первое?

1 ответ

Решение

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

  • PolicySet который может содержать PolicySet а также Policy элементы
  • Policy который может содержать Rule элементы.
  • Rule которые содержат желаемый эффект (либо Permit, либо Deny).

Rule содержит как Target элемент и Condition элемент, который определяет, когда правило будет применяться.

Rule будет применяться и вернуть свой эффект, если оба Target и Condition оценивать как истинное, т.е. если все совпадения в Target являются правильными, и если все части Condition в итоге оцените в True.

Давайте возьмем ваш пример:

  • Правило 1: возврат разрешения, если текущее время>13:00 и текущее время <18:00 и дата ==23/07/2015.

Код в ALFA будет:

policy parent{
    apply firstApplicable
    rule example{
        permit
        condition currentTime>"13:00:00":time && 
                  currentTime<"18:00:00":time && 
                  currentDate=="2015-07-23":date
    }       
}

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

Что если мы используем 2 правила для выражения одной и той же логики? Что происходит потом? Давайте разделим условие на 2 правила:

policy parent{
    apply firstApplicable
    rule checkTime{
        permit
        condition currentTime>"13:00:00":time && 
                  currentTime<"18:00:00":time
    }       
    rule checkDate{
        permit
        condition currentDate=="2015-07-23":date
    }
}

Что происходит потом? Результат не тот же. На самом деле, если политика имеет 2 дочерних правила, как она определяет, какое из них следует рассмотреть? Здесь вступают в силу алгоритмы объединения. Алгоритм объединения определяется на уровне политик и уровне политик. Смотрите здесь для полного списка и деталей.

В приведенном выше примере мы используем

apply firstApplicable

Это означает, что если в правиле указано "Разрешение", то второе правило даже не будет рассматриваться для оценки. Другими словами, ограничение даты не будет проверено. Поэтому набор из 2 правил не эквивалентен исходному условию, которое мы написали.

Мы все еще можем переработать 2 правила так, чтобы они работали как условие - или почти. Один из таких способов - повернуть чеки и сделать правила отрицательными: отрицать, если время находится за пределами диапазона 1-6. Запретить, если дата "2015-07-23". Только тогда можно будет определить правило разрешения, чтобы разрешить доступ. Переработанный пример становится в ALFA:

policy parent{
    apply firstApplicable
    rule checkTime{
        deny
        condition currentTime<="13:00:00":time || 
                  currentTime>="18:00:00":time
    }       
    rule checkDate{
        deny
        condition not(currentDate=="2015-07-23":date)
    }
    rule allowAccess{
        permit
    }
}

Суть в том, что: что вы хотите выразить? Важно ли проводить различие между проверкой времени и проверкой даты? Это имеет больше смысла как 2 правила? Единственное правило? Это полностью зависит от вас.

Чтобы изменить пример политики, вы можете скачать плагин ALFA отсюда.

НТН

Другие вопросы по тегам