Это хороший вопрос, и есть несколько хороших способов сделать это. Одним из примеров будут переписать логику и выразить следующее:
- PolicySet с комбинационным алгоритмом первого применимого
- отрицает если время является неправильным
- отрицает, если устройство является недействительным
- deny, если IP не соответствует допустимому диапазону
- набор возможных действий и основанная на ресурсах политика с получением Разрешения.
Это то, что он выглядит в ALFA:
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 утра и 5 вечера соответственно), но они также могут быть атрибутами, и в этом случае нам придется использовать условие, а не цель. Обратите внимание на нотацию ALFA, используемую для преобразования строкового значения в соответствующий тип данных: "17:00:00":time
.
Второе правило выглядит следующим образом:
rule denyInvalidDevice{
condition not(stringIsIn(stringOneAndOnly(deviceType), stringBag("laptop","desktop")))
deny
}
В этом правиле, мы должны использовать условие, потому что невозможно выразить отрицательное ограничение в мишени. Условие проверяет наличие атрибута deviceType
и что оно содержит одно значение, не более и не менее. Это значение не должно быть равно laptop
или desktop
для того, чтобы отрицать, что нужно выполнить удар. Кстати, сравнение строк в XACML по умолчанию чувствительно к регистру.
Последнее правило аналогично, и мы снова должны использовать условие для отрицания теста. Здесь мы используем функцию XAdML ipAddressRegexpMAtch, чтобы проверить, соответствует ли 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, не будет содержать двух символов обратной косой черты.
В результате политика все объединены вместе следующее:
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 или через наш Developer's Blog.
Есть ли способ использовать ALFA без использования плагина Eclipse? например программно создать ALFA из пользовательского интерфейса, а затем генерировать XACML из ALFA без использования плагина ALFA? –