Модель авторизации: контекст роли?
В настоящее время я пытаюсь разработать модель авторизации, которая имеет следующие компоненты:
Привилегии - действие, которое может быть предоставлено или отклонено пользователю / группе
Роли - набор привилегий; роли могут быть связаны с пользователем или группой
Объекты безопасности - объект, к которому применяется защита
Владельцы объекта - владелец объекта безопасности
Статусы - атрибут, представляющий состояние объекта безопасности
Пользователи - стандартные потребители услуг; может быть отказано или предоставлен доступ к вещам
Группы - совокупность пользователей, разделяющих общее дело; роли могут быть назначены группам; привилегии могут быть назначены группам
У меня следующие вопросы: есть ли способ правильно смоделировать контекст роли с текущими компонентами, которые я представил выше?
Например, допустим, у меня есть текущий оператор авторизации:
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>