Como configurar a manutenção de associação de grupo reversa em um servidor openldap? (membro de)

18

Atualmente, estou trabalhando na integração da autenticação LDAP em um sistema e gostaria de restringir o acesso com base no grupo LDAP. A única maneira de fazer isso é através de um filtro de pesquisa e, portanto, acredito que minha única opção seja o uso do atributo "memberOf" no meu filtro de pesquisa. Entendo que o atributo "memberOf" é um atributo operacional que pode ser criado pelo servidor para mim sempre que um novo atributo "membro" é criado para qualquer entrada "groupOfNames" no servidor. Meu principal objetivo é poder adicionar um atributo "member" a uma entrada "groupOfNames" existente e fazer com que um atributo "memberOf" correspondente seja adicionado ao DN que forneço.

O que eu consegui alcançar até agora:

Ainda sou bastante novo na administração do LDAP, mas com base no que encontrei no guia do administrador do openldap, parece que a Manutenção de Associação Reversa ao Grupo, conhecida como "memberof overlay", alcançaria exatamente o efeito que estou procurando.

Meu servidor está atualmente executando uma instalação de pacote (slapd no ubuntu) do openldap 2.4.15 que usa a configuração de tempo de execução no estilo "cn = config". A maioria dos exemplos que encontrei ainda faz referência ao método "slapd.conf" antigo de configuração estática e tentei o máximo possível para adaptar as configurações ao novo modelo baseado em diretório.

Eu adicionei as seguintes entradas para ativar o módulo membro de sobreposição:

Ative o módulo com olcModuleLoad

cn=config/cn\=module\{0\}.ldif

dn: cn=module{0}
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib/ldap
olcModuleLoad: {0}back_hdb
olcModuleLoad: {1}memberof.la
structuralObjectClass: olcModuleList
entryUUID: a410ce98-3fdf-102e-82cf-59ccb6b4d60d
creatorsName: cn=config
createTimestamp: 20090927183056Z
entryCSN: 20091009174548.503911Z#000000#000#000000
modifiersName: cn=admin,cn=config
modifyTimestamp: 20091009174548Z

Ativou a sobreposição para o banco de dados e permitiu que ele usasse suas configurações padrão (groupOfNames, member, memberOf, etc)

cn=config/olcDatabase={1}hdb/olcOverlay\=\{0\}memberof

dn: olcOverlay={0}memberof
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: olcConfig
objectClass: top
olcOverlay: {0}memberof
structuralObjectClass: olcMemberOf
entryUUID: 6d599084-490c-102e-80f6-f1a5d50be388
creatorsName: cn=admin,cn=config
createTimestamp: 20091009104412Z
olcMemberOfRefInt: TRUE
entryCSN: 20091009173500.139380Z#000000#000#000000
modifiersName: cn=admin,cn=config
modifyTimestamp: 20091009173500Z

Meu resultado atual:

Usando a configuração acima, eu posso adicionar um novo "groupOfNames" com qualquer número de entradas "member" e ter todos os DNs envolvidos atualizados com um atributo "memberOf". Isso faz parte do comportamento que eu esperaria. Embora eu acredite que o seguinte deveria ter sido realizado com o membro da sobreposição, ainda não sei como fazer o seguinte e gostaria de receber qualquer conselho:

  1. Adicione um atributo "member" a um "groupOfNames" EXISTENTE e faça com que um atributo "memberOf" correspondente seja criado automaticamente.
  2. Remova um atributo "member" e faça com que o atributo "memberOf" correspondente "seja removido automaticamente.
Emills
fonte

Respostas:

10

Eu tenho lutado com a mesma coisa, a documentação do openldap é minimalista e dificilmente útil. Quando eles foram para um banco de dados de configuração (não é uma má idéia em princípio), todas as opções foram alteradas; portanto, quando as pessoas estão dando exemplo do /etc/ldap/slapd.conf, é inútil com uma configuração moderna do slapd (como o Ubuntu).

Eu finalmente consegui isso funcionando. Aqui está o resumo ... primeiro arquivo LDIF:

dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib/ldap
olcModuleLoad: memberof

Segundo arquivo LDIF:

dn: olcOverlay=memberof,olcDatabase={1}hdb,cn=config
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: olcConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf

Adicione-os ao banco de dados de configuração usando ldapadd (o mesmo que o normal).

Ele não atualiza automaticamente os dados existentes no banco de dados, então eu precisava usar o slapcat para copiar tudo em um arquivo temporário e visitar cada grupo, excluir o grupo e adicionar o mesmo grupo novamente (força os atributos memberOf a atualizar corretamente). Se você estiver começando com um banco de dados vazio, ele atualizará corretamente os atributos à medida que os objetos forem adicionados.

Além disso, observe que "olcDatabase = {1} hdb" é muito típico, mas não é garantido que corresponda à sua configuração. Certifique-se de verificar esse.

Telford Tendys
fonte
11
Não é slapadd(no banco de dados parado) o caminho certo para fazer isso?
mad_vs
11

Escrevi sobre isso recentemente no meu blog, www.jordaneunson.com. Copiei e colei as partes relevantes.

O que eu tive que fazer foi parar o serviço "slapd" no meu servidor LDAP e editar meu arquivo slapd.conf e adicionar as duas linhas a seguir.

moduleload memberof.la
overlay memberof

Eu já tinha um groupOfNames chamado vpn, então tive que criar um arquivo LDIF com o seguinte conteúdo:

dn: cn=vpn,ou=Groups,dc=shop,dc=lan
objectclass: groupofnames
cn: vpn
description: Users allowed to connect on VPN
member: uid=jordan,ou=People,dc=shop,dc=lan

E adicionei isso ao meu banco de dados LDAP

slapadd -f file.ldif

Depois disso, iniciei o servidor ldap em depuração para verificar se havia erros

slapd -d 99 -f /etc/ldap/slapd.conf 

e verifiquei se minha associação ao grupo "vpn" estava listada na minha entrada de usuário.

ldapsearch -h ldap -x -b "dc=shop,dc=lan" '(uid=jordan)' memberOf 

e bam! sucesso!

jordan, People, shop.lan
dn: uid=jordan,ou=People,dc=shop,dc=lan
memberOf: cn=vpn,ou=Groups,dc=shop,dc=lan

Por isso, ativei o serviço slapd e tive muito sucesso desde então. Para uma nova ferramenta de gerenciamento da GUI, estou usando o phpLDAPAdmin e não tenho problemas com o atributo memberOf sendo atribuído e não atribuído aos meus usuários.

Uma última coisa a observar é que o atributo "memberOf" não faz parte do esquema básico do LDAP v3 e, portanto, fazer uma pesquisa de ldapsearch não revelará esse atributo, a menos que seja especificamente consultado. É por isso que no meu exemplo acima ele é declarado no final dos parâmetros ldapsearch.

Espero que isto ajude.

Edit: Acabei de testar o seu problema com o Apache Directory Studio: desde que eu insira o valor do membro do atributo como um todo, como mencionado acima, ele funciona bem. No entanto, o atributo memberOf não aparece na entrada do usuário. Isso ocorre porque o atributo memberOf não faz parte do esquema LDAPv3. Para verificar se existe, use a ferramenta de linha de comando ldapsearch:

ldapsearch -h ldap -x -b "dc=shop,dc=lan" '(uid=jordan)' memberOf 
Jordan Eunson
fonte
11
Carregar o módulo e adicionar a sobreposição é exatamente o que fiz, infelizmente. Como afirmei, o problema não é que os atributos "memberOf" não sejam adicionados a novas entradas groupOfNames, mas eles não serão adicionados quando eu simplesmente adicionar um atributo "member" a um grupo existente. Atualmente, estou usando o Apache Directory Studio para navegar e configurar meu LDAP, para que ele mostre as entradas memberOf quando eu navego. Não é uma questão deles estarem escondidos.
Emills
11
Como você está criando o atributo de membro no groupOfNames? Está usando o DN inteiro? como: "uid = usuário, ou = pessoas, dc = corp, dc = org" ou você está apenas preenchendo o nome de usuário? Para que o mapeamento reverso funcione, é necessário usar o DN inteiro para que memberOf saiba onde colocar o mapa reverso.
226 E Jordan Jordan Eunson
11
Edit: Acabei de testar seu problema com o Apache Directory Studio, desde que eu insira o valor do membro do atributo como um todo, conforme mencionado acima, e funcione bem. No entanto, o atributo memberOf não aparece na entrada do usuário. Isso ocorre porque o atributo memberOf não faz parte do esquema LDAPv3. Para verificar se está lá, use a ferramenta de linha de comando ldapsearch. <code> ldapsearch -h ldap -x -b "dc = loja, dc = lan" '(uid = jordan)' memberOf </code>
Jordan Eunson
11
Estou usando o DN na entrada do membro. Não é uma questão de não vê-lo, como já afirmei, eles apenas são adicionados (e, portanto, são visíveis) com um novo groupOfNames é adicionado, não quando eu adiciono um atributo de membro a um grupo existente.
Emills
11
<quote> eles são adicionados apenas (e, portanto, são visíveis) </ quote> Desculpe, mas esta declaração está incorreta. O atributo memberOf não fica visível, a menos que você o solicite especificamente. Você poderia postar a saída do comando ldapsearch listado acima? Altere o usuário para alguém que deve ter um atributo memberOf, mas não possui.
21711 Jordan Eunson