O que é XACML?
Como o nome sugere, a Linguagem de Marcação Extensível de Controlo de Acesso (XACML) é uma linguagem baseada em XML usada principalmente para controlo de acesso. É um padrão definido pela Organização para o Avanço dos Padrões de Informação Estruturada (OASIS).
XACML 3.0 é a versão mais recente do padrão, lançada em 2013. Embora não especifique um modelo particular de controlo de acesso, o XACML é frequentemente usado para implementar políticas de Controlo de acesso baseado em atributos (ABAC) . Vamos ver um exemplo simples de como o XACML pode ser usado para representar políticas ABAC:
<PolicySet PolicySetId="ABAC_Policies" PolicyCombiningAlgId="urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:deny-overrides">
<Description>Políticas ABAC</Description>
<Policy PolicyId="Policy1" RuleCombiningAlgId="urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides">
<Description>Os funcionários podem ler dados</Description>
<Target>
<AnyOf>
<AllOf>
<Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">read</AttributeValue>
<AttributeDesignator
AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id"
Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action"
DataType="http://www.w3.org/2001/XMLSchema#string"
MustBePresent="true"
/>
</Match>
</AllOf>
</AnyOf>
</Target>
<Rule RuleId="Rule1" Effect="Permit">
<Target>
<AnyOf>
<AllOf>
<Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">employee</AttributeValue>
<AttributeDesignator
AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id"
Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
DataType="http://www.w3.org/2001/XMLSchema#string"
MustBePresent="true"
/>
</Match>
</AllOf>
</AnyOf>
</Target>
</Rule>
<Rule RuleId="Rule2" Effect="Deny">
<Target>
<AnyOf>
<AllOf>
<Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">user</AttributeValue>
<AttributeDesignator
AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id"
Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
DataType="http://www.w3.org/2001/XMLSchema#string"
MustBePresent="true"
/>
</Match>
</AllOf>
</AnyOf>
</Target>
</Rule>
</Policy>
<!-- ...outras políticas... -->
</PolicySet>
O XACML faz um bom trabalho em convenções de nomenclatura autoexplicativas. A linguagem é projetada para ser legível por humanos e fácil de entender.
Em resumo, esta política afirma que os funcionários têm permissão para ler dados, e os utilizadores são negados a ler dados. Vamos decompor a política analisando os componentes principais:
<PolicySet>
: O elemento raiz do conjunto de políticas. UmPolicySet
pode conter múltiplos elementosPolicy
ePolicySet
, formando uma hierarquia de políticas.<Policy>
: Uma política que contém uma ou mais regras. Cada política pode ter:- Um elemento
Target
que especifica as condições sob as quais a política se aplica. - Múltiplos elementos
Rule
que definem as regras de controlo de acesso. - Um atributo
RuleCombiningAlgId
que especifica como as regras são combinadas para tomar uma decisão.
- Um elemento
<Rule>
: Uma regra que define as condições sob as quais o acesso é concedido ou negado. Cada regra tem:- Um elemento
Target
que especifica as condições sob as quais a regra se aplica. - Um atributo
Effect
que especifica se a regra permite ou nega o acesso.
- Um elemento
[!Note] Os componentes e atributos disponíveis no XACML não se limitam aos que acabamos de mencionar. Consulte a especificação XACML 3.0 para uma lista completa de elementos e atributos.
Uma representação gráfica da relação entre os diferentes componentes principais é mostrada abaixo:
Uma explicação detalhada de outros elementos e atributos no exemplo será fornecida nas seções seguintes.
Como o XACML funciona
Para simplificar, vamos assumir que apenas uma política está definida no conjunto de políticas acima. Para acionar o processo de avaliação da política, um pedido de decisão precisa ser enviado de um ponto de aplicação de política (PEP) para um ponto de decisão de política (PDP). O PDP avalia o pedido em relação à política e retorna uma decisão de autorização ao PEP.
- PEP: O componente que envia o pedido de decisão ao PDP e aplica a decisão de autorização (ou seja, executa Controlo de acesso ).
- PDP: O componente que avalia o pedido de decisão em relação à política e retorna a decisão de autorização.
Vamos usar um exemplo do mundo real para substituir a linguagem shakespeariana. Suponha que exista uma aplicação web que permite aos funcionários aceder a certos recursos, e a aplicação está integrada com um sistema de autorização baseado em XACML.
Quando um funcionário tenta aceder a um recurso, a aplicação web (PEP) envia um pedido de decisão ao sistema de autorização (PDP). Uma vez que o sistema de autorização avalia o pedido em relação à política XACML, ele retorna uma decisão de autorização à aplicação web.
Pedido de decisão
Um pedido de decisão no XACML consiste nos seguintes componentes principais:
- Subject: A entidade que solicita acesso a um recurso. Pode ser um utilizador, dispositivo ou qualquer outra entidade.
- Resource: O recurso a ser acedido. Pode ser um ficheiro, base de dados, endpoint de API ou qualquer outro recurso.
- Action: A ação a ser realizada no recurso. Pode ser ler, escrever, eliminar ou qualquer outra ação.
- Environment: O contexto em que o pedido de acesso é feito. Pode incluir informações como hora do dia, localização ou qualquer outra informação contextual.
Aqui está um exemplo de um pedido de decisão no XACML:
<Request>
<Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource">
<Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id" DataType="http://www.w3.org/2001/XMLSchema#string">
<AttributeValue>http://example.com/data</AttributeValue>
</Attribute>
</Attributes>
<Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action">
<Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" DataType="http://www.w3.org/2001/XMLSchema#string">
<AttributeValue>read</AttributeValue>
</Attribute>
</Attributes>
<Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:subject">
<Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id" DataType="http://www.w3.org/2001/XMLSchema#string">
<AttributeValue>employee</AttributeValue>
</Attribute>
</Attributes>
</Request>
Processo de avaliação
Uma vez que o PDP recupera o conjunto de políticas, ele avalia o pedido de decisão da seguinte forma:
- Correspondência de alvo: Para cada política, o PDP verifica se o pedido corresponde ao alvo da política. Se o pedido corresponder ao alvo, o PDP prossegue para avaliar as regras.
- Avaliação de regras: O PDP avalia cada regra na política. Se o alvo de uma regra corresponder ao pedido, o PDP avalia a condição da regra. Se a condição for avaliada como
true
, o PDP retorna o efeito da regra (permitir ou negar). Se a condição for avaliada comofalse
, o PDP continua avaliando a próxima regra. - Combinação de regras: O PDP combina os efeitos de todas as regras na política com base no atributo
RuleCombiningAlgId
da política. O efeito combinado é então retornado como a decisão da política. - Combinação de políticas: Se o conjunto de políticas contiver múltiplas políticas, o PDP combina as decisões de todas as políticas com base no atributo
PolicyCombiningAlgId
do conjunto de políticas. A decisão combinada é então retornada como a decisão final de autorização.
Exemplo 1
Por exemplo, no conjunto de políticas de exemplo, vamos supor que o pedido de decisão seja como acima. O PDP avaliaria o pedido em relação à política Policy1
da seguinte forma:
Correspondência de alvo
O Target
da política especifica que qualquer sujeito que tenha um ID de ação de read
deve ser avaliado pela política. Como a ação do pedido é read
, o pedido corresponde ao alvo da política.
Avaliação de regras
A política contém duas regras:
Rule1
: Como o ID do sujeito do pedido éemployee
, a condição da regra é avaliada comotrue
, e o efeito da regra éPermit
.Rule2
: Como o ID do sujeito do pedido não éuser
, a condição da regra é avaliada comofalse
, e o efeito da regra éNotApplicable
.
Combinação de regras e políticas
- Como a
Policy1
usa o algoritmo de combinação de regrasdeny-overrides
, a decisão da política éPermit
porque aRule1
permite o acesso e seu efeito sobrepõe o efeitoNotApplicable
daRule2
. - O conjunto de políticas também usa o algoritmo de combinação de políticas
deny-overrides
, e a decisão final éPermit
porque a decisão da política éPermit
.
Aqui está uma representação gráfica não normativa do processo de avaliação:
Exemplo 2
Agora, vamos considerar um pedido de decisão diferente onde todos os outros atributos são os mesmos, mas o ID do sujeito é user
em vez de employee
.
Correspondência de alvo
Como a ação não mudou, o pedido ainda corresponde ao alvo da política.
Avaliação de regras
Rule1
: O ID do sujeito do pedido não éemployee
, então a condição da regra é avaliada comofalse
, e o efeito da regra éNotApplicable
.Rule2
: O ID do sujeito do pedido éuser
, então a condição da regra é avaliada comotrue
, e o efeito da regra éDeny
.
Combinação de regras e políticas
- A decisão da política é
Deny
porque aRule2
nega o acesso, e seu efeito sobrepõe o efeitoNotApplicable
daRule1
. - A decisão final é
Deny
porque o algoritmo de combinação de políticasdeny-overrides
do conjunto de políticas retorna a decisão mais restritiva.
Aqui está uma representação gráfica não normativa do processo de avaliação:
Exemplo 3
Por último, vamos considerar um pedido de decisão onde a ação é write
em vez de read
. Todos os outros atributos permanecem os mesmos que no exemplo 1.
Correspondência de alvo
O pedido já não corresponde ao alvo da política porque a ação é write
, não read
. Portanto, a política não é avaliada.
Combinação de regras e políticas
Como a política não é avaliada, a decisão final é NotApplicable
.
Aqui está uma representação gráfica não normativa do processo de avaliação:
Algoritmos de combinação
O XACML define vários algoritmos de combinação padrão que determinam como os efeitos de múltiplas regras ou políticas são combinados para tomar uma decisão. Nos exemplos acima, mencionamos o algoritmo de combinação deny-overrides
tanto para regras quanto para políticas.
Como o nome sugere, o algoritmo deny-overrides
prioriza decisões Deny
sobre decisões Permit
. Aqui está uma explicação simplificada de como o algoritmo deny-overrides
funciona:
- se qualquer regra ou política negar o acesso, a decisão final é
Deny
; - se nenhuma regra ou política negar o acesso, e PELO MENOS uma regra ou política permitir o acesso, a decisão final é
Permit
; - se nenhuma regra ou política negar o acesso, e NENHUMA regra ou política permitir o acesso, a decisão final é
NotApplicable
.
O algoritmo real é mais complexo e leva em consideração outras decisões “indeterminadas” como Indeterminate{D}
e Indeterminate{P}
.
[!Note] Este algoritmo não fornece uma decisão de “reserva” caso nenhuma regra ou política corresponda ao pedido. Nesses casos, a decisão é
NotApplicable
.
Para uma lista completa de algoritmos de combinação e seu comportamento, consulte a especificação XACML 3.0 .
Considerações de implementação
O XACML é uma linguagem poderosa para expressar políticas de controlo de acesso baseadas em atributos. Antes de implementar o XACML no teu sistema, considera o seguinte:
- Design de controlo de acesso: O XACML é flexível e expressivo, mas requer um design cuidadoso, pois pode envolver conjuntos de políticas complexos que podem levar a consequências não intencionais.
- Complexidade: As políticas XACML são frequentemente complexas e podem ser desafiadoras de gerir. Para a maioria das aplicações, modelos de controlo de acesso mais simples como Controlo de acesso baseado em funções (RBAC) podem ser mais apropriados.
- Desempenho: Avaliar políticas XACML pode ser computacionalmente dispendioso, especialmente ao lidar com grandes conjuntos de políticas. Considera as implicações de desempenho de usar XACML no teu sistema.