Ответ XACML не применим
Привет! Я экспериментирую с XACML3 и обнаружил, что на запрос, соответствующий условию, я получаю ответ в качестве разрешения. но когда это не так, я получаю неприменимо вместо того, чтобы отрицать. Я не уверен, что поведение правильное. Я понимаю, что могу замаскировать неприменимый ответ deny-unless-permit
алгоритм объединения, но я не понимаю этого поведения.
Ниже моя политика
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Policy xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" PolicyId="urn:oasis:names:tc:xacml:2.0:conformance-test:IIA1:policy"
RuleCombiningAlgId="urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides"
Version="1.0">
<Target>
<AnyOf>
<AllOf>
<Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">MyApp</AttributeValue>
<AttributeDesignator
AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id"
DataType="http://www.w3.org/2001/XMLSchema#string"
Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
MustBePresent="true" />
</Match>
</AllOf>
</AnyOf>
</Target>
<Rule Effect="Permit"
RuleId="urn:oasis:names:tc:xacml:2.0:conformance-test:IIA1:rule">
<Target />
<Condition>
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:integer-equal">
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:integer-one-and-only">
<AttributeDesignator
AttributeId="urn:oasis:names:tc:xacml:2.0:conformance-test:age"
Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
DataType="http://www.w3.org/2001/XMLSchema#integer" MustBePresent="false" />
</Apply>
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:integer-one-and-only">
<AttributeDesignator
AttributeId="urn:oasis:names:tc:xacml:2.0:conformance-test:age2"
Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
DataType="http://www.w3.org/2001/XMLSchema#integer" MustBePresent="false" />
</Apply>
</Apply>
</Condition>
</Rule>
</Policy>
И это мой запрос, на который я получаю ответ как не применимый
<?xml version="1.0" encoding="utf-8"?>
<Request ReturnPolicyIdList="false" CombinedDecision="false" xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Attributes Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject">
<Attribute IncludeInResult="false" AttributeId="urn:oasis:names:tc:xacml:2.0:conformance-test:age">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#integer">45</AttributeValue>
</Attribute>
<Attribute IncludeInResult="false" AttributeId="urn:oasis:names:tc:xacml:2.0:conformance-test:age2">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#integer">4</AttributeValue>
</Attribute>
</Attributes>
<Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource">
<Attribute IncludeInResult="false" AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">MyApp</AttributeValue>
</Attribute>
</Attributes>
</Request>
Я получаю ответ как Разрешение только в том случае, если возраст и возраст2 совпадают, в противном случае ответ не применяется. Неприменимо подразумевает, что не найдено ни одного соответствующего правила, но Цель действительно успешно соответствует resource-id
Строка, так почему ответ не применяется? Любая помощь приветствуется.
1 ответ
Получение NotApplicable является нормальным ответом. На самом деле, это может быть самый распространенный ответ.
XACML определяет 4 возможных решения в ответе:
- Разрешать
- Отрицать
- Непригодный
- Неопределенный (который, я полагаю, вы видели раньше. Смотрите этот пост)
Когда вы впервые пишете свои политики, очень просто нажать NotApplicable, потому что по сути это означает, что ваш запрос не соответствует политике. Представьте, что ваша политика касается банковских счетов, и вы отправляете запрос о медицинских записях. Вы получите не применимо.
Есть способы замаскировать NotApplicable и заставить PDP вернуть Permit или Deny. Одним из таких способов является использование любого из следующих алгоритмов объединения:
- не позволяют, если-отрицать
- не отрицаю, если-разрешение
Если ваша политика содержит 3 правила и ни одно из них не применимо, политика обычно возвращает NotApplicable. Используя один из двух предыдущих алгоритмов объединения, вы получите Permit или Deny.
Другой вариант - использовать другое правило в качестве универсального, которое будет запрещать любой доступ, который ранее не обрабатывался. В этом случае алгоритм объединения родителя должен быть в первую очередь применим. Увидеть ниже.
Цели или условия?
В XACML есть 2 ключевых элемента, которые вы можете использовать для определения области действия политики авторизации (в широком смысле):
- Целевой элемент: цели могут существовать в PolicySet, Policy и Rule. Используйте их для простой логики сопоставления в сочетании с и / или / и, например,
role=="manager" and age>18
, - Элемент условия: условия существуют только внутри элементов правила. Их можно использовать для более сложного сопоставления и, в частности, для сравнения двух атрибутов, например
age>ageLimit
, Вы не можете сделать последнее в цели.
Для того чтобы правило было применимо, как Цель, так и Условие (если есть) должны оцениваться как true.