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

Я хочу написать многоуровневую политику, в соответствии с которой первый уровень всегда будет проверять среду, например:

  • проверка наличия у пользователя действительного IP-адреса,
  • проверка времени в пределах допустимых временных рамок и дней недели
  • устройство пользователя является действительным устройством

Нижние уровни позаботятся о фактически запрошенных действиях, например. add, view, update, delete для определенного набора ресурсов, например medical records, insurance data, bank accounts...

На простом английском правила выглядят следующим образом

Политика, разрешающая, если все правила среды возвращают разрешение

  • Правило 1: Разрешить только пользователей с IP-адресом, который находится в диапазоне [мешок с диапазонами IP-адресов]
  • Правило 2: разрешать запросы на действия только с понедельника по пятницу.
  • Правило 3: разрешать запросы на действия только с 7:00 до 22:00.
  • Правило 4: разрешать запросы на действия только с рабочего стола или ноутбука.

Как это можно сделать с помощью ALFA, языка аксиоматики для авторизации?


person David Brossard    schedule 02.12.2014    source источник


Ответы (1)


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

  • PolicySet with a combining algorithm of first-applicable
    • deny if time is wrong
    • отклонить, если устройство недействительно
    • отклонить, если IP-адрес не входит в допустимый диапазон
    • набор возможных действий и политик на основе ресурсов, дающих Разрешение.

Вот как это выглядит в АЛЬФА:

namespace com.axiomatics.example{
    policyset global{       
        apply firstApplicable
        policy securityChecks{
            apply firstApplicable
            rule denyOutsideOfficeHours{
                deny
            }
            rule denyInvalidDevice{
                deny
            }
            rule denyInvalidIP{
                deny
            }
        }

        policyset myBusinessPolicies{
            apply firstApplicable
            /**
             * Add your business policies here
             */
        }

    }
}

Это всего лишь подмости. Давайте теперь посмотрим на атрибуты, которые нам нужны:

  • текущее время
  • текущий IP пользователя
  • тип устройства пользователя

Мы не будем беспокоиться о том, как мы получили эти значения. Об этом должен беспокоиться пункт обеспечения соблюдения политики или пункт информации о политике.

Первое правило будет использовать атрибут currentTime. Это атрибут по умолчанию в ALFA и определяется следующим образом:

attribute currentTime {
    id = "urn:oasis:names:tc:xacml:1.0:environment:current-time"
    type = time
    category = environmentCat
}

Обновленное правило теперь выглядит следующим образом:

rule denyOutsideOfficeHours{
    target clause currentTime<"09:00:00":time or currentTime>"17:00:00":time
    deny
}

В этом примере мы используем статические нижний и верхний пределы (9:00 и 17:00 соответственно), но они также могут быть атрибутами, и в этом случае нам придется использовать условие, а не цель. Обратите внимание на нотацию ALFA, используемую для преобразования строкового значения в соответствующий тип данных: "17:00:00":time.

Второе правило выглядит следующим образом:

rule denyInvalidDevice{
    condition not(stringIsIn(stringOneAndOnly(deviceType), stringBag("laptop","desktop")))
    deny
}

В этом правиле мы должны использовать условие, потому что невозможно выразить отрицательное ограничение в цели. Условие проверяет, что есть атрибут с именем deviceType и что он содержит единственное значение, не больше и не меньше. Это значение не должно быть равно ни laptop, ни desktop, чтобы запрет сработал. Кстати, сравнение строк в XACML по умолчанию чувствительно к регистру.

Последнее правило аналогично, и снова мы должны использовать условие, чтобы отрицать тест. Здесь мы используем функцию ipAddressRegexpMAtch XACML, чтобы проверить, соответствует ли IP-адрес пользователя (subjectLocalityIpAddress) заданному шаблону IP-адреса.

rule denyInvalidIP{
    condition not(
        ipAddressRegexpMatch(
            "^(10)\\.(10)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9])\\:([80|443])$", 
            ipAddressOneAndOnly(subjectLocalityIpAddress)
        )
    )
    deny
}

Обратите внимание, что обратную косую черту нужно экранировать другой обратной косой чертой. Это связано с синтаксисом ALFA. Сама политика XACML после преобразования в XML не будет содержать 2 символов обратной косой черты.

Итоговая политика, объединенная вместе, выглядит следующим образом:

namespace com.axiomatics.example{
    import Attributes.*

    attribute deviceType{
        category = subjectCat
        id = "deviceType"
        type = string
    }

    attribute userIP{
        category = subjectCat
        id = "deviceType"
        type = string
    }

    policyset global{       
        apply firstApplicable
        policy securityChecks{
            apply firstApplicable
            rule denyOutsideOfficeHours{
                target clause currentTime<"09:00:00":time or currentTime>"17:00:00":time
                deny
            }
            rule denyInvalidDevice{
                condition not(stringIsIn(stringOneAndOnly(deviceType), stringBag("laptop","desktop")))
                deny
            }
            rule denyInvalidIP{
                condition not(
                    ipAddressRegexpMatch(
                        "^(10)\\.(10)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9])\\:([80|443])$", 
                        ipAddressOneAndOnly(subjectLocalityIpAddress)
                    )
                )
                deny
            }
        }

        policyset myBusinessPolicies{
            apply firstApplicable
            /**
             * Add your business policies here
             */
        }

    }
}

Надеюсь, это поможет. Присылайте нам свои вопросы через Stackoverflow или через наш блог разработчиков.

person David Brossard    schedule 02.12.2014
comment
Есть ли способ использовать ALFA без использования плагина Eclipse? например программно создать ALFA, скажем, из пользовательского интерфейса, а затем сгенерировать XACML из ALFA без использования подключаемого модуля ALFA? - person Aymon Fournier; 14.04.2017