Сложный XACML, комбинации и зависимости пакетов

У меня есть запрос XACML (псевдо-xacml):

<Request>
    <Attributes Category="resource">
        <Attribute AttributeId="product">
            <AttributeValue>A</AttributeValue>
        </Attribute>
        <Attribute AttributeId="market">
            <AttributeValue>M2</AttributeValue>
            <AttributeValue>M3</AttributeValue>
        </Attribute>
        <Attribute AttributeId="slice">
            <AttributeValue>fus</AttributeValue>
            <AttributeValue>do</AttributeValue>
            <AttributeValue>rah</AttributeValue>
        </Attribute>
    </Attributes>


    <Attributes Category="subject">
        <Attribute AttributeId="product-market-slice-access">
            <AttributeValue>A:::M2:::fus</AttributeValue>
            <AttributeValue>A:::M2:::do</AttributeValue>
            <AttributeValue>A:::M2:::rah</AttributeValue>
            <AttributeValue>A:::M3:::fus</AttributeValue>
            <AttributeValue>A:::M3:::do</AttributeValue>
            <!--<AttributeValue>A:::M3:::rah</AttributeValue>--> <!-- Missing attribute, permission denied! -->
        </Attribute>
    </Attributes>

</Request>

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

Есть ли способ выразить это в политике XACML / ALFA?

Если бы в XACML была функция, которая могла бы «объединять» пакеты (подумайте о sql-join), это было бы полезно. Таким образом, я мог использовать комбинацию функций AnyOfAll и String-Equal.

Псевдо-xml требуемой функции:

<WantedFunction>
    <Input>
        <Separator>:::</Separator>
        <Bag>
            <AttributeValue>A</AttributeValue>
            <AttributeValue>B</AttributeValue>
        </Bag>
        <Bag>
            <AttributeValue>M2</AttributeValue>
            <AttributeValue>M3</AttributeValue>
        </Bag>
        <Bag>
            <AttributeValue>fus</AttributeValue>
            <AttributeValue>do</AttributeValue>
            <AttributeValue>rah</AttributeValue>
        </Bag>
    </Input>

    <Output>
        <Bag>
            <AttributeValue>A:::M2:::fus</AttributeValue>
            <AttributeValue>A:::M2:::do</AttributeValue>
            <AttributeValue>A:::M2:::rah</AttributeValue>
            <AttributeValue>A:::M3:::fus</AttributeValue>
            <AttributeValue>A:::M3:::do</AttributeValue>
            <AttributeValue>A:::M3:::rah</AttributeValue>
            <AttributeValue>B:::M2:::fus</AttributeValue>
            <AttributeValue>B:::M2:::do</AttributeValue>
            <AttributeValue>B:::M2:::rah</AttributeValue>
            <AttributeValue>B:::M3:::fus</AttributeValue>
            <AttributeValue>B:::M3:::do</AttributeValue>
            <AttributeValue>B:::M3:::rah</AttributeValue>
        </Bag>
    </Output>
</WantedFunction>

person jad    schedule 04.10.2018    source источник
comment
Привет, какова твоя конечная цель?   -  person David Brossard    schedule 04.10.2018
comment
Здравствуйте, цель состоит в том, чтобы разделить управление доступом для атрибута среза. В запросе может быть несколько рынков и любое количество сегментов. Пользователю должен быть предоставлен явный доступ к одному сегменту на одном рынке (в рамках продукта) (например, доступ к разделу слияния на рынке M3 для продукта A). Изначально у нас был атрибут slice как один уровень, но это означало бы, что у пользователя будет доступ, например, к fus независимо от запрашиваемых рынков.   -  person jad    schedule 05.10.2018
comment
Подходит ли вам подход mdp? Какой движок вы используете?   -  person David Brossard    schedule 05.10.2018
comment
MDP выглядит интересно, я разберусь в этом дальше. В настоящее время мы используем balana с некоторым пользовательским библиотечным кодом. У нас есть еще одна команда, которая исследует продукты аксиоматики.   -  person jad    schedule 05.10.2018
comment
Не стесняйтесь обращаться ко мне лично, если у вас есть какие-либо вопросы. Всегда рады помочь.   -  person David Brossard    schedule 05.10.2018


Ответы (1)


Это отличный вопрос, и я рад видеть, что вы тоже используете ALFA. Позвольте мне пролить на это немного света.

Запрос

Прежде всего, в запросе XACML отправка атрибута как двух отдельных атрибутов аналогична отправке его как одного атрибута. Например, следующие два запроса одинаковы.

Может ли клиент Алиса, которая также является сотрудником, просмотреть страховой полис 123?

Пример запроса 1

<?xml version="1.0" encoding="UTF-8"?><xacml-ctx:Request ReturnPolicyIdList="true" CombinedDecision="false" xmlns:xacml-ctx="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17">
   <xacml-ctx:Attributes Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" >
      <xacml-ctx:Attribute AttributeId="com.axiomatics.user.type" IncludeInResult="true">
         <xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">customer</xacml-ctx:AttributeValue>
      </xacml-ctx:Attribute>
      <xacml-ctx:Attribute AttributeId="com.axiomatics.user.type" IncludeInResult="true">
         <xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">employee</xacml-ctx:AttributeValue>
      </xacml-ctx:Attribute>
      <xacml-ctx:Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id" IncludeInResult="true">
         <xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">alice</xacml-ctx:AttributeValue>
      </xacml-ctx:Attribute>
   </xacml-ctx:Attributes>
   <xacml-ctx:Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action" >
      <xacml-ctx:Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" IncludeInResult="true">
         <xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">view</xacml-ctx:AttributeValue>
      </xacml-ctx:Attribute>
   </xacml-ctx:Attributes>
   <xacml-ctx:Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource" >
      <xacml-ctx:Attribute AttributeId="com.axiomatics.resource.type" IncludeInResult="true">
         <xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">insurance policy</xacml-ctx:AttributeValue>
      </xacml-ctx:Attribute>
      <xacml-ctx:Attribute AttributeId="com.axiomatics.policy.polId" IncludeInResult="true">
         <xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">123</xacml-ctx:AttributeValue>
      </xacml-ctx:Attribute>
   </xacml-ctx:Attributes>
</xacml-ctx:Request>

Пример запроса 2

<?xml version="1.0" encoding="UTF-8"?><xacml-ctx:Request ReturnPolicyIdList="true" CombinedDecision="false" xmlns:xacml-ctx="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17">
   <xacml-ctx:Attributes Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" >
      <xacml-ctx:Attribute AttributeId="com.axiomatics.user.type" IncludeInResult="true">
         <xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">customer</xacml-ctx:AttributeValue>
         <xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">employee</xacml-ctx:AttributeValue>
      </xacml-ctx:Attribute>
      <xacml-ctx:Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id" IncludeInResult="true">
         <xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">alice</xacml-ctx:AttributeValue>
      </xacml-ctx:Attribute>
   </xacml-ctx:Attributes>
   <xacml-ctx:Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action" >
      <xacml-ctx:Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" IncludeInResult="true">
         <xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">view</xacml-ctx:AttributeValue>
      </xacml-ctx:Attribute>
   </xacml-ctx:Attributes>
   <xacml-ctx:Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource" >
      <xacml-ctx:Attribute AttributeId="com.axiomatics.resource.type" IncludeInResult="true">
         <xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">insurance policy</xacml-ctx:AttributeValue>
      </xacml-ctx:Attribute>
      <xacml-ctx:Attribute AttributeId="com.axiomatics.policy.polId" IncludeInResult="true">
         <xacml-ctx:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">123</xacml-ctx:AttributeValue>
      </xacml-ctx:Attribute>
   </xacml-ctx:Attributes>
</xacml-ctx:Request>

Атрибуты - сумки

В XACML атрибутом всегда является мешок. Он всегда многозначен, даже если содержит ноль или одно значение. Это означает, что если вы хотите работать с атрибутом, вам нужно помнить, что это мешок. Например, если вы хотите объединить рынок со срезом, вам придется либо преобразовать его в одно значение (и это работает, только если это действительно одно значение), либо использовать функции более высокого порядка. Функция высшего порядка - это функция, которая принимает другую функцию в качестве параметра, например. Все.

Объединение многозначных атрибутов

Можно было бы использовать stringConcatenate, но эта функция работает только с атомарными значениями. Вы можете использовать карту, чтобы применить ее к сумке, но, к сожалению, в вашем случае вам понадобится карта, способная работать с несколькими сумками.

Решение: использование нескольких запросов на решение

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

Может ли Алиса просматривать, редактировать, удалять записи 1,2,3?

Ответ будет содержать столько решений, сколько произведение комбинаций (в данном случае 1x3x3).

В вашем случае вы бы объединили все решения в одно. Если все разрешено, то разрешено, иначе отказано. Для этого в MDP есть параметр. Он называется CombinedDecision.

Имея это в виду, вот как будет выглядеть политика (с использованием нотации ALFA) :

namespace com.axiomatics{
    attribute product{
        category = resourceCat
        id = "product"
        type = string
    }
    attribute market{
        category = resourceCat
        id = "market"
        type = string
    }
    attribute slice{
        category = resourceCat
        id = "slice"
        type = string
    }

    attribute productMarketSliceAccess{
        category = subjectCat
        id = "product-market-slice-access"
        type = string
    }

    policy userAccessProductMarketSlice{
        apply firstApplicable
        rule allowAccess{
            permit
            condition stringIsIn(stringOneAndOnly(product)+
                                 stringOneAndOnly(market)+
                                 stringOneAndOnly(slice),productMarketSliceAccess)
        }
    }
}

Образец запроса - MDP

{
    "Request": {
        "CombinedDecision": true,
        "AccessSubject": {
            "Attribute": [
                {
                    "AttributeId": "product-market-slice-access",
                    "Value": "BAC"
                },
                {
                    "AttributeId": "product-market-slice-access",
                    "Value": "DEF"
                }
            ]
        },
        "Resource": [{
            "Attribute": [
                {
                    "AttributeId": "market",
                    "Value": "A"
                },
                {
                    "AttributeId": "product",
                    "Value": "B"
                },
                {
                    "AttributeId": "slice",
                    "Value": "C"
                }
            ]
        },{
            "Attribute": [
                {
                    "AttributeId": "market",
                    "Value": "E"
                },
                {
                    "AttributeId": "product",
                    "Value": "D"
                },
                {
                    "AttributeId": "slice",
                    "Value": "F"
                }
            ]
        }],
        "Action": {
            "Attribute": []
        },
        "Environment": {
            "Attribute": []
        }
    }
}
person David Brossard    schedule 04.10.2018
comment
Спасибо за подробный ответ. Насколько я понимаю, это означает, что мне придется отредактировать код, который генерирует xacml-запрос, и не могу сохранить свой исходный запрос? - person jad; 05.10.2018
comment
Да, это правильно. У вас есть еще 2 варианта (по крайней мере, в Axiomatics): настраиваемая функция или настраиваемая картинка в картинке. - person David Brossard; 05.10.2018