Используя 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').
Однако при управлении событиями общего доступа вам необходимо указать два типа субъектов: лицо, которое осуществляет совместное использование, и предполагаемый получатель.
Например: менеджер может пожелать поделиться отчетом с младшим в своем отделе.
Можно написать это как серию правил, включающих оба типа Субъекта, но как вы выражаете "направленность" совместного использования, например, Менеджер может поделиться с Младшим, но не наоборот? Я пробовал несколько подходов, но все они кажутся очень многословными из-за структуры Subject->Resource->Subject, и я не уверен, что они действительно отражают всю семантику совместного доступа к контенту, контролируемому доступом, что может случиться в онлайн-сообществе. сеть.
Возможно, для этого есть базовый шаблон проектирования ABAC....
1 ответ
Есть несколько способов смоделировать это в ABAC. Я буду использовать ALFA в качестве языка в моем примере. ALFA переводится непосредственно в XACML.
Использование дополнительных атрибутов ресурса
Менеджеры могут делиться отчетами с младшим персоналом в своем отделе.
В псевдокоде это станет
Пользователь с ролью == "менеджер" может выполнить действие == "поделиться" с объектом типа == "отчет", если user.department == receient.department AND receient.level == "младший"
В этом примере атрибуты определены следующим образом:
- роль категории access-subject, тип string
- действие категории действие, введите строку
- тип ресурса категории, тип строки
- user.department категории access-subject, типа строка
- получатель.отдел ресурса категории, введите строку
- получатель.уровень ресурса категории, введите строку
Использование категории получателя
Теперь, конечно, вы можете утверждать, что получатель - это не ресурс, а... получатель. Вот почему XACML изобрел категорию субъекта другого типа, тему-получатель (urn:oasis:names:tc:xacml:1.0: тема-категория: тема-получатель).
На самом деле, XACML позволяет вам определять свои собственные пользовательские категории в дополнение к стандартным. В качестве напоминания XACML предоставляет
- Урна: оазис: имена: дц: XACML: 3.0: атрибут-категория: ресурс
- Урна: оазис: имена: дц: XACML: 3.0: атрибут-категория: действие
- Урна: оазис: имена: дц: XACML: 3.0: атрибут-категория: окружающая среда
- Урна: оазис: имена: дц: XACML: 1.0: субъект-категория: доступ объект съемка
- Урна: оазис: имена: дц: XACML: 1.0: субъект-категория: реципиент-субъектный
- Урна: оазис: имена: TC: XACML: 1,0: субъект-категория: посредник-субъектный
- Урна: оазис: имена: дц: XACML: 1.0: субъект-категория: кодовая
- Урна: оазис: имена: дц: XACML: 1.0: субъект-категория: запрашивающая-машина
Имея это в виду, атрибуты становятся:
- роль категории access-subject, тип string
- действие категории действие, введите строку
- тип ресурса категории, тип строки
- user.department категории access-subject, типа строка
- получатель.департамент категории получатель-тема, введите строку
- получатель.уровень категории получатель-тема, введите строку
И политика 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>