Os Guardians fazem uso de LDAP no LCC… Tive um tempinho para investigar como o sistema funcionava e criei esse post para divulgar os resultados. Para entender o LDAP na autenticação, explorarei alguns conceitos chaves para então apresentar o LDAP. :)
Autenticação
O Linux opera por chamadas C para enteder como ele deve proceder durante um requisito de arquivos de autenticação. Quando o sistema precisa obter informações sobre o usuário (ex: uid), uma chamada C executa uma invocação ao arquivo /etc/nsswitch.conf e procura de onde ele deve obter essa informação.
Provavelmente, se forem ver o arquivo nsswitch de vocês, encontrarão algo como “compat”. Isso difere da opção “files” (que consulta apenas o passwd/shadow/groups) pq permite que o NIS opere usando os operadores + e -. Explicando: no NIS vc precisa adicionar uma linha do tipo +::::: no passwd - isso vai indicar que o sistema deve consultar o NIS para realizar uma consulta a qual o usuário local. Quando vc usa files, essa linha representa apenas um usuário.. no NIS, representa que vc deve consultar uma base externa de dados.
PAM
Mas nem sempre o sistema faz diretamente uma consulta aos arquivos… Às vezes ele faz uma consulta ao PAM. PAM significa “Pluggable Authentication Modules” a tradução dá uma idéia do que faz: permite que vc adicione diversos modulos ‘plugáveis’ para permitir autenticação no sistema.
Nos sistemas modernos, os arquivos no /etc/pam.d/ são responsáveis pelas diretrizes de autenticação do sistema. Em especial, são 4 categorias principais do módulo PAM: account, auth, password e session:
- account
- Verifica se a conta é válida para o serviço requisitado (password expirou, etc…)
- auth
- Verifica se o usuário é quem diz que é (conceito de autenticação). Em geral, pede uma senha.
- password
- Módulo responsável por controlar senhas (pedir por uma nova tentativa, verificar se a senha é forte, etc)
- session
- Responsável por monitorar uma sessão (i.e. - preparar o ambiente para iniciar uma sessão com o usuário/log quando o usuário sair…)
LDAP
Ok, o q é LDAP? LDAP significa “Lightweight Directory Access Protocol”. Por diretório, ele representa uma maneira hierárquica de
manter informações, como um “diretório”. Você pode, por exemplo, armazenar a informação que um usuário é “X” dado que no sistema, ele esta dentro do diretório ‘dc=net’ que está dentro do diretório ‘dc=example’ que está dentro do diretório ‘ou=People’ que por sua vez contém o arquivo ‘uid=matheusgr’.
Um item no LDAP não é bem um item.. é só uma folha de diretório. Cada diretório pode ter atributos (como: cn (comentário), uidNumber (número do ID), etc). e cada diretório pode ter subdiretórios.
O que faz do LDAP um protocolo? Ele define uma maneira clara de comunicação entre cliente-servidor através de mensagens que servem unicamente para consulta/inserção/atualização/remoção de atributos e diretórios.
LDAP e Autenticação
Todo sistema, em geral, faz uso de um protocolo de autenticação. Os mais simples utilizam um arquivo com usuário e senha. Entretanto, os sistemas mais avançados permitem que você faça uso de uma base de dados existente para permitir autenticação. É natural para um programa Linux fazer uso do sistema existente (passwd + shadow) como autenticação, entretanto, essa plataforma de autenticação só seria possível para um programa que, de fato, rodasse no Linux.
Para ir um passo adiante, os sistemas utilizam o sistema PAM que é compatível com boa parte da plataforma Unix (Linux, Solares, *BSD). Apesar de muito compatível com a maioria dos sistemas Unix, o PAM não oferece uma camada para o Windows, nem certas facilidades de outros sistemas.
Por fim, para ser compatível com mais sistemas, é preciso uma alternativa é usar um protocolo leve que te dê informações para autenticar usuários… Eis que entra em ação o LDAP: um protocolo fácil de ser implementado e que contém as informações para autenticação do sistema.
Um protocolo leve apresenta outras vantagens: o modelo de replicação, backup e acesso remoto à base de dados são bem definidos. Estas vantagens, juntamente com um protocolo que é acessível por diferentes S.O.’s faz com que o LDAP seja vantajoso.
Implementações LDAP
Por ser um protocolo, o LDAP permite que existam diversas implementações: cada implementação só precisa ‘cumprir’ o protocolo LDAP pra ser decretada como funcional. Talvez uma das implementações mais usadas no Linux seja o SLAPD. O Slapd implementa o protocolo LDAP e é uma aplicação OpenSource.
Ao instalar o Slapd ( apt-get install slapd ), o usuário se defronta com um pedido do dóminio da base de dados, conta privilegiada e senha. O domínio é apenas um caminho em árvore para diferenciar as diferentes sub-redes que podem ser alimentadas pela mesma base de dados. Por exemplo, digamos que o LSD e o LCC compartilhasse um servidor LDAP e que cada uma tivesse sua base própria de usuários. Nada mais natural que o LDAP do LSD usasse, como diretório, “dc=lsd,dc=ufcg,dc=edu,dc=br” e o LCC: “dc=lcc,dc=ufcg,dc=edu,dc=br”. O usuário principal é o responsável por acessar a base de dados local,
e a senha tem o mesmo objetivo.
O SLAPD dispõe da configuração do servidor, mas há ainda a parte cliente a ser considerada. O modo de consulta do cliente é definido pelo arquivo /etc/ldap/ldap.conf e precisa ter as seguintes linhas:
BASE dc=lcc,dc=ufcg,dc=edu,dc=br
URI ldapi:///
Onde, BASE é o diretório de consulta base e URI é a forma de consulta (pode ser: ldapi, q faz uso de socket local, ladp, q faz consulta por um TCP descriptografado e ladps que usa SASL para comunicação criptografada).
Diretórios de usuários no LDAP
Os usuários do Linux ficarão no grupo “People” e os grupos no diretório “groups”, para isso vc precisa criar estes diretórios:
ldap:/tmp# cat groups.ldif
dn: ou=groups,dc=lcc,dc=ufcg,dc=edu,dc=br
objectClass: organizationalUnit
ou: groups
ldap:/tmp# slapadd -l groups.ldif
ldap:/tmp# cat people.ldif
dn: ou=People,dc=lcc,dc=ufcg,dc=edu,dc=br
objectClass: organizationalUnit
ou: People
ldap:/tmp# slapadd -l people.ldif
LDAP e autenticação nativa
Como falei anteriormente, o Linux faz uso de um arquivo nativo para identificar de onde obter informações de autenticação. Esse arquivo, o nsswitch.conf é consultado toda vez que é preciso procurar algo na base de dados do passwd/groups/shadow/…
Para permitir que o nsswitch procure também no LDAP, é preciso instalar o pacote: libnss-ldap . Esse pacote permite que o nsswitch seja capaz de se comunicar com o LDAP para procurar usuários do sistema. Para permitir essa comunicação, considerando a correta instalação do pacote, que o nsswitch.conf seja alterado para fazer consultas ao LDAP. Onde tiver “compat” é preciso substituir por “files ldap”. Exemplo:
passwd compat
Por:
passwd files ldap
Convém substituir no arquivo “libnss-ldap.conf” o host para ser usado na autenticação (em geral, 127.0.0.1 no servidor).
Agora toda vez que for feita uma consulta ao nsswitch, ele irá também usar a conta de admin para se logar no LDAP e procurar pelas informações dos usuários. Para isto, ele faz uso do arquivo libnss-ldap.secret que contem a senha do admin do LDAP.
LDAP e PAM
Nem todas as aplicações fazem uso do sistema nativo. A maioria faz uso do PAM. E para preparar o sistema para isso, é preciso instalar o libpam-ldap . O libpam-ldap instala um módulo PAM que se comunica com LDAP para obter informações a respeito do usuário na base LDAP. Assim, todo usuário que fizer uso do PAM, irá procurar a base do LDAP para obter informações a respeito de sua conta.
Para instalar o módulo PAM:
apt-get install libpam-ldap
Da mesma forma que o Nsswitch, o PAM também faz uso de dois arquivos: pam_ldap.conf e pam_ldap.secret. Ele irá se conectar ao banco LDAP definido no conf usando a senha definida no secret.
Outro aspecto importante é a configuração dos arquivos /etc/pam.d/common-*. Eles precisam fazer uso do pam_ldap.so. Observe que o pam_ldap é necessário mesmo com o pam_unix. O módulo do pam_unix não faz uma consulta ao nsswitch, mas apenas aos arquivos em disco (passwd/shadow/groups). O módulo pam do ldap faz a adição desta linha automaticamente.
LDAP e SSL
O LDAP permite três formas básicas de comunicação: TCP, socket unix e TCP/SSL. Para permitir o uso de SSL, é preciso configurar no slapd.conf as diretrizes d conexão SSL:
TLSCipherSuite HIGH:MEDIUM:+SSLv2:+SSLv3:RSA
TLSCertificateFile /etc/ldap/certs/server.crt
TLSCertificateKeyFile /etc/ldap/certs/server.key
TLSCACertificateFile /etc/ldap/certs/cacert.crt
TLSVerifyClient allow
Basta adicionar nos clientes o uso do protocolo “ldaps://endereco_do_server”
LDAP e indexação
Por fim, o LDAP faz uso de um banco de dados. Como todo banco de dados, ele precisa ser indexado de forma adequada para obter acesso rápido aos campos relevantes. Se o syslog apontar erros do tipo:
fileserver slapd[11493]: <= bdb_equality_candidates: (uid) not indexed
Isso significa q vc precisa ativar a indexação nestes campos. Para tanto, no slapd.conf adicione no espaço de Index:
index uid eq,pres,sub
E reexecute o slapindex como o usuário do banco de dados (provavelmente openldap).
É só isso?
Não. O LDAP é extremamente poderoso. No slapd.conf vc encontra, na sessão de imports, uma descrição de quais bases de dados serão utilizadas pelo SLAPD. Para autenticação, o nis e as bases principais são suficientes, mas caso o sistema queira fazer uso do LDAP para armazenar informações de email/dns/etc.. novos esquemas precisam serem adicionados.
Ainda: o sistema faz uso de diversas configurações de acesso (access …) Cada uma representa uma ACL de acesso ao sistema e é bastante flexível de acordo com as necessidades do administrador do sistema.
Por fim, diversos pacotes do debian adicionam novas funcionalidades que operan com o ldap. As mais importantes:
- ldap-utils
- Ferramentas de consulta/adição/modificação/etc…
- finger-ldap
- Uso do finger com consulta numa base LDAP
- python-ldap
- Módulo python para uso do LDAP
- smbldap-tools
- Ferramentas do samba para uso do LDAP
To the Infinity and Beyond
O que mais resta? O Slapd permite uso de um serviço slave/master através do slurpd.. Além de diversos módulos que se comunicam diretamente com o LDAP.. a exemplo do email e DNS, mas pode ir além com o apache e outras ferramentas.
Também é preciso saber tratar dos erros que podem acontecer. Por exemplo, como cliente, infelizmente, vc tem q manter sincronizado pelo menos 3 arquivos de configurações: o do PAM, o do nsswitch e o do próprio LDAP. Altere o domain da base de dados ou o usuário principal… e vc precisa alterar todos estes arquivos. E isso pode custar um tempo caso faça algo errado.
O LDAP dá erros esdrúxulos e indecifráveis. Não tem muito como escapar disto… Por sorte, a configuração padrão dos pacotes é adequada e suficiente para evitar esses erros bestas. Usar o strace, log, debug e internet podem dar uma luz na direção a ser tomada, mas é preciso entender também como cada parte do LDAP se integra no mecanismo de autenticação.