Um guia para iniciantes em XACML

Hoje, os aplicativos corporativos buscam formas de reforçar a segurança que permite que as pessoas certas acessem os recursos certos com restrições impostas pelas políticas corporativas. Os sistemas de gerenciamento de identidade e direitos reduzem a carga de arquitetos e desenvolvedores corporativos em implementações relacionadas à segurança.

Tipos de controle de acesso

O ABAC (Attribute-Based Access Control, controle de acesso” é um paradigma de controle de acesso pelo qual os direitos de acesso são concedidos aos usuários através do uso de políticas que combinam atributos. As políticas podem usar qualquer tipo de atributo (atributos do usuário, atributos de recursos, objeto, atributos ambientais, etc.). Esse modelo suporta a lógica booleana, na qual as regras contêm declarações “IF, THEN” sobre quem está fazendo a solicitação, o recurso e a ação.
Por exemplo: SE o solicitante for um gerenciador, então permita o acesso de leitura/gravação a dados confidenciais.

O RBAC (Role-based Access Control, controle de acesso baseado em papéis) é uma abordagem usada para restringir o acesso a usuários autorizados com base em sua função. Este é um modelo de permissão estática que fornece controle de acesso. Esse tipo de controle de acesso é usado quando todos os usuários são categorizados em diferentes funções. As funções definem os recursos que podem ser acessados pelos usuários atribuídos a essa função. Esse tipo de controle de acesso reduz a sobrecarga de gerenciamento.

O que é XACML?

XACML (eXtensible Access Control Markup Language) é uma linguagem baseada em XML para controle de acesso que foi padronizada pelo Comitê Técnico do consórcio OASIS. O XACML é popular como um método de autorização de grãos finos entre a comunidade. O XACML descreve uma linguagem de política de controle de acesso, linguagem de solicitação/resposta e arquitetura de referência. A linguagem política é usada para expressar políticas de controle de acesso (quem pode fazer o que quando). O idioma de solicitação/resposta expressa dúvidas sobre se um determinado acesso deve ser permitido (solicitações) e descreve respostas a essas consultas (respostas). A arquitetura de referência propõe um padrão de implantação de módulos de software necessários dentro de uma infraestrutura para permitir uma aplicação eficiente das políticas.

O XACML suporta o CONTROLE DE ACESSO Baseado em Atributos (ABAC) e a avaliação pode ser feita com os dados adicionais recuperados do PIP (Policy Information Point, ponto de informação da política), que é definido pela arquitetura de referência XACML.

Arquitetura XACML

Arquitetura XACML

O PDP (Policy Decision Point, ponto de decisão da política) avalia políticas contra solicitações de acesso fornecidas pelos Pontos de Execução de Políticas (PEP). Para fornecer as decisões, o PDP também pode precisar consultar um Ponto de Informações de Política (PIP) para coletar atributos descritivos sobre o usuário ou qualquer outro atributo ausente na solicitação. O Ponto de Administração de Políticas (PAP) é usado para gerenciar a funcionalidade PDP e PIP.

Estrutura de linguagem de política XACML e sintaxe

Três elementos políticos de alto nível

  • **:** contém uma expressão booleana que pode ser avaliada isoladamente, mas que não se destina a ser acessada isoladamente por um PDP. Portanto, não se pretende formar a base de uma decisão de autorização por si só. Destina-se a existir isoladamente apenas dentro de um PAP XACML, onde pode formar a unidade básica de gestão
  • **:** contém um conjunto de elementos e um procedimento especificado para combinar os resultados de sua avaliação. É a unidade básica da política utilizada pelo PDP, e por isso pretende formar a base de uma decisão de autorização
  • **:** contém um conjunto de ou outros elementos e um procedimento especificado para combinar os resultados de sua avaliação.

Elementos de política de alto nível

O diagrama abaixo mostra o modelo de política XACML.

Modelo de Política

Vamos dar uma olhada mais de perto em cada um desses componentes.

Alvo

Um elemento XACML , ou contém um elemento que especifica o conjunto de solicitações a que ele se aplica.

Um corresponde a qualquer pedido. Caso contrário, o **_valor-alvo_** é "Correspondência" se todos os "AnyOf" especificados forem correspondidos na solicitação. As tabelas a seguir mostram como a avaliação de destino é feita com base em > <> e .

Avaliação de Metas

Exemplo:

Se o alvo deve ser compatível,

  • se a condiçãoA e condiçãoB for correspondida,
<Target>   <AnyOf>      <AllOf>         <Match>conditionA</Match>         <Match>conditionB</Match>      </AllOf>   </AnyOf></Target>
  • se a condiçãoA ou condiçãoB for correspondida,
<Target>   <AnyOf>      <AllOf>         <Match>conditionA</Match>      </AllOf>      <AllOf>         <Match>conditionB</Match>      </AllOf>   </AnyOf></Target>

Amostra

<Target>      <AnyOf>         <AllOf>            <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">               <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">Pamoda</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>            <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">               <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">GET</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>

Na definição acima do Target, o alvo validará se o objeto da solicitação é “Pamoda” e a ação é “GET”

Algoritmos de combinação de regras

O algoritmo de combinação de regras especifica o procedimento pelo qual os resultados da avaliação das regras componentes são combinados ao avaliar a política.

Alguns exemplos de algoritmos de combinação padrão são:

  • Sobressortos de negação (urna:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides)
    — Se qualquer decisão for “Negar”, o resultado é “Negar”.
  • Substituições por permissão (urna:oásis:nomes:tc:xacml:3.0:regras combinando algoritmo:perdagrações-substituições)
    — Se qualquer decisão for “Permissão”, o resultado é “Permissão”.
  • Primeiro aplicável (urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable)
    — Cada regra é avaliada na ordem em que está listada na política. Para uma regra específica, se o alvo corresponder e a condição avaliar para Permitir, Negar ou Efeito Correspondente Indeterminado da regra deve ser o resultado da avaliação da política. Caso contrário, retorne à próxima regra.

Regra

Uma regra é a unidade mais elementar da política. O coração da maioria das regras é uma Condição, que é uma função booleana. Se a condição for avaliada como verdadeira, então o Efeito da Regra será devolvido. Uma Condição pode ser bastante complexa, construída a partir de um ninho arbitrário de funções e atributos não-booleanos. A tabela a seguir mostra como o efeito final da regra é decidido.

Avaliação de Regras

Atributos, valores de atributos e funções

Como o XACML é usado no Controle de Acesso Baseado em Atributos, no XACML todos os atributos são categorizados em quatro categorias principais. Mas a partir do XACML 3.0, categorias personalizadas também são suportadas.

  • Assunto (urna:oásis:nomes:tc:xacml:3.0:categoria de atributo:assunto)
  • Recurso (urna:oásis:nomes:tc:xacml:3.0:categoria de atributo:recurso)
  • Ação (urna:oásis:nomes:tc:xacml:3.0:categoria de atributo:ação)
  • Ambiente (urna:oásis:nomes:tc:xacml:3.0:categoria de atributo:ambiente)

Uma Política resolve valores de atributos da solicitação ou recupera valores do PIP.

**:** permite que a política especifique um atributo com um nome e tipo e um determinado nome e opcionalmente um emissor também. pode retornar vários valores. O XACML fornece um tipo de atributo especial chamado **_"Saco"._**

**:** contém um valor de atributo literal

O XACML vem com um poderoso sistema de funções. As funções podem funcionar em qualquer combinação de valores de atributo e podem retornar qualquer tipo de valor de atributo suportado no sistema. Funções também podem ser aninhadas, para que possamos ter funções que consomem a saída de outras funções, e essa hierarquia pode ser arbitrariamente complexa.

**:** denota a aplicação de uma função aos seus argumentos, codificando assim uma chamada de função.

💡 NOTA: As funções XACML podem consumir diferentes tipos e diferentes números de atributos como entradas, dependendo da definição da função. Algumas das funções podem consumir um saco de atributos, enquanto algumas requerem um único atributo. Portanto, antes de usar as funções, precisamos estudar o comportamento.

Vamos considerar uma regra de exemplo, onde a solicitação é permitida se apenas a solicitação for realizada por um usuário chamado “Pamoda”.

<Rule Effect="Permit" RuleId="rule1">      <Condition>         <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal">            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-one-and-only">               <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"/>            </Apply>            <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">Pamoda</AttributeValue>         </Apply>      </Condition>   </Rule>

Na regra da amostra,

  • Se a condição dada na regra for validada com sucesso, o efeito será “Permissão”
  • A função “urna:oasis:names:tc:xacml:1.0:function:string-equal” é usada para a comparação. Esta função requer dois argumentos do tipo “http://www.w3.org/2001/XMLSchema#string”
  • seleciona um **_saco_** de tipo "_http://www.w3.org/2001/XMLSchema#string_"
  • A função “urna:oasis:names:tc:xacml:1.0:function:string-one-and-only” garante que seu argumento avalia para um saco contendo exatamente um valor.
  • define o segundo atributo para a comparação.

Obrigações e Expressões de Conselho.

Uma regra, política ou conjunto de políticas podem conter uma ou mais expressões de obrigações ou conselhos. Quando tal regra, política ou conjunto de políticas for avaliada, a obrigatoriedade ou expressão de aconselhamento será avaliada a uma obrigação ou aconselhamento, respectivamente, que é passado para o próximo nível de avaliação somente se o resultado da regra, política ou conjunto de políticas que estão sendo avaliados corresponder ao valor do atributo FulfillOn da obrigação ou do atributo AppliesTo do conselho.

O conselho é semelhante à obrigação e compartilha grande parte de sua sintaxe. A diferença é contratual: a PEP pode desconsiderar qualquer conselho que receber. Os PEPs não têm que cumprir as declarações de aconselhamento; PePs podem considerar ou descartar a declaração.

Exemplo de Obrigação,

<ObligationExpressions>  <ObligationExpression FulfillOn="Permit" ObligationId="email_obligation">    <AttributeAssignmentExpression AttributeId="email">       <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">pamodaaw@gmail.com</AttributeValue>    </AttributeAssignmentExpression>  </ObligationExpression></ObligationExpressions>

Resposta após avaliar a política com a obrigação acima.

<Response xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17">  <Result>    <Decision>Permit</Decision>    <Status>      <StatusCode Value="urn:oasis:names:tc:xacml:1.0:status:ok"/>    </Status>    <Obligations>       <Obligation ObligationId="email_obligation">         <AttributeAssignment AttributeId="email" DataType="http://www.w3.org/2001/XMLSchema#string">pamodaaw@gmail.com</AttributeAssignment>       </Obligation>    </Obligations>  </Result></Response>

Na expressão de obrigação acima,

  • a obrigação será adicionada à resposta quando apenas a decisão for “Licença”
  • O valor da obrigação, “pamodaaw@gmail.com” é adicionado à resposta definida na política.

Exemplo de Expressão de Conselhos

<AdviceExpressions>      <AdviceExpression AdviceId="email_advice" AppliesTo="Permit">         <AttributeAssignmentExpression AttributeId="email">            <AttributeDesignator AttributeId="http://wso2.org/claims/emailaddress" Category="urn:oasis:names:tc:xacml:3.0:subject-category:access-subject"DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true">            </AttributeDesignator>         </AttributeAssignmentExpression>      </AdviceExpression>   </AdviceExpressions>

Resposta após avaliar a política com a obrigação acima.

<Response xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17">  <Result>    <Decision>Permit</Decision>    <Status>      <StatusCode Value="urn:oasis:names:tc:xacml:1.0:status:ok"/>    </Status>    <AssociatedAdvice>      <Advice AdviceId="email_advice" >         <AttributeAssignment  AttributeId="email" DataType="http://www.w3.org/2001/XMLSchema#string">pamoda@wso2.com</AttributeAssignment>      </Advice>    </AssociatedAdvice>  </Result></Response>

Na expressão de conselho acima,

  • o conselho será adicionado à resposta quando apenas a decisão for “Licença”
  • Em contraste com a definição da obrigação, aqui eu tomei o valor de retorno do conselho da reivindicação de e-mail do usuário. Para que possamos obter valores dinâmicos com base no usuário.

Juntando-o: uma política de exemplo

Por favor, note que usei o Servidor de Identidade WSO2 para experimentar as Políticas XACML.

Definição de política,

  • : a política só é aplicada se sujeito="pamoda" e action="GET"
  • : Permite se o assunto-id for igual a "Pamoda"
  • : Devolve o valor "pamodaaw@gmail.com" se a regra for Permissão
  • : Devolve o valor da reclamação do usuário, _"http://wso2.org/claims/emailaddress"_ se a regra for Permitir.
<Policy xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17"  PolicyId="sample_policy_8" RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable" Version="1.0">
   <Target>
      <AnyOf>
         <AllOf>
            <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
               <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">pamoda</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"></AttributeDesignator>
            </Match>
            <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
               <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">GET</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"></AttributeDesignator>
            </Match>
         </AllOf>
      </AnyOf>
   </Target>
   <Rule Effect="Permit" RuleId="rule1">
      <Condition>
         <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-one-and-only">
               <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"></AttributeDesignator>
            </Apply>
            <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">pamoda</AttributeValue>
         </Apply>
      </Condition>
   </Rule>
   <Rule Effect="Deny" RuleId="8b52dcce-cd23-44f0-a223-f80ca6cc1a05"></Rule>
   <ObligationExpressions>
      <ObligationExpression FulfillOn="Permit" ObligationId="email">
         <AttributeAssignmentExpression AttributeId="email">
            <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">pamodaaw@gmail.com</AttributeValue>
         </AttributeAssignmentExpression>
      </ObligationExpression>
   </ObligationExpressions>
   <AdviceExpressions>
      <AdviceExpression AdviceId="email_advice" AppliesTo="Permit">
         <AttributeAssignmentExpression AttributeId="email">
            <AttributeDesignator AttributeId="http://wso2.org/claims/emailaddress" Category="urn:oasis:names:tc:xacml:3.0:subject-category:access-subject" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"></AttributeDesignator>
         </AttributeAssignmentExpression>
      </AdviceExpression>
   </AdviceExpressions>
</Policy>  

Solicitação de amostra

<Request xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" CombinedDecision="false" ReturnPolicyIdList="false">
  <Attributes Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject">
    <Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id" IncludeInResult="false">
      <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">pamoda</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" IncludeInResult="false">
      <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">GET</AttributeValue>
    </Attribute>
  </Attributes>
</Request> 

Resposta amostral

<Response xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17">
  <Result>
    <Decision>Permit</Decision>
    <Status>
      <StatusCode Value="urn:oasis:names:tc:xacml:1.0:status:ok"/>
    </Status>
    <Obligations>
      <Obligation ObligationId="email">
        <AttributeAssignment  AttributeId="email" DataType="http://www.w3.org/2001/XMLSchema#string">pamodaaw@gmail.com</AttributeAssignment>
      </Obligation>
    </Obligations>
    <AssociatedAdvice>
      <Advice AdviceId="email_advice" >
        <AttributeAssignment  AttributeId="email" DataType="http://www.w3.org/2001/XMLSchema#string">pamoda@wso2.com</AttributeAssignment>
      </Advice>
    </AssociatedAdvice>
  </Result>
</Response>

Referências

Espero que você possa aprender algo com este blog. Se você tiver alguma preocupação, por favor adicione um comentário.

Leitura feliz!!!

Meus outros blogs no XACML:

  1. Servidor de identidade WSO2 como um motor XACML
  2. Personalização do ponto de informação da política XACML do WSO2 Identity Server 5.10.0
  3. Funções XACML personalizadas para WSO2 Identity Server 5.10.0

Autor: Pamoda Wimalasiri

Artihgo Original