Сравнить атрибуты внутри политики XACML

Я разрабатываю политику XACML и использую библиотеку sun.xacml. Я хочу сравнить два атрибута: один для субъекта и один для ресурса, чтобы разрешить доступ к ресурсам.

Я сгенерировал этот файл XACML

<?xml version="1.0"?>
<Policy PolicyId="GeneratedPolicy" RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:permit-overrides">
  <Description>Policy che permette la lettura del file ai client che hanno un livello di permesso maggiore o uguale al livello di permesso del file richiesto</Description>
  <Target>
<Subjects>
  <AnySubject/>
</Subjects>
<Resources>
  <AnyResource/>
</Resources>
<Actions>
  <Action>
 <ActionMatch MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
   <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">read</AttributeValue>
   <ActionAttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" DataType="http://www.w3.org/2001/XMLSchema#string"/>
 </ActionMatch>
  </Action>
</Actions>
  </Target>
  <Rule RuleId="canRead" Effect="Permit">
<Target>
  <Subjects>
 <AnySubject/>
  </Subjects>
  <Resources>
 <AnyResource/>
  </Resources>
  <Actions>
 <Action>
   <ActionMatch MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
  <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">read</AttributeValue>
  <ActionAttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" DataType="http://www.w3.org/2001/XMLSchema#string"/>
   </ActionMatch>
 </Action>
  </Actions>
</Target>
<Condition FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-greater-than-or-equal">
  <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-one-and-only">
 <SubjectAttributeDesignator AttributeId="level-permission" DataType="http://www.w3.org/2001/XMLSchema#string"/>
  </Apply>
  <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">4</AttributeValue>
</Condition>
  </Rule>
  <Rule RuleId="FinalRule" Effect="Deny"/>
</Policy>

Проблема в том, что у ресурса есть разрешение уровня, и я хочу сравнить разрешение уровня субъекта и разрешение уровня ресурса, но я не знаю, как это сделать.

большое спасибо

1 ответ

Вы почти там. Всякий раз, когда вам нужно сравнить 2 атрибута вместе, например, user-clearance а также resource-classificationвам нужно использовать XACML Condition, Вы пытались сделать это в своем примере, но сравнили атрибут со статическим значением.

Вот простой пример в ALFA ( Аксиоматический язык для авторизации).

policy documentAccess{
    apply firstApplicable
    rule allowAccessIfClearanceSufficient{
        condition user.clearance>document.classification
        permit
    }
}

Я определяю свои атрибуты следующим образом:

    attribute classification{
        category = resourceCat
        id = "document.classification"
        type = integer
    }

а также

    attribute clearance{
        category = subjectCat
        id = "user.clearance"
        type = integer
    }

Обратите внимание, что здесь я использую целое число вместо строки. Это эффективнее и безопаснее.

Вывод в XACML 3.0 следующий:

<?xml version="1.0" encoding="UTF-8"?>
 <!--This file was generated by the ALFA Plugin for Eclipse from Axiomatics AB (http://www.axiomatics.com). 
 Any modification to this file will be lost upon recompilation of the source ALFA file-->
<xacml3:Policy xmlns:xacml3="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17"
    PolicyId="http://axiomatics.com/alfa/identifier/example.documentAccess"
    RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable"
    Version="1.0">
    <xacml3:Description />
    <xacml3:PolicyDefaults>
        <xacml3:XPathVersion>http://www.w3.org/TR/1999/REC-xpath-19991116</xacml3:XPathVersion>
    </xacml3:PolicyDefaults>
    <xacml3:Target />
    <xacml3:Rule 
            Effect="Permit"
            RuleId="http://axiomatics.com/alfa/identifier/example.documentAccess.allowAccessIfClearanceSufficient">
        <xacml3:Description />
        <xacml3:Target />
        <xacml3:Condition>
            <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:any-of-any">
                <xacml3:Function FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-greater-than"/>
                <xacml3:AttributeDesignator 
                    AttributeId="user.clearance"
                    DataType="http://www.w3.org/2001/XMLSchema#string"
                    Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
                    MustBePresent="false"
                />
                <xacml3:AttributeDesignator 
                    AttributeId="document.classification"
                    DataType="http://www.w3.org/2001/XMLSchema#string"
                    Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
                    MustBePresent="false"
                />
            </xacml3:Apply>
        </xacml3:Condition>
    </xacml3:Rule>
</xacml3:Policy>
Другие вопросы по тегам