Можно ли сравнить атрибуты в политике 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 способа сделать это:

  1. Определите два "VariableDefinition" в своей политике: одну для получения части перед символом подчеркивания, другую для получения части между двумя последними символами косой черты. [интересно, если в основной спецификации XACML определена такая функция], то вы можете использовать два "VariableDefinition" в разделе "Правило". затем используйте стандартную строковую функцию, чтобы сравнить их.

  2. просто определите свою собственную новую функцию и добавьте ее в свою FunctionFactory, которую использует ваш PDP. Эти два подхода одинаковы, вам нужно применить указанную функцию к некоторому атрибуту вместо непосредственного использования необработанного значения атрибута.

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