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,&
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 paraDISTINGUISHED_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ãoSIMPLE
eDISTINGUISHED_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
.