Это хороший вопрос, и есть несколько хороших способов ответить на него. Одним из примеров может быть переписывание логики и выражение следующего:
- 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