Вы можете легко сделать это в XACML (и ALFA - более легкий синтаксис XACML). Прежде всего, вы заявили, что:
Каждый раздел будет разрешать или запрещать
. Для этого вы будете использовать Политику для каждого раздела, который использует deny-unless-permit
объединяющий алгоритм. Это означает, что либо политика предоставит доступ, если будут выполнены условия, либо запретит доступ. Возможно, вы помните, что по умолчанию, если условия не выполняются, обычное решение - NotApplicable
. Использование deny-unless-permit
предотвратит это.
, и любое отклонение приведет к сбою общей политики
После того как вы написали каждую политику с использованием deny-unless-permit
, вы объедините их всев родительский набор политик, который будет использовать алгоритм объединения deny-overrides
. Это означает, что, если есть какое-либо решение об отказе, то это решение превзойдет все другие решения.
Это дает нам следующую структуру:
ALFA
namespace com.axiomatics{
/**
* Resource data labeling to provide access control to data
*/
policyset dataAccess{
apply denyOverrides
/**
* First check
*/
policy firstCheck{
apply denyUnlessPermit
/**
* Allow if clearance is sufficient
*/
rule clearanceCheck{
permit
condition com.acme.user.clearance > com.acme.record.classification
}
rule otherCheck{
// Fill in your checks here
permit
}
}
/**
* Second check...
*/
policy secondCheck{
apply denyUnlessPermit
}
}
}
Эквивалент в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:3.0:policy-combining-algorithm:deny-overrides"
PolicySetId="http://axiomatics.com/alfa/identifier/com.axiomatics.dataAccess"
Version="1.0"
xmlns:xacml3="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17">
<xacml3:Description>Resource data labeling to provide access control to
data</xacml3:Description>
<xacml3:PolicySetDefaults>
<xacml3:XPathVersion>http://www.w3.org/TR/1999/REC-xpath-19991116
</xacml3:XPathVersion>
</xacml3:PolicySetDefaults>
<xacml3:Target />
<xacml3:Policy
PolicyId="http://axiomatics.com/alfa/identifier/com.axiomatics.dataAccess.firstCheck"
RuleCombiningAlgId="urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-unless-permit"
Version="1.0">
<xacml3:Description>First check</xacml3:Description>
<xacml3:PolicyDefaults>
<xacml3:XPathVersion>http://www.w3.org/TR/1999/REC-xpath-19991116
</xacml3:XPathVersion>
</xacml3:PolicyDefaults>
<xacml3:Target />
<xacml3:Rule Effect="Permit"
RuleId="com.axiomatics.dataAccess.firstCheck.clearanceCheck">
<xacml3:Description>Allow if clearance is sufficient
</xacml3:Description>
<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:integer-greater-than" />
<xacml3:AttributeDesignator
AttributeId="com.acme.user.clearance"
Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
DataType="http://www.w3.org/2001/XMLSchema#integer"
MustBePresent="false" />
<xacml3:AttributeDesignator
AttributeId="com.acme.record.classification"
Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
DataType="http://www.w3.org/2001/XMLSchema#integer"
MustBePresent="false" />
</xacml3:Apply>
</xacml3:Condition>
</xacml3:Rule>
<xacml3:Rule Effect="Permit"
RuleId="com.axiomatics.dataAccess.firstCheck.otherCheck">
<xacml3:Description />
<xacml3:Target />
</xacml3:Rule>
</xacml3:Policy>
<xacml3:Policy
PolicyId="http://axiomatics.com/alfa/identifier/com.axiomatics.dataAccess.secondCheck"
RuleCombiningAlgId="urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-unless-permit"
Version="1.0">
<xacml3:Description>Second check...</xacml3:Description>
<xacml3:PolicyDefaults>
<xacml3:XPathVersion>http://www.w3.org/TR/1999/REC-xpath-19991116
</xacml3:XPathVersion>
</xacml3:PolicyDefaults>
<xacml3:Target />
</xacml3:Policy>
</xacml3:PolicySet>
Другие проверки
В дополнение к вашей структуре политики, вы упоминаете, что вы хотели бы контролировать доступ на основе атрибутов (например, пользователь может просматривать свой документ), а также на основепри явном контроле доступа (пользователь может просматривать документ, если он находится в списке для этого документа). Вы можете полностью реализовать контроль доступа по усмотрению (DAC) в XACML в дополнение к доступу на основе атрибутов. Вот пример:
/**
* Second check...
*/
policy secondCheck{
target clause com.acme.action.actionId == "view" and com.acme.object.objectType == "document"
apply denyUnlessPermit
/**
* Users can view documents they own
*/
rule owner{
permit
condition com.acme.record.owner==user.userId
}
/**
* Users in the whitelist can view the document
*/
rule dac{
permit
condition stringAtLeastOneMemberOf(user.userId, com.acme.record.whitelist)
}
}