Можно ли сравнить атрибуты в политике XACML?
Следующее правило гласит, что субъекты с ролью "acme_manager" могут выполнять любые действия с ресурсом "/acme/widgets":
<Rule Effect="Permit" RuleId="PermitRule">
<Condition>
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:and">
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-is-in">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">/acme/widgets</AttributeValue>
<AttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"/>
</Apply>
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-is-in">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">acme_manager</AttributeValue>
<AttributeDesignator AttributeId="http://wso2.org/claims/role" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"/>
</Apply>
</Apply>
</Condition>
</Rule>
Можно ли создать более динамическое правило, которое говорит что-то вроде: "субъекты с ролью X_manager могут выполнять любые действия с ресурсом /Y/ виджетами, если X равен Y"
Таким образом, я мог бы использовать ту же политику для обеспечения соблюдения:
- foo_manager... / foo / widgets
- bar_manager... / bar / widgets
- baz_manager... / baz / widgets
- и т.п.
без создания нескольких похожих политик.
2 ответа
Да, конечно, это на самом деле одно из ключевых преимуществ XACML по сравнению с другими средами авторизации и, безусловно, по сравнению с RBAC.
В XACML есть 2 элемента, которые вы можете использовать для определения применимости авторизации. Это:
- Цели XACML
- цели существуют в элементах Policy Set, Policy Policy и Rule.
- цели для простого соответствия между атрибутом и значением, например role=="manager"
- Условия XACML: условия существуют только в элементах Rule.
- условия для любого типа соответствия, включая тот, который вы ищете. С условиями вы можете сравнить любое количество атрибутов, например, userDepartment==resourceDepartment.
Я рекомендую вам использовать ALFA для написания вашей политики. Это намного проще, чем простой старый XACML. ALFA - бесплатный инструмент, разработанный Axiomatics (отказ от ответственности: я работаю для Axiomatics). Он также находится в процессе стандартизации в Техническом комитете OASIS XACML.
Я думаю, что есть 2 способа сделать это:
Определите два "VariableDefinition" в своей политике: одну для получения части перед символом подчеркивания, другую для получения части между двумя последними символами косой черты. [интересно, если в основной спецификации XACML определена такая функция], то вы можете использовать два "VariableDefinition" в разделе "Правило". затем используйте стандартную строковую функцию, чтобы сравнить их.
просто определите свою собственную новую функцию и добавьте ее в свою FunctionFactory, которую использует ваш PDP. Эти два подхода одинаковы, вам нужно применить указанную функцию к некоторому атрибуту вместо непосредственного использования необработанного значения атрибута.