O que é XACML?
Como o nome sugere, a Linguagem de Marcação Extensível para Controle de Acesso (XACML) é uma linguagem baseada em XML usada principalmente para controle de acesso. É um padrão definido pela Organização para o Avanço de 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 específico de controle de acesso, o XACML é frequentemente usado para implementar políticas de Controle de acesso baseado em atributos (ABAC) . Vamos ver um exemplo simples de como o XACML pode ser usado para representar políticas de 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>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 usuários são negados a ler dados. Vamos analisar 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 controle 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. Confira 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 próximas seções.
Como o XACML funciona
Para simplificar, vamos supor que apenas uma política está definida no conjunto de políticas acima. Para acionar o processo de avaliação da política, uma solicitação de decisão precisa ser enviada de um ponto de aplicação de política (PEP) para um ponto de decisão de política (PDP). O PDP avalia a solicitação em relação à política e retorna uma decisão de autorização para o PEP.
- PEP: O componente que envia a solicitação de decisão para o PDP e aplica a decisão de autorização (ou seja, realiza Controle de acesso ).
- PDP: O componente que avalia a solicitação 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 um aplicativo web que permite que funcionários acessem certos recursos, e o aplicativo está integrado a um sistema de autorização baseado em XACML.
Quando um funcionário tenta acessar um recurso, o aplicativo web (PEP) envia uma solicitação de decisão para o sistema de autorização (PDP). Uma vez que o sistema de autorização avalia a solicitação em relação à política XACML, ele retorna uma decisão de autorização para o aplicativo web.
Solicitação de decisão
Uma solicitação de decisão no XACML consiste nos seguintes componentes principais:
- Subject: A entidade que solicita acesso a um recurso. Pode ser um usuário, dispositivo ou qualquer outra entidade.
- Resource: O recurso sendo acessado. Pode ser um arquivo, banco de dados, endpoint de API ou qualquer outro recurso.
- Action: A ação sendo realizada no recurso. Pode ser ler, escrever, excluir ou qualquer outra ação.
- Environment: O contexto no qual a solicitação de acesso é feita. Pode incluir informações como hora do dia, localização ou qualquer outra informação contextual.
Aqui está um exemplo de uma solicitação 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 a solicitação de decisão da seguinte forma:
- Correspondência de alvo: Para cada política, o PDP verifica se a solicitação corresponde ao alvo da política. Se a solicitação 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 à solicitação, 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 várias 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 a solicitação de decisão seja como acima. O PDP avaliaria a solicitação 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 da solicitação é read
, a solicitação corresponde ao alvo da política.
Avaliação de regras
A política contém duas regras:
Rule1
: Como o ID do sujeito da solicitação éemployee
, a condição da regra é avaliada comotrue
, e o efeito da regra éPermit
.Rule2
: Como o ID do sujeito da solicitação não éuser
, a condição da regra é avaliada comofalse
, e o efeito da regra éNotApplicable
.
Combinação de regras e políticas
- Como
Policy1
usa o algoritmo de combinação de regrasdeny-overrides
, a decisão da política éPermit
porqueRule1
permite o acesso e seu efeito sobrepõe o efeitoNotApplicable
deRule2
. - 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 uma solicitação 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, a solicitação ainda corresponde ao alvo da política.
Avaliação de regras
Rule1
: O ID do sujeito da solicitação não éemployee
, então a condição da regra é avaliada comofalse
, e o efeito da regra éNotApplicable
.Rule2
: O ID do sujeito da solicitação é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
porqueRule2
nega o acesso, e seu efeito sobrepõe o efeitoNotApplicable
deRule1
. - 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 fim, vamos considerar uma solicitação 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
A solicitação não corresponde mais 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 “fallback” caso nenhuma regra ou política corresponda à solicitação. 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 controle de acesso baseadas em atributos. Antes de implementar o XACML em seu sistema, considere o seguinte:
- Design de controle 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 gerenciar. Para a maioria das aplicações, modelos de controle de acesso mais simples, como Controle de acesso baseado em função (RBAC) , podem ser mais apropriados.
- Desempenho: Avaliar políticas XACML pode ser computacionalmente caro, especialmente ao lidar com grandes conjuntos de políticas. Considere as implicações de desempenho de usar o XACML em seu sistema.