11.9.7. Autorização e Carregamento de Grupo com o LDAP

Espera-se que existam entradas para contas de usuários com o diretório LDAP e que existam entradas para grupos, que são então multi referenciados pelo uso dos atributos. Os atributos usados para a referenciação múltipla entre os dois pode ser uma referência da conta do usuário sobre a entrada do grupo ou um atributo na referenciação do grupo dos usuários, dos quais são membros do grupo. Em alguns servidores, ambas as formas de multi referência existem.

É comum também que um usuário seja autenticado em relação ao servidor usando um nome de usuário simples, quando acontece uma busca pela informação dos membros do grupo, dependendo do servidor do diretório em uso, as buscas podem ser executadas usando um nome simples ou podem ser executadas usando o nome distinto que os usuários inserem no diretório.

A etapa de autenticação de um usuário conectando ao servidor sempre acontece primeiro e, apenas quando isto decide que o usuário foi autenticado com sucesso, o servidor inicia o carregamento dos grupos de usuários. Uma vez que as etapas de autenticação e autorização usam uma conexão ao servidor LDAP, o realm contém uma otimização que qualquer conexão usada para autenticação será reusada para a etapa de carregamento de grupo. Conforme será apresentado com as etapas de configuração abaixo, é possível definir as regras com a seção da autorização para converter o nome do usuário de usuários simples para seus nomes distintos. Isto é, duplicando intensamente uma busca que ocorreria durante a etapa de autenticação, portanto caso um nome de usuário para a busca de nome distinto já tenha sido executada, o resultado daquela busca sofre o cache sem solicitar uma repetição.
<authorization>
    <ldap connection="...">
       <username-to-dn> <!-- OPTIONAL -->
           <!-- Only one of the following. -->
           <username-is-dn />
           <username-filter base-dn="..." recursive="..." user-dn-attribute="..." attribute="..." />
           <advanced-filter base-dn="..." recursive="..." user-dn-attribute="..." filter="..." />
        </username-to-dn>
       <group-search group-name="..." iterative="..." group-dn-attribute="..." group-name-attribute="..." >
           <!-- One of the following -->
           <group-to-principal base-dn="..." recursive="..." search-by="...">
               <membership-filter principal-attribute="..." />
           </group-to-principal>
           <principal-to-group group-attribute="..." />
       </group-search>
    </ldap>
</authorization>

Importante

Algumas destas amostras especificam que atributos estão usando os valores default. Elas são demonstradas para maior clareza. Os atributos que contém os valores default são removidos da configuração quando ela é persistida pelo servidor.

username-to-dn

Conforme mencionado acima, às vezes será necessário definir a configuração da autorização como mapear a partir do nome de usuário fornecido pelo usuário sendo autenticado ao nome distinto de sua entrada no diretório LDAP. O elemento username-to-dn é como isto é definido, este elemento é apenas requerido caso ambos abaixo forem verdadeiros:
  • A etapa de autenticação não ocorreu em relação ao LDAP.
  • A busca em grupo está usando nome distinto durante a busca.

Tente e mantenha o primeiro ponto de marcação em mente, quando você ler as amostras abaixo você perceberá que a configuração da autenticação está sendo duplicada (e na realidade ela está duplicada). Caso esteja apenas usando o LDAP para autenticação, este procedimento não é necessário uma vez que o nome distinto será obtido durante a autenticação.
1:1 username-to-dn

Está é a forma mais básica de configuração e é usada para especificar que o nome do usuário inserido pelo usuário remoto é na realidade nome distinto de usuários.
<username-to-dn>
   <username-is-dn />
</username-to-dn>

Uma vez que isto está definindo um mapeamento 1:1, não há configuração adicional possível.
username-filter

A próxima opção é bastante parecida à opção simples descrita acima para a etapa de autenticação. É necessário apenas que um atributo especificado seja pesquisado pela combinação do nome do usuário fornecido.
<username-to-dn>
    <username-filter base-dn="dc=people,dc=harold,dc=example,dc=com" recursive="false" attribute="sn" user-dn-attribute="dn" />
</username-to-dn>

Os atributos que podem ser configurados:
  • base-dn: O nome distinto do contexto para início da busca.
  • recursive: Se é que a busca será estendida aos sub contextos. O default é false.
  • attribute: O atributo da entrada dos usuários para tentar e combinar em relação ao nome do usuário fornecido. O default é uid.
  • user-dn-attribute: O atributo de leitura para obter nome distinto de usuários. O default é dn.
advanced-filter

A opção final é especificar um filtro avançado, assim como na seção de autenticação, esta é uma oportunidade de uso de um filtro personalizado para localizar o nome distinto de usuários.
<username-to-dn>
    <advanced-filter base-dn="dc=people,dc=harold,dc=example,dc=com" recursive="false" filter="sAMAccountName={0}" user-dn-attribute="dn" />
</username-to-dn>

Para atributos que coincidem com aqueles no username-filter, o significado e os valores default são os mesmos de forma que você não precisará listá-los novamente. Isto leva a um novo atributo:
  • filter: O filtro personalizado usado para buscar por usuários quando o nome do usuário será substituído no place holder {0}.

Importante

O XML deve permanecer válido após o filtro ser definido de forma que quaisquer caracteres especiais são usados como & garantindo que uma forma apropriada seja usada. Por exemplo, &amp; para o caratere &.

Busca do Grupo

Conforme descrito acima, existem dois estilos diferentes que podem ser usados quando buscando para a informação do membro do grupo. O primeiro estilo é onde a entrada do usuário contém um atributo que referência os grupos do usuário que ele pertence. O segundo estilo onde o grupo é o que contém um atributo referenciado a entrada dos usuários.

Onde existe uma escolha do estilo para uso, a Red Hat recomenda que a configuração para a entrada do usuário referenciando o grupo seja usada. Isto é devido à informação do grupo do método pode ser carregada pelos atributos de leitura de nomes distintos conhecidos sem a necessidade de quaisquer buscas. As demais abordagens requerem buscas para identificar os grupos que referenciam o usuário.

Antes de descrever a configuração, por favor observe duas amostras LDIF para ilustração.

Exemplo 11.1. Principal ao Grupo - amostra LDIF.

Esta amostra ilustra onde nós temos um usuário TestUserOne que é um membro do GroupOne. O GroupOne é, então, em retorno um membro do GroupFive. A afiliação do grupo é apresentada pelo uso de um atributo memberOf que é configurado ao nome distinto do grupo que o usuário (ou grupo) pertence.

Embora não seja demonstrado aqui, um usuário poderia ter potencialmente um conjunto de atributos memberOf, um para cada grupo que o usuário pertence.
dn: uid=TestUserOne,ou=users,dc=principal-to-group,dc=example,dc=org
objectClass: extensibleObject
objectClass: top
objectClass: groupMember
objectClass: inetOrgPerson
objectClass: uidObject
objectClass: person
objectClass: organizationalPerson
cn: Test User One
sn: Test User One
uid: TestUserOne
distinguishedName: uid=TestUserOne,ou=users,dc=principal-to-group,dc=example,dc=org
memberOf: uid=GroupOne,ou=groups,dc=principal-to-group,dc=example,dc=org
memberOf: uid=Slashy/Group,ou=groups,dc=principal-to-group,dc=example,dc=org
userPassword:: e1NTSEF9WFpURzhLVjc4WVZBQUJNbEI3Ym96UVAva0RTNlFNWUpLOTdTMUE9PQ==

dn: uid=GroupOne,ou=groups,dc=principal-to-group,dc=example,dc=org
objectClass: extensibleObject
objectClass: top
objectClass: groupMember
objectClass: group
objectClass: uidObject
uid: GroupOne
distinguishedName: uid=GroupOne,ou=groups,dc=principal-to-group,dc=example,dc=org
memberOf: uid=GroupFive,ou=subgroups,ou=groups,dc=principal-to-group,dc=example,dc=org

dn: uid=GroupFive,ou=subgroups,ou=groups,dc=principal-to-group,dc=example,dc=org
objectClass: extensibleObject
objectClass: top
objectClass: groupMember
objectClass: group
objectClass: uidObject
uid: GroupFive
distinguishedName: uid=GroupFive,ou=subgroups,ou=groups,dc=principal-to-group,dc=example,dc=org

Exemplo 11.2. Grupo ao Principal - Amostra LDIF

Esta amostra apresenta o mesmo usuário TestUserOne que é um membro do GroupOne que é em troca um membro do GroupFive. No entanto, neste caso isto é um atributo uniqueMember a partir do grupo do usuário sendo usado para a referência múltipla.

O atributo usado pela referência múltipla do membro do grupo pode ser repetido. Quando observando o GroupFive, existe também uma referência a outro membro TestUserFive que não é apresentada aqui.
dn: uid=TestUserOne,ou=users,dc=group-to-principal,dc=example,dc=org
objectClass: top
objectClass: inetOrgPerson
objectClass: uidObject
objectClass: person
objectClass: organizationalPerson
cn: Test User One
sn: Test User One
uid: TestUserOne
userPassword:: e1NTSEF9SjR0OTRDR1ltaHc1VVZQOEJvbXhUYjl1dkFVd1lQTmRLSEdzaWc9PQ==

dn: uid=GroupOne,ou=groups,dc=group-to-principal,dc=example,dc=org
objectClass: top
objectClass: groupOfUniqueNames
objectClass: uidObject
cn: Group One
uid: GroupOne
uniqueMember: uid=TestUserOne,ou=users,dc=group-to-principal,dc=example,dc=org

dn: uid=GroupFive,ou=subgroups,ou=groups,dc=group-to-principal,dc=example,dc=org
objectClass: top
objectClass: groupOfUniqueNames
objectClass: uidObject
cn: Group Five
uid: GroupFive
uniqueMember: uid=TestUserFive,ou=users,dc=group-to-principal,dc=example,dc=org
uniqueMember: uid=GroupOne,ou=groups,dc=group-to-principal,dc=example,dc=org

Busca Geral de Grupo

Antes de observar as amostras para as duas abordagens, nós precisamos primeiro definir os atributos comuns entre eles.
<group-search group-name="..." iterative="..." group-dn-attribute="..." group-name-attribute="..." >
    ...
</group-search>
  • group-name: Este atributo é usado para especificar a forma de uso pelo nome de grupo retornado uma vez que a lista de grupos do usuário é um membro. Isto pode ser simplesmente pelo nome do usuário ou nome distinto de grupos, caso o nome distinto solicitar seja solicitado, este atributo pode ser configurado para DISTINGUISHED_NAME. O default é SIMPLE.
  • iterative: Este atributo é usado para indicar se após a identificação de grupos que o usuário pertence, nós devemos também buscar iterativamente baseando-se em grupos para identificar quais grupos dos grupos um membro pertence. Caso a busca iterativa for habilitada, nós damos continuidade até alcançarmos um grupo que não é membro, caso quaisquer outros grupos ou um ciclo seja detectado. O default é false.

A afiliação do grupo cíclico não é um problema. Um registro de cada busca é mantido para prevenir que os grupos que já tiveram buscas realizadas, novamente sejam procurados.

Importante

Com o objetivo de que a busca iterativa funcione, as entradas do grupo precisam parecer as mesmas às entradas do usuário, sendo que a mesma abordagem usada para identificar os grupos que um usuário pertence é usada para identificar os grupos que o grupo pertence. Isto não seria possível quando falando do grupo para o membro do grupo e o nome do atributo usado para referência múltipla alterar ou caso a direção da referência alterar.
  • group-dn-attribute: Numa entrada a um grupo que o atributo encontra-se para um nome distinto. O default é dn.
  • group-name-attribute: Numa entrada a um grupo que o atributo encontra-se for um nome simples. O default é uid.

Exemplo 11.3. Principal à Configuração da Amostra do Grupo

Baseada na amostra LDIF, segue abaixo uma configuração de amostra iterativamente carregando grupos de usuários onde o atributo usado para referência múltipla é o atributo memberOf do usuário.
<authorization>
    <ldap connection="LocalLdap">
        <username-to-dn>
            <username-filter base-dn="ou=users,dc=principal-to-group,dc=example,dc=org" recursive="false" attribute="uid" user-dn-attribute="dn" />
        </username-to-dn>
        <group-search group-name="SIMPLE" iterative="true" group-dn-attribute="dn" group-name-attribute="uid">
            <principal-to-group group-attribute="memberOf" />
        </group-search>
    </ldap>
</authorization>

O aspecto mais importante desta configuração é que o elemento principal-to-group já foi adicionado com um atributo único.
  • group-attribute: O nome do atributo na entrada do usuário que coincide com o nome distinto que o grupo do usuário pertence. O default é memberOf.

Exemplo 11.4. Grupo à Configuração da Amostra Principal

Esta amostra apresenta uma busca iterativa do grupo à amostra LDIF principal demonstrada acima.
<authorization>
      <ldap connection="LocalLdap">
          <username-to-dn>
              <username-filter base-dn="ou=users,dc=group-to-principal,dc=example,dc=org" recursive="false" attribute="uid" user-dn-attribute="dn" />
          </username-to-dn>
          <group-search group-name="SIMPLE" iterative="true" group-dn-attribute="dn" group-name-attribute="uid">
              <group-to-principal base-dn="ou=groups,dc=group-to-principal,dc=example,dc=org" recursive="true" search-by="DISTINGUISHED_NAME">
                  <membership-filter principal-attribute="uniqueMember" />
              </group-to-principal>
          </group-search>
      </ldap>
  </authorization>

Este é um elemento group-to-principal adicionado. Este elemento é usado para definir como as buscas pelos grupos que referenciam a entrada do usuário serão desempenhadas. Os seguintes atributos são determinados:
  • base-dn: O nome distinto do contexto em uso para iniciar a busca.
  • recursive: Se é que os subcontextos também são pesquisados. O default é false.
  • search-by: A forma do nome de função usado nas buscas. Os válidos são SIMPLE e DISTINGUISHED_NAME. O default é DISTINGUISHED_NAME.

Junto ao elemento group-to-principal existe um elemento membership-filter para definir a referência múltipla.
  • principal-attribute: O nome do atributo na entrada do grupo que referência a entrada do usuário. O default é member.