Модель авторизации: контекст роли?

В настоящее время я пытаюсь разработать модель авторизации, которая имеет следующие компоненты:

Привилегии - действие, которое может быть предоставлено или отклонено пользователю / группе

Роли - набор привилегий; роли могут быть связаны с пользователем или группой

Объекты безопасности - объект, к которому применяется защита

Владельцы объекта - владелец объекта безопасности

Статусы - атрибут, представляющий состояние объекта безопасности

Пользователи - стандартные потребители услуг; может быть отказано или предоставлен доступ к вещам

Группы - совокупность пользователей, разделяющих общее дело; роли могут быть назначены группам; привилегии могут быть назначены группам

У меня следующие вопросы: есть ли способ правильно смоделировать контекст роли с текущими компонентами, которые я представил выше?

Например, допустим, у меня есть текущий оператор авторизации:

Tim can see Mary's profile information because Tim is Mary's friend.

Я могу разбить это утверждение на компоненты модели:

User: Tim
Security Object: profile information
Object Owner: Mary
Privilege: view
Role: friend
Group: N/A?
Status: N/A

Одна вещь, которую это рассечение не приписывает, - то, что Тим - друг Мэри

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

1 ответ

Решение

На самом деле, вы не должны пытаться реализовать новую модель авторизации. Уже существует хорошая модель, называемая управлением доступом на основе атрибутов (или ABAC - см. Теги SO abac и xacml).

ABAC - это модель авторизации, которая:

  • определено NIST, Национальным институтом стандартов и технологий, той же самой организацией, которая определяет RBAC (управление доступом на основе ролей)
  • использует атрибуты для определения логики контроля доступа. Атрибуты
    • являются парой ключ-значение, например роль == менеджер
    • может быть многозначным, например, гражданство = канадский, шведский
    • может описать что угодно, например, запрашивающего пользователя, целевой объект, действие, отношения, время, местоположение...
  • использует политики для определения логики контроля доступа. Эти политики
    • написаны на XACML ( xacml)
    • использовать атрибуты для определения области контроля доступа
  • обеспечивает внешнюю авторизацию: по сути, ваша логика авторизации отделена от вашей бизнес-логики. Это здорово, потому что вы можете разрабатывать свои приложения независимо от вашей безопасности.

Давайте возьмем ваш пример:

Тим может видеть информацию о профиле Мэри, потому что Тим - друг Мэри.

Следовательно, требование авторизации будет:

A user can view another user's profile if both users are friends.

В ABAC вы должны определить свои атрибуты. Вы делаете это в своем вопросе, что замечательно, хотя ваш анализ смещен на роль. Давайте возьмем это снова. Я вижу следующие атрибуты:

  • идентификатор действия (просмотр)
  • тип ресурса (профиль пользователя)
  • список друзей (список друзей Тима)
  • владелец профиля (Мария)

С помощью этих атрибутов я могу переписать ваше требование в разобранном виде:

A user can do the action actionId==view on a resource of type==user profile if profile.owner is in the user's friend list.

Затем вы можете использовать ALFA ( alfa) для реализации политики в ALFA, а затем XACML.

namespace com.axiomatics{
    /**
     * A user can view another user's profile...
     */
    policy viewProfile{
        target clause actionId=="view" and resourceType=="user profile"
        apply firstApplicable
        /**
         * Allow if both users are friends.
         */
        rule allowIfFriends{
            condition stringIsIn(stringOneAndOnly(subjectId), friendList)
            permit
        }
    }
}

Результат XACML (в XML):

<?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/com.axiomatics.viewProfile"
    RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable"
    Version="1.0">
    <xacml3:Description>A user can view another user's profile...</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">view</xacml3:AttributeValue>
                    <xacml3:AttributeDesignator 
                        AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id"
                        DataType="http://www.w3.org/2001/XMLSchema#string"
                        Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action"
                        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">user profile</xacml3:AttributeValue>
                    <xacml3:AttributeDesignator 
                        AttributeId="resourceType"
                        DataType="http://www.w3.org/2001/XMLSchema#string"
                        Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
                        MustBePresent="false"
                    />
                </xacml3:Match>
            </xacml3:AllOf>
        </xacml3:AnyOf>
    </xacml3:Target>
    <xacml3:Rule 
            Effect="Permit"
            RuleId="http://axiomatics.com/alfa/identifier/com.axiomatics.viewProfile.allowIfFriends">
        <xacml3:Description>Allow if both users are friends.</xacml3:Description>
        <xacml3:Target />
        <xacml3:Condition>
            <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-is-in" >
                <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-one-and-only" >
                    <xacml3:AttributeDesignator 
                        AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id"
                        DataType="http://www.w3.org/2001/XMLSchema#string"
                        Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
                        MustBePresent="false"
                    />
                </xacml3:Apply>
                <xacml3:AttributeDesignator 
                    AttributeId="friendList"
                    DataType="http://www.w3.org/2001/XMLSchema#string"
                    Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
                    MustBePresent="false"
                />
            </xacml3:Apply>
        </xacml3:Condition>
    </xacml3:Rule>
</xacml3:Policy>
Другие вопросы по тегам