Как указать внешний набор разрешений в политике XACML?

Первоначально я спросил: «Как написать политику, которая требует, чтобы субъекту был предоставлен доступ к запрошенному разрешению, когда набор разрешенных разрешений находится во внешнем хранилище атрибутов. Можете ли вы сослаться на внешний набор разрешений в политике?» На второй вопрос дан положительный ответ, поэтому я немного пересматриваю вопрос, чтобы сосредоточиться на «как».

Может ли кто-нибудь предоставить фрагмент политики xacml (или даже псевдо-xacml), для которого требуется, чтобы идентификатор атрибута роли (будет предоставлен запросом) внутри набора ролей, которые идентифицируются другим идентификатором атрибута (управляемым хранилищем внешних атрибутов).

В качестве отправной точки ниже приводится пример из http://docs.oasis-open.org/xacml/2.0/XACML-2.0-OS-ALL.zip. В этом случае роль встроенная.

<Subject>
    <SubjectMatch MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
        <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">administrator</AttributeValue>
        <SubjectAttributeDesignator AttributeId="urn:oasis:names:tc:xacml:2.0:example:attribute:role" 
                                DataType="http://www.w3.org/2001/XMLSchema#string"/>
    </SubjectMatch>
</Subject>

person s_t_e_v_e    schedule 02.10.2011    source источник
comment
Действительно бесполезно переписывать вопрос в другой вопрос после того, как на первый вопрос дан ответ. Просто создайте новый вопрос, чтобы исходный вопрос и ответы на него служили ориентиром для будущих поколений.   -  person dthorpe    schedule 06.11.2011


Ответы (1)


Да, политики могут быть написаны для ссылочных атрибутов, которые поступают из внешнего хранилища атрибутов.

Однако то, откуда на самом деле берутся атрибуты, обычно не указывается в самой политике, кроме, возможно, шаблона именования в идентификаторе атрибута. В эталонной архитектуре PDP XACML ответственность за разрешение идентификаторов атрибутов и создание значений для PDP лежит на обработчике контекста запроса.

Это выглядит примерно так: оценивая запрос на соответствие набору политик, PDP встречает attributeID в правиле политики, которое ему необходимо для формирования решения по запросу. PDP просит обработчик контекста запроса получить значение этого attributeID «откуда бы то ни было» - PDP не заботится, откуда оно взято. Обработчик контекста запроса может искать атрибут в атрибутах, предоставленных с запросом, или в любом количестве внешних поставщиков атрибутов, таких как LDAP, AD, SAML или простые старые базы данных. Обработчик запросов может распознавать шаблоны именования (например, префиксы пространства имен) в attributeID, чтобы знать, где его получить.

Вы хотите, чтобы ваши attributeID были достаточно конкретными, чтобы знать, что они из себя представляют и что они означают, но не настолько конкретными, чтобы все ваши политики нарушались, когда вы перемещаете поставщика атрибутов на другой компьютер. Политики не должны зависеть от конфигурации.

В конечном итоге то, где обработчик запросов ищет атрибуты, зависит от конфигурации обработчика запросов / сервера PDP и зависит от поставщика продукта.

Обновление: чтобы ответить на вторую версию этого вопроса

Вы должны написать свою политику для выполнения сравнения между значением (значениями) атрибута, указанным в запросе, и списком значений, предоставленным внешним источником.

Имейте в виду, что указатель атрибута возвращает список значений, поскольку запрос может содержать несколько значений атрибута для одного и того же attributeID. Вы можете приспособиться к этому, заключив указатель атрибута в функцию сокращения «один-и-только», или используя функцию сопоставления продуктов «многие ко многим», которая будет проверять каждый член list1 на соответствие в list2.

Если у вас нет конкретного требования к дизайну, согласно которому запрос может содержать только один атрибут роли, лучше избегать сокращения «один-и-только», поскольку оно действительно ограничивает ваши возможности.

Ваша политика Xacml 2.0 может выглядеть примерно так: (простите синтаксические ошибки, мой Xacml 2.0 немного ржавый)

<Policy [...] RuleCombiningAlgorithm="deny-unless-permit">
  <Rule [...]>
    <Effect>Permit</Effect>
    <Condition>
      <Apply FunctionId=”urn:oasis:names:tc:xacml:1.0:function:string-at-least-one-member-of”>
        <SubjectAttributeDesignator
          AttributeId="urn:oasis:names:tc:xacml:2.0:example:attribute:role" 
          DataType="http://www.w3.org/2001/XMLSchema#string"/>
        <SubjectAttributeDesignator
          AttributeId="list-of-acceptable-roles-from-external-provider-attribute-id"
          DataType="http://www.w3.org/2001/XMLSchema#string"/>
      </Apply>
    </Condition>
  </Rule>
</Policy>

Функция Xacml "по крайней мере-один-член-из" принимает в качестве параметров два списка. Для каждого элемента в первом списке он проверяет, существует ли этот элемент во втором списке. Он возвращает истину, как только находит хотя бы одно совпадение.

Атрибут "... example: attribute: role" из вашего примера - это атрибут, который вы ожидаете предоставить в запросе. Если вы хотите принудительно указать атрибут в запросе, вы можете установить MustBePresent = "true" в обозначении атрибута.

Атрибут «список-приемлемых-ролей ...» - это идентификатор атрибута, который ваш обработчик контекста PDP распознает и получает от некоторого внешнего поставщика. Какой префикс или шаблон ищет обработчик контекста и от какого провайдера он выбирает, зависит от конфигурации PDP.

В идеале шаблон именования в идентификаторе атрибута указывает концептуальный домен или пространство имен, с которыми связан идентификатор, но идентификатор явно не указывает физическое местоположение или поставщика значений атрибута. Чтобы увеличить срок службы приложения при меньших затратах на обслуживание, вы хотите иметь возможность изменять детали реализации поставщика без необходимости переписывать все свои политики.

У вас могут быть идентификаторы атрибутов, зависящие от поставщика, которые, вероятно, будут поступать только от одного поставщика, вы можете иметь идентификаторы атрибутов для конкретного приложения, которые могут быть предоставлены несколькими поставщиками, но имеют смысл только для конкретного приложения, и вы можете иметь общий или стандартизованный атрибут идентификаторы, которые могут поступать от нескольких поставщиков и использоваться в нескольких приложениях. Корпус стандартов Oasis и профили для конкретных доменов являются хорошей отправной точкой для поиска стандартизированных идентификаторов атрибутов и их семантики или получения идей о том, как организовать собственные идентификаторы приложений.

В зависимости от вашего PDP и реализации обработчика контекста, также может быть возможно использовать поле «Issuer» как способ ограничить список поставщиков для атрибута. В спецификации Xacml ничего не говорится об использовании поля Issuer, но те же цели по отделению политики от деталей реализации поставщика по-прежнему остаются в силе.

person dthorpe    schedule 28.10.2011
comment
Благодарю за ваш ответ. Похоже, что для набора ролей субъекта нужен только идентификатор атрибута. - person s_t_e_v_e; 30.10.2011
comment
Да, это было бы для политики def. Затем вам понадобится соответствующий фрагмент в обработчике контекста запроса pdp, который знает, как возвращать имена ролей, когда pdp говорит: "Эй, что это за атрибут?" - person dthorpe; 31.10.2011
comment
Обновлено, чтобы ответить на 2-ю версию этого вопроса. Для будущих вопросов, пожалуйста, создайте новый вопрос вместо редактирования существующего вопроса, чтобы сохранить контекст существующих ответов. - person dthorpe; 09.11.2011
comment
Отличный ответ, мы собираемся внедрить XACML в работу очень скоро, и это очень поможет! - person PmanAce; 11.02.2020