Как с помощью ABAC выразить правило, согласно которому субъекту A разрешено делиться ресурсом X с субъектом B?

Используя ABAC, довольно легко выразить такие правила, как:

A Subject (with position = 'Manager') is allowed to perform Action (with name = 'Write') on a Resource (with class = 'Document' and type = 'Report').

Однако при управлении событиями обмена необходимо указать два типа субъектов: лицо, которое осуществляет обмен, и предполагаемый получатель.

Например: менеджер может захотеть поделиться отчетом с младшим в своем отделе.

Можно записать это в виде набора правил, включающих оба типа Субъектов, но как выразить «направленность» обмена, например, Менеджер может делиться с Младшим, но не наоборот? Я пробовал несколько подходов, но все они кажутся очень многословными из-за структуры «Тема-> Ресурс-> Тема», и я не уверен, что они действительно отражают всю семантику совместного доступа к контенту с контролируемым доступом, как это может произойти в онлайн-социальной сети. сеть.

Возможно, для этого существует базовый «шаблон проектирования» ABAC...


person rugplots    schedule 14.08.2018    source источник


Ответы (1)


Есть несколько способов смоделировать это в ABAC. В моем примере я буду использовать ALFA в качестве языка. ALFA транслируется непосредственно в XACML.

Использование дополнительных атрибутов ресурсов

Менеджеры могут делиться отчетами с младшим персоналом в своем отделе.

В псевдокоде это станет

Пользователь с ролью == «менеджер» может выполнять действие == «поделиться» с объектом типа == «отчет», если user.department == получатель.отдел И получатель.уровень == «младший»

В этом примере атрибуты определены, как показано ниже:

  • роль категории доступ-субъект, тип строка
  • действие категории действие, введите строку
  • тип ресурса категории, тип string
  • user.department категории access-subject, тип string
  • получатель.отдел ресурса категории, введите строку
  • получатель.уровень ресурса категории, введите строку

Использование категории получателя-субъекта

Теперь, конечно, вы можете возразить, что получатель — это не ресурс, а скорее... получатель. Вот почему XACML изобрел другой тип тематической категории, получатель-субъект (urn:oasis:names:tc:xacml:1.0:subject-category:recipient-subject).

На самом деле XACML позволяет вам определять свои собственные пользовательские категории в дополнение к стандартные. Напоминаем, что XACML предоставляет

  • урна:оазис:имена:tc:xacml:3.0:категория-атрибутов:ресурс
  • урна:оазис:имена:tc:xacml:3.0:категория-атрибутов:действие
  • урна:оазис:имена:tc:xacml:3.0:категория-атрибутов:окружающая среда
  • urn:oasis:names:tc:xacml:1.0:subject-category:access-subject
  • urn:oasis:names:tc:xacml:1.0:subject-category:recipient-subject
  • urn:oasis:names:tc:xacml:1.0:subject-category:intermediate-subject
  • urn:oasis:names:tc:xacml:1.0:subject-category:codebase
  • urn:oasis:names:tc:xacml:1.0:subject-category:requesting-machine

Имея это в виду, атрибуты становятся:

  • роль категории доступ-субъект, тип строка
  • действие категории действие, введите строку
  • тип ресурса категории, тип string
  • user.department категории access-subject, тип string
  • получатель.отдел категории recipient-subject, тип string
  • получатель.уровень категории recipient-subject, тип string

И политика ALFA становится

/**
 * Control access to reports
 */
policyset report{
    target clause objectType == "report"
    apply firstApplicable
    /**
     * Share reports
     */
    policy shareReport{
        target clause actionId == "share"
        apply firstApplicable
        /**
         * Managers can share reports if...
         */
        rule managers{
            target clause user.role == "manager" and recipient.level == "junior"
            condition user.department == recipient.department
            permit
        }
    }
} 

В XACML политика становится

<?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:PolicySet
    PolicyCombiningAlgId="urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:first-applicable"
    PolicySetId="http://axiomatics.com/alfa/identifier/com.axio.report"
    Version="1.0"
    xmlns:xacml3="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17">
    <xacml3:Description>Control access to reports</xacml3:Description>
    <xacml3:PolicySetDefaults>
        <xacml3:XPathVersion>http://www.w3.org/TR/1999/REC-xpath-19991116
        </xacml3:XPathVersion>
    </xacml3:PolicySetDefaults>
    <xacml3:Target>
        <xacml3:AnyOf>
            <xacml3:AllOf>
                <xacml3:Match
                    MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                    <xacml3:AttributeValue
                        DataType="http://www.w3.org/2001/XMLSchema#string">report</xacml3:AttributeValue>
                    <xacml3:AttributeDesignator
                        AttributeId="com.axiomatics.objectType"
                        Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
                        DataType="http://www.w3.org/2001/XMLSchema#string"
                        MustBePresent="false" />
                </xacml3:Match>
            </xacml3:AllOf>
        </xacml3:AnyOf>
    </xacml3:Target>
    <xacml3:Policy
        PolicyId="http://axiomatics.com/alfa/identifier/com.axio.report.shareReport"
        RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable"
        Version="1.0">
        <xacml3:Description>Share reports</xacml3:Description>
        <xacml3:PolicyDefaults>
            <xacml3:XPathVersion>http://www.w3.org/TR/1999/REC-xpath-19991116
            </xacml3:XPathVersion>
        </xacml3:PolicyDefaults>
        <xacml3:Target>
            <xacml3:AnyOf>
                <xacml3:AllOf>
                    <xacml3:Match
                        MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                        <xacml3:AttributeValue
                            DataType="http://www.w3.org/2001/XMLSchema#string">share</xacml3:AttributeValue>
                        <xacml3:AttributeDesignator
                            AttributeId="com.axiomatics.actionId"
                            Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action"
                            DataType="http://www.w3.org/2001/XMLSchema#string"
                            MustBePresent="false" />
                    </xacml3:Match>
                </xacml3:AllOf>
            </xacml3:AnyOf>
        </xacml3:Target>
        <xacml3:Rule Effect="Permit"
            RuleId="com.axio.report.shareReport.managers">
            <xacml3:Description>Managers can share reports if...
            </xacml3:Description>
            <xacml3:Target>
                <xacml3:AnyOf>
                    <xacml3:AllOf>
                        <xacml3:Match
                            MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                            <xacml3:AttributeValue
                                DataType="http://www.w3.org/2001/XMLSchema#string">manager</xacml3:AttributeValue>
                            <xacml3:AttributeDesignator
                                AttributeId="com.axiomatics.user.role"
                                Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
                                DataType="http://www.w3.org/2001/XMLSchema#string"
                                MustBePresent="false" />
                        </xacml3:Match>
                        <xacml3:Match
                            MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                            <xacml3:AttributeValue
                                DataType="http://www.w3.org/2001/XMLSchema#string">junior</xacml3:AttributeValue>
                            <xacml3:AttributeDesignator
                                AttributeId="com.axiomatics.recipient.level"
                                Category="urn:oasis:names:tc:xacml:1.0:subject-category:recipient-subject"
                                DataType="http://www.w3.org/2001/XMLSchema#string"
                                MustBePresent="false" />
                        </xacml3:Match>
                    </xacml3:AllOf>
                </xacml3:AnyOf>
            </xacml3:Target>
            <xacml3:Condition>
                <xacml3:Apply
                    FunctionId="urn:oasis:names:tc:xacml:3.0:function:any-of-any">
                    <xacml3:Function
                        FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal" />
                    <xacml3:AttributeDesignator
                        AttributeId="com.axiomatics.user.department"
                        Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
                        DataType="http://www.w3.org/2001/XMLSchema#string"
                        MustBePresent="false" />
                    <xacml3:AttributeDesignator
                        AttributeId="com.axiomatics.recipient.department"
                        Category="urn:oasis:names:tc:xacml:1.0:subject-category:recipient-subject"
                        DataType="http://www.w3.org/2001/XMLSchema#string"
                        MustBePresent="false" />
                </xacml3:Apply>
            </xacml3:Condition>
        </xacml3:Rule>
    </xacml3:Policy>
</xacml3:PolicySet>
person David Brossard    schedule 14.08.2018
comment
Отличный ответ, @david-brossard! - person rugplots; 15.08.2018
comment
Ключом к вашему ответу является использование этих настраиваемых категорий с концепцией «получатель», поэтому вы можете маркировать субъектов по ролям в транзакции. В своих попытках я пытался добиться этого с помощью дополнительных предложений AllOf, и мне пришлось разделить действие «поделиться» на «поделиться-отдать» и «поделиться-получить», что было очень уродливым (сложным) и многословным. Ваша формулировка намного чище. Выражение в форме АЛЬФА делает намерение еще более ясным. Благодарю вас! - person rugplots; 15.08.2018