Nesta seção apresentaremos informações sobre instalação, configuração, execução e administração de um Servidor LDAP (Lightweight Directory Access Protocol) em um computador com Linux, utilizando o OpenLDAP. Você aprenderá como recuperar informações do seu Diretório, utilizando os clientes e utilitários fornecidos. Serão tratados assuntos como a migração de sua base de usuários para um banco de dados LDAP, quais informações serão importadas, de que modo efetuar autenticação e acesso remoto através do LDAP, entre outros.
LDAP é um protocolo (executado sobre o TCP/IP) cliente-servidor, utilizado para acessar um serviço de Diretório. Ele foi inicialmente usado como uma interface para o X.500, mas também pode ser usado com autonomia e com outros tipos de servidores de Diretório. Atualmente, vem se tornando um padrão, e diversos programas já têm suporte a LDAP. Livros de endereços, autenticação, armazenamento de certificados digitais (S/MIME) e de chaves públicas (PGP) são alguns dos exemplos onde o LDAP já é amplamente utilizado.
Um Diretório é como um banco de dados, mas tende a conter mais informações descritivas, baseadas em atributo e é organizado em forma de árvore, não de tabela. A informação em um Diretório é geralmente mais lida do que é escrita. Como conseqüência, Diretórios normalmente não são usados para implementar transações complexas, ou esquemas de consultas regulares em bancos de dados, transações estas que são usadas para fazer um grande volume de atualizações complexas. Atualizações em Diretórios são tipicamente simples ou nem são feitas.
Diretórios são preparados para dar resposta rápida a um grande volume de consultas ou operações de busca. Eles também podem ter a habilidade de replicar informações extensamente; isto é usado para acrescentar disponibilidade e confiabilidade, enquanto reduzem o tempo de resposta.
Existem várias maneiras diferentes para disponibilizar um serviço de Diretório. Métodos diferentes permitem que diferentes tipos de informações possam ser armazenadas no Diretório, colocando requerimentos diferentes, sobre como aquela informação poderá ser referenciada, requisitada e atualizada, como ela é protegida de acessos não autorizados, etc. Alguns serviços de Diretório são locais, fornecendo o serviço para um contexto restrito (exemplo: o serviço finger em uma máquina isolada). Outros serviços são globais, fornecendo o serviço para um contexto muito maior (por exemplo, a própria Internet).
Serviços globais normalmente são distribuídos (Figura 13.1. Dados de um Diretório distribuídos em três servidores), ou seja, cada servidor é responsável por uma parte apenas. O DNS (Domain Name System) é um exemplo, ele é um tipo de serviço de Diretório, embora bastante especializado.
O modelo de serviço do Diretório LDAP é baseado em entradas. Uma entrada é um conjunto de atributos e é referenciada através de um nome distinto[37]. O DN é usado para referenciar uma entrada de forma não ambígua. Cada um dos atributos de entrada tem um tipo e um ou mais valores. Este tipos geralmente são palavras mnemônicas, como cn para nome comum, ou mail para endereço de correio eletrônico; existem RFCs (Request For Comments) que determinam estas palavras. Os valores dependem do tipo de atributo. Por exemplo, um atributo mail pode conter o valor <mari@marilia.br>. Um atributo photoJpeg irá conter uma fotografia.
No LDAP, entradas de Diretório são organizadas em uma hierarquia de árvore invertida, semelhante em alguns aspectos à organização do DNS. A estrutura desta árvore geralmente reflete limites políticos, geográficos e/ou organizacionais. O nó mais alto (raiz) é tipicamente o componente nome de domínio dc[38] de uma companhia, estado ou organização. Abaixo ficam as entradas representando estados ou organizações nacionais. Abaixo elas podem ser entradas representando pessoas, unidades organizacionais, impressoras, documentos, ou qualquer outra coisa em que você possa pensar. A Figura 13.2. Árvore de Diretório LDAP mostra um exemplo de um Diretório LDAP em árvore.
Apesar de termos entradas para países, o diretório não possui uma entidade centralizadora como, por exemplo, o root servers do DNS. A separação por países, por exemplo, pode ser útil para empresas multinacionais. A Figura 13.2. Árvore de Diretório LDAP também ilustra uma outra vantagem de um serviço de Diretórios. Os ramos da árvore podem estar em máquinas diferentes. No caso da Figura 13.2. Árvore de Diretório LDAP, a entrada o=Brasil Ltda está em um outro computador. Note que esta característica também é típica do DNS.
Já foram vistos alguns tipos de atributos usados nas entradas em um serviço de Diretórios: mail, cn, telephoneNumber e outros. Pode-se criar qualquer tipo de atributo, mas isto não é recomendado. No LDAP existem diversas classes de objetos, e cada classe contém uma lista de atributos obrigatórios e opcionais. Essa lista é tipicamente definida em uma RFC, mas empresas ou organizações também podem criar suas próprias classes, se necessário. O mais recomendado é tentar utilizar as classes e atributos já existentes.
Por exemplo, a classe person é definida da seguinte maneira (definida na RFC2256):
objectclass ( 2.5.6.6 NAME 'person' SUP top STRUCTURAL MUST ( sn $ cn ) MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) ) |
O servidor LDAP pode ser configurado para verificar as classes (através da opção schemacheck) e forçar o uso correto dos atributos. Isto geralmente é uma boa idéia; com a verificação das classes habilitada, será obrigatória a inserção dos atributos objectClass, sn e cn, por exemplo. Quando for definido que uma entrada do Diretório é da classe person, um atributo description será opcional. Entradas em Diretórios podem ter várias classes diferentes, basta apenas observar os requisitos de atributos de cada classe.
Uma entrada é referenciada pelo seu nome distinto DN. O DN é único e na sua construção utiliza o caminho inteiro, desde a entrada até o topo do Diretório. Por exemplo, na Figura 13.2. Árvore de Diretório LDAP, DN="cn=Maria A Silva,o=U de M,c=BR". As entradas também podem ser referenciadas através de um RDN (Relative Distinguished Name). Ainda neste exemplo o RDN é cn=Maria A. Silva. Pode-se fazer uma comparação com hostname (RDN) e FQDN (DN).
O LDAP define operações para consultar e atualizar o Diretório. Operações são fornecidas para adição e remoção de uma entrada do Diretório, modificação de uma entrada existente e modificação do nome de uma entrada. A operação LDAP de busca pode abranger a árvore toda (uma busca com escopo subtree) ou apenas um ramo, sem descer ou subir para os demais. Além de especificar com filtros quais entradas se deseja encontrar, também é possível especificar quais atributos destas entradas estão sendo procurados. Se os atributos não forem especificados, todos serão retornados.
Por exemplo, na Figura 13.2. Árvore de Diretório LDAP você pode querer pesquisar toda a sub-árvore de Diretório abaixo da Universidade de Marília, procurando por pessoas com o nome de Maria Silva, recuperando o endereço de correio eletrônico para cada entrada encontrada. O LDAP permite que você faça isto facilmente. Ou você pode querer buscar as entradas diretamente abaixo do c=BR, entrada para organizações com a palavra “Brasil” no seu nome, e que tenham um número de telefone. O LDAP permite que você faça isto também. A próxima seção descreve com mais detalhes o que você pode fazer com LDAP e como isto poderá ser útil.
Alguns serviços de Diretório não fornecem proteção, permitindo que qualquer um possa ver as informações. O LDAP fornece um método para autenticação de um cliente, ou prova sua identidade para um servidor de Diretório, pavimentando o caminho para um rico controle de acesso, protegendo as informações contidas no servidor.
O serviço de Diretório LDAP é baseado em um modelo cliente-servidor. Um ou mais servidores LDAP contêm os dados criando a árvore de Diretório LDAP. Um cliente LDAP conecta-se a um servidor e faz uma requisição. O servidor responde com a requisição, ou exibe um ponteiro para um local onde o cliente pode conseguir a informação (tipicamente, outro servidor LDAP). Pode-se fazer novamente uma comparação com o DNS, a diferença é que o servidor LDAP não faz buscas recursivas, ou seja, em nome do cliente. O cliente é encarregado de procurar pelo servidor até encontrar a informação desejada.
O slapd é um servidor de Diretório LDAP que pode ser executado em diferentes plataformas UNIX/Linux. Você pode usá-lo para fornecer o seu próprio serviço de Diretório, e pode conectá-lo a um serviço de Diretório LDAP global, ou executar o serviço para você mesmo. Algumas das características e potencialidades mais interessantes do slapd incluem:
Escolha do banco de dados: O slapd vem com quatro tipos diferentes de banco de dados que você pode escolher. São eles: LDBM, um banco de dados baseado em disco de alta performance; SHELL, uma interface de banco de dados para comandos arbitrários do Linux ou scripts de linha de comando e PASSWD, um banco de dados simples de um arquivo de senhas. A partir da versão 2.1 do OPENLDAP também existe a opção de usar BDB[39] como backend que é o padrão.
Múltiplas instâncias dos bancos de dados: O slapd fornece uma rica e poderosa facilidade no controle de acesso, permitindo a você controlar o acesso a informação em seu(s) banco(s) de dados. Você pode controlar o acesso às entradas baseadas em informação de autenticação LDAP, endereço IP, nome do domínio e outros critérios.
Gerenciamento de processos: O slapd utiliza vários processos para ter uma alta performance. Um único sub-processo slapd manuseia todas as requisições vindas, reduzindo a quantidade requisitada de recursos do sistema. O slapd irá automaticamente selecionar o melhor suporte a vários processos para a sua plataforma.
Replicação: O slapd pode ser configurado para usar réplicas. Este esquema de replicação mestre/escravo é vital em ambientes de grande volume, onde um único slapd não pode fornecer a disponibilidade ou a confiabilidade necessárias.
Facilidade de configuração: O slapd é altamente configurável. Através de um único arquivo de configuração ele permite mudar simplesmente tudo, sempre que você quiser alterar. As opções de configuração têm padrões razoáveis, tornando o seu trabalho muito mais fácil.
As características do openldap-2.1.x no Conectiva Linux são:
LDAPv2 e LDAPv3: O slapd suporta as versões 2 e 3 do LDAP. Ele fornece suporte para as últimas características enquanto mantém interoperabilidade com os clientes existentes. Por padrão, apenas o LDAPv3 está habilitado.
Autenticação SASL: O slapd tem suporte a serviços de autenticação diferenciados através do uso de SASL. A implementação SASL do slapd utiliza o software Cyrus SASL com suporte a vários mecanismos, incluindo DIGEST-MD5 e CRAM-MD5.
Camada de Transporte Segura: O slapd fornece proteções de privacidade e integridade através do uso de TLS. A implementação TLS do slapd utiliza o software OpenSSL[40].
Internacionalização: O slapd suporta Unicode e tags de linguagem.
O LDAP foi originalmente desenvolvido como um cliente para o X.500, o serviço de Diretório OSI. O X.500 define o Protocolo de Acesso a Diretório (DAP[41]) para os clientes usarem quando estiverem em contato com servidores de Diretório. O DAP é um protocolo pesado, que roda sobre uma camada OSI completa, e precisa de uma quantidade significante de recursos computacionais para ser executado. O LDAP roda diretamente sobre o TCP e fornece a maioria das funcionalidades do DAP, a um custo muito menor.
Este uso do LDAP torna fácil acessar o Diretório X.500, mas ainda exige um serviço X.500 completo, para tornar os dados disponíveis aos vários clientes LDAP que estão sendo desenvolvidos.
Se você já está executando um serviço X.500 e quer continuar a fazer isto, você provavelmente pode parar de ler este capítulo, ele é todo sobre como executar o LDAP via slapd, sem utilizar o X.500. Se você não está usando o X.500, quer parar de usar o X.500 ou não tem planos imediatos para executar o X.500, continue lendo.
É possível replicar dados de um servidor de Diretório slapd para um DAP X.500; isto permite que sua organização torne seus dados disponíveis como parte de um serviço de Diretório X.500 global em uma base somente para leitura.
Um outro caminho para tornar os dados em um servidor slapd disponíveis para a comunidade X.500 seria usando um DAP X.500 para porta de entrada do LDAP.
O slurpd é um servidor para Linux que auxilia o slapd, provendo a replicação do banco de dados. Ele é responsável pela distribuição das mudanças ocorridas no servidor master para o servidor slave (a réplica). Veja a Figura 13.3. Um Serviço de Diretório Replicado com Dados Distribuídos em Três Servidores.
O slapd e o slurpd se comunicam através de um simples arquivo texto, que é usado para registrar as mudanças. A sintaxe deste arquivo lembra um pouco a sintaxe dos arquivos resultantes do diff, no sentido de que estão descritas as entradas ou atributos que devem ser removidos, adicionados ou modificados. O slurpd irá se encarregar de aplicar estas mudanças ao servidor da réplica. Durante este processo, a réplica e o master ficarão diferentes.
Uma das questões mais importantes do pacote openldap é sem dúvida a autenticação. Isto é necessário para que a implementação estivesse em conformidade com o protocolo LDAPv3, que exige algum tipo de autenticação forte. Há basicamente dois mecanismos de autenticação:
Simple Bind ou autenticação simples, onde a senha trafega em texto puro. Recomenda-se o uso de TLS/SSL;
suporte a Simple Authentication and Security Layer, também conhecido com SASL, definido da RFC2222. A autenticação SASL também pode ser usada por outros servidores, como versões recentes Sendmail e Postfix, entre outros. Dependendo do mecanismo, a senha pode ou não trafegar criptografada.
Prós e contras de cada um dos mecanismos serão apresentados, para que o administrador possa escolher a melhor solução para a sua rede.
O processo de se conectar a um servidor LDAP e realizar alguma operação sempre começa com a autenticação do usuário. Esta autenticação pode ser de um usuário mesmo (ou seja, com login e senha), ou anônima, à semelhança do que pode ser feito com FTP. Normalmente operações de pesquisa (search) no diretório podem ser anônimas, mas acesso ao atributo de senha, por exemplo, precisa ser autenticado com um usuário real.
A operação de bind é a operação de autenticação de usuário. Quando nenhum DN (que seria o nome de login) é fornecido, a autenticação é considerada do tipo anônima. Abaixo, uma entrada de log do servidor LDAP mostrando uma autenticação anônima, uma pesquisa e um logout:
Mar 23 13:44:14 kepler slapd[13336]: conn=365 op=1 BIND dn="" method=128 Mar 23 13:44:14 kepler slapd[13336]: conn=365 op=1 RESULT tag=97 err=0 text= Mar 23 13:44:14 kepler slapd[13463]: conn=365 op=2 SRCH base="o=minhaorganizacao,c=br" scope=2 filter="(uid=usuario)" Mar 23 13:44:14 kepler slapd[13463]: conn=365 op=2 SEARCH RESULT tag=101 err=0 text= Mar 23 14:07:53 kepler slapd[13337]: conn=365 op=3 UNBIND |
Note que o argumento da operação BIND é uma string vazia, ou seja, foi uma autenticação “anônima”. Abaixo, o log de uma conexão autenticada de um usuário chamado usuario:
Mar 23 10:03:34 kepler slapd[2016]: conn=10 op=1 BIND\ dn="UID=USUARIO,OU=PEOPLE,O=MINHAORGANIZACAO,C=BR" method=128 Mar 23 10:03:34 kepler slapd[2016]: conn=10 op=1 RESULT tag=97\ err=0 text= Mar 23 10:03:34 kepler slapd[2012]: conn=10 op=2 SRCH base="o=minhaorganizacao,c=br" scope=2 filter="(uid=usuario)" Mar 23 10:03:34 kepler slapd[2012]: conn=10 op=2 ENTRY dn="uid=usuario,ou=People,o=minhaorganizacao,c=br" Mar 23 10:03:34 kepler slapd[2012]: conn=10 op=2 SEARCH RESULT tag=101 err=0 text= Mar 23 10:03:34 kepler slapd[2016]: conn=10 op=3 UNBIND |
A chamada autenticação simples, que era a única disponível nas versões 1.2.x do OpenLDAP, transmite a senha em texto claro através da rede até o servidor LDAP. Isso é pior do que parece. Sabe-se que o arquivo /etc/shadow contém as senhas da máquina Linux, por exemplo, mas que elas estão criptografadas, ou seja, mesmo tendo acesso a este arquivo, um atacante ainda precisaria realizar um ataque de dicionário para tentar descobrir as senhas. A autenticação simples do LDAP nem usa esses hashes. A senha vai em texto claro mesmo, exatamente como é digitada. Ou seja, totalmente vulnerável a sniffers de rede.
Versões anteriores do OpenLDAP tinham que usar programas externos para poder proteger essa operação, como por exemplo o Stunnel. Neste caso, a conexão é criptografada e esse perigo não existe.
Se for usada autenticação simples no OpenLDAP-2.1.x, então será preciso usar criptografia. A diferença é que agora ela é nativa, ou seja, não precisa mais do Stunnel. Mais adiante será mostrado como configurar o servidor e o cliente para usar criptografia; agora, apenas serão mostrado os tipos de sessões criptografadas disponíveis, que são dois: SSL e START-TLS.
Até agora sempre foi falado em proteger a autenticação. Na verdade, dependendo dos dados disponíveis no servidor LDAP, pode ser bastante interessante proteger a sessão toda, e não apenas a operação de BIND. O uso de SSL permite isso, ao contrário de alguns métodos da autenticação SASL, como será visto mais adiante, que só protegem a operação de autenticação.
Note que para usar SSL é necessário que o servidor tenha um certificado. A partir da versão 2.1 do OPENLDAP, certificados auto-assinados não são mais aceitos por padrão. É necessário o uso de um certificado emitido por uma CA própria ou comercial.
No modo SSL, o servidor LDAP vai atender, além da porta normal de serviço (389), uma porta para conexões criptografadas (ldaps, a porta 636). Assim, clientes que desejarem conexões criptografadas[42] devem usar a porta 636. Onde a criptografia não é necessária, usa-se a porta normal 389.
Um mesmo servidor pode ser configurado para escutar em ambas as portas ou apenas numa delas sem problemas. Ao usar SSL, após o estabelecimento da sessão, todos os dados estarão criptografados, e não apenas a operação de BIND.
A operação de start-tls é bastante semelhante à SSL comum (numa porta exclusiva), mas a criptografia acontece na porta não-ssl mesmo (ou seja, 389).
O cliente se conecta na porta 389 como sempre e pode agora escolher se quer uma sessão criptografada ou não. Se quiser uma sessão comum, sem criptografia, prossegue normalmente como se a opção start-tls não existisse. Mas, por outro lado, se quiser iniciar uma sessão criptografada, não é necessário trocar de porta (para a 636), basta utilizar o comando de start-tls e a sessão criptografada iniciará nesta porta mesmo, a 389.
Isto tem a vantagem de se ter apenas uma porta aberta, o que pode ser bom para algumas configurações de firewall, por exemplo. Mas nem todos os clientes suportam o recurso start-tls; alguns esperam encontrar a porta 636 quando é pedido que usem o recurso de criptografia. No servidor LDAP, ambas as opções podem estar habilitadas simultaneamente: SSL na porta 636 e START-TLS na porta normal, a 389.
SASL é um mecanismo genérico de autenticação para protocolos que precisem desse tipo de serviço. Vários serviços como o Sendmail, cyrus-imap e openldap-2.x são capazes de usar SASL, e mais aplicativos com este tipo de autenticação devem surgir.
SASL é genérico e pode oferecer diversos tipos de autenticação. Estes mecanismos são também conhecidos como plugins, e podem ser tão simples como o PLAIN, onde a senha trafega em texto claro, e avançados como DIGEST-MD5, onde é usado um método de desafio/resposta (challenge-response). Os pacotes fornecidos no Conectiva Linux implementam pelo menos os seguintes mecanismos de autenticação SASL:
ANONYMOUS: autenticação anônima, ou seja, não é fornecido nem usuário nem senha;
CRAM-MD5: vários protocolos, para estarem em conformidade, precisam usar pelo menos este tipo de autenticação. Aqui é usado um hash MD5 em um mecanismo de desafio/resposta;
DIGEST-MD5: mecanismo novo, provavelmente será obrigatório para novas versões de alguns protocolos. Aqui é implementada a última versão da especificação SASL-DIGEST-MD5, baseada na autenticação tipo DIGEST para HTTP; pode criptografar o tráfego da sessão;
PLAIN: a senha trafega em texto claro e é o único mecanismo onde uma cópia da senha do usuário é efetivamente enviada para o servidor. Deve ser usado em conjunto com criptografia para proteger a senha.
GSS-API: utiliza KERBEROS 5 para a autenticação. Opcionalmente pode criptografar a sessão também.
Estes mecanismos podem ser divididos em dois grupos: aquele onde o servidor possui uma cópia da senha do usuário (o chamado shared secret) e aquele onde o servidor possui apenas um hash da senha do usuário, ou nem possui a senha localmente (usado por PLAIN). Ironicamente, os mecanismos shared secret são os que oferecem a chamada autenticação forte, embora a senha dos usuários seja armazenada sem criptografia (com exceção do GSS-API).
Para saber quais são os mecanismos de autenticação SASL suportados por um servidor LDAP, execute:
# ldapsearch -h host -x -b ¨¨ -s base supportedSASLMechanisms |
O mecanismo PLAIN não é um mecanismo de autenticação seguro por si só, pois a senha do usuário é transmitida sem qualquer proteção. Por isso é necessário o auxílio de criptografia. Por outro lado, este mecanismo na forma como é implementado aqui é bastante flexível em termos da forma como ele autentica o usuário, ou seja, de onde ele pega a senha:
passwd: a senha é obtida através da chamada getpwnam(), que normalmente consulta o arquivo /etc/passwd. Este mecanismo não funciona se shadow passwords estiverem em uso;
shadow: semelhante a passwd, mas a senha é obtida de /etc/shadow. Aqui pode surgir um problema, pois este arquivo de senhas só pode ser lido pelo superusuário. Hoje em dia é comum que serviços rodem como usuários não privilegiados para aumentar a segurança do sistema. Estes serviços não conseguirão autenticar usuários usando /etc/shadow a não ser que voltem a rodar como superusuário. Uma outra saída é usar, por exemplo, outras permissões para o arquivo /etc/shadow de forma que o servidor slapd consiga lê-lo.
pam: também é possível usar PAM para autenticar usuários. Esta opção é bastante flexível, pois a autenticação pode acabar sendo feita por qualquer método suportado pela biblioteca PAM. No entanto, dependendo do método, pode-se incorrer no mesmo problema do /etc/shadow: o serviço precisa rodar como superusuário. Por exemplo, se PAM estiver configurado para autenticar usuários localmente através do /etc/shadow, o servidor que estiver usando SASL terá que rodar como superusuário.
Há outros métodos que não foram mostrados aqui. Para mais detalhes, consulte a documentação da biblioteca SASL em /usr/share/doc/sasl2-docs-[versão].
A biblioteca SASL do Cyrus suporta dois mecanismos de senhas compartilhadas: CRAM-MD5 e seu sucessor, DIGEST-MD5. Estes mecanismos necessitam de que o cliente e o servidor compartilhem um segredo, que é a própria senha. O servidor gera um desafio baseado nessa senha e o cliente prova o conhecimento da mesma senha se conseguir responder corretamente ao desafio.
Note que em nenhum momento a senha é enviada do cliente para o servidor e vice-versa, por isso esses mecanismos são considerados muito mais seguros. Mas, para isso funcionar, o servidor precisa conhecer a senha, a senha mesmo, e não um hash dela ou uma versão criptografada. Ou seja, se o arquivo de senhas SASL do servidor for comprometido, todas as senhas serão imediatamente conhecidas pelo atacante, não sendo necessário nenhum ataque do tipo dicionário ou força bruta como seria o caso com um /etc/shadow comprometido.
![]() | Nota |
|---|---|
As senhas utilizadas nestes mecanismos ficam no arquivo /etc/sasldb2. É de fundamental importância que este arquivo seja protegido. Não deve ser permitido o acesso de usuários da máquina a este arquivo, pois isso comprometeria imediatamente todas as senhas SASL usadas neste servidor. | |
A proteção deste arquivo reflete de volta ao problema do /etc/shadow ilustrado anteriormente. Para que a aplicação possa efetivamente autenticar o usuário, ela precisa ter acesso a este arquivo. Ou seja, se o arquivo tiver permissões tais que apenas o usuário root pode ler seu conteúdo, então a aplicação que está autenticando o usuário também precisa rodar como root.
Uma alternativa é dar permissões 640, donos root.sasl ao arquivo e colocar os usuários sob os quais as aplicações rodam dentro do grupo “sasl” caso elas já não rodem como root (sendmail, por exemplo, roda como root, portanto não teria problemas nessa autenticação, mas outros serviços, como o próprio OpenLDAP, podem rodar como um usuário não-privilegiado). Os segredos no arquivo /etc/sasldb2 podem ser gerenciados com as ferramentas /usr/sbin/saslpasswd2 e /usr/sbin/sasldblistusers2.
Tanto a autenticação simples como a que usa SASL podem ser usados com o servidor OpenLDAP-2.1.x. Algumas considerações importantes:
autenticação simples e SASL PLAIN precisam ser protegidas por uma camada de criptografia. Do contrário as senhas poderão ser capturadas em trânsito;
mecanismos SASL de segredos compartilhados são bastante avançados e não precisam de criptografia adicional para proteger a autenticação propriamente dita;
nos mecanismos SASL compartilhados (e no “sasldb” do mecanismo PLAIN), as senhas ficam armazenadas em /etc/sasldb2, sem qualquer criptografia. Se o arquivo for comprometido, as senhas o serão também (lembre-se de que o plug-in sasldb deve estar instalado);
nem todos os aplicativos clientes suportam SASL, mas criptografia na camada de transporte (TLS) já é suportado por diversos aplicativos.
Neste guia não será usado SASL, mas sim a autenticação simples protegida por SSL, sendo que a maioria dos clientes já suportam TLS/SSL, o que contorna o problema da autenticação simples.
Por outro lado, SASL é importante para autenticar o próprio administrador do diretório (já que essa senha usualmente sempre ficava armazenada no arquivo /etc/openldap/slapd.conf), ou mesmo para autenticar os servidores slave usados na replicação da base de dados LDAP.
Para executar a configuração sugerida por este guia para a implementação de um servidor LDAP, é necessário verificar o seguinte requisito:
Levantamento dos dados que serão armazenados no servidor: verificação da necessidade de replicação de dados, definição da hierarquia de servidores, entre outros necessários antes de instalar o servidor.
Para instalação do servidor LDAP, será utilizado o OpenLDAP. Execute o Synaptic e selecione os seguintes pacotes para a instalação:
openldap
openldap-server
openldap-client
nss_ldap
pam_ldap
migrationtools-common
migrationtools-offline
ou utilize o comando apt-get:
# apt-get install openldap openldap-server openldap-client # apt-get install migrationtools-offline # apt-get install nss_ldap pam_ldap |
Edite o arquivo /etc/openldap/slapd.conf e modifique as seguintes opções:
suffix "o=minhaorganizacao, c=br"
rootdn "cn=manager, o=minhaorganizacao, c=br"
rootpw minha-senha
...
# For Netscape Roaming support, each user gets a roaming
# profile for which they have write access to
access to dn=".*,ou=Roaming,o=minhaorganizacao,c=br"
by dnattr=owner write
# The userPassword by default can be changed by the
# entry owning it if they are authenticated.
# Others should not be able to see it, except the
# admin entry below
access to attr=userPassword
by dn="cn=manager,o=minhaorganizacao,c=br" write
by anonymous auth
by self write
by * none
# Full rights to the admin
access to *
by dn="cn=manager,o=minhaorganizacao,c=br" write
by * read
|
onde:
suffix: a raiz, a base do seu Diretório.
rootdn: o login do administrador.
rootpw: a senha do administrador; pode ser colocada criptografada. Consulte a página de manual do slapd.conf (man slapd.conf) para mais informações.
Os três últimos blocos definem Controles de Acesso a características e permissões para o servidor LDAP.
As outras opções já estão configuradas com os valores padrão.
Para habilitar LDAPS:// (LDAP sobre SSL na porta 636 para clientes que não suportam START-TLS), basta acrescentar a opção -h "ldaps://" na chamada ao servidor LDAP. Para fazer isso, deve-se editar o arquivo localizado em /etc/sysconfig/ldap. Abaixo este arquivo está reproduzido:
# configuration file for the ldap startup script # change to "yes" if you want the ldap server (slapd) to # also listen on the ldaps (636) port. Otherwise, encryption # will only be possible via START-TLS LDAPS=no # You may define an user and group here if you want to. The ldap # server will then be started using the user and group specified # here. Be aware that you will also have to change permissions # on the database if you use this! Some authentication methods, # specially those using SASL, may fail if they can't access # /etc/shadow or something like that. You may want to check # the use of SASL's pwcheck method in that case. USER=ldap GROUP=ldap |
Se o parâmetro LDAPS for trocado para yes, o servidor LDAP, após ser reiniciado, irá também escutar na porta 636 (a porta reservada para ldaps). Trocando para no, o servidor irá atender apenas na porta 389 (e sessões criptografadas apenas estarão disponíveis para clientes que suportarem START-TLS).
Neste arquivo de configuração também é possível trocar o usuário sob o qual o servidor é executado. Por padrão, o servidor roda como usuário ldap e grupo ldap e o pacote está ajustado para rodar como estes usuários. Se, no entanto, o administrador tiver outro usuário para esta função, ou desejar rodar o serviço como root, basta trocar estas linhas. Para rodar o serviço como superusuário, basta comentar ambas as linhas (USER e GROUP).
![]() | Importante |
|---|---|
Note que ainda é necessária a instalação do certificado e da chave privada no servidor LDAP. Consulte a documentação do slapd.conf para mais informações. | |
Agora deve-se configurar alguns clientes para usarem SSL ao se conectarem ao servidor LDAP. Pacotes como nss_ldap e pam_ldap já virão configurados para usarem START-TLS, mas também será mostrado aqui como isso foi feito.
Os programas cliente do pacote openldap-client utilizam um arquivo de configuração global chamado ldap.conf localizado em /etc/openldap/.
![]() | Nota |
|---|---|
É importante frisar: não confunda o arquivo /etc/openldap/ldap.conf do servidor LDAP, mencionado no parágrafo anterior, com o arquivo de configuração do módulo PAM e do nss_ldap, que é /etc/ldap.conf. | |
Há basicamente duas opções que precisam ser configuradas: uso ou não de SASL e uso ou não de SSL. Será usado como exemplo o programa ldapsearch, utilizado para fazer pesquisas em um servidor LDAP. Os dois parâmetros utilizados serão:
-x: utilizar autenticação simples, ou seja, não utilizar SASL. Isso requer que criptografia seja usada, pois a senha é transmitida em texto claro. Para isso serve o próximo parâmetro;
-Z[Z]: utilizar START-TLS. Com apenas um Z (-Z), o cliente tentará usar START-TLS se esta opção estiver disponível no servidor; caso contrário, usará uma conexão não criptografada comum. Com um segundo Z (-ZZ), o uso de START-TLS é obrigatório e a conexão será encerrada se esta opção não estiver disponível no servidor. É fortemente recomendado que sempre se use -ZZ, portanto.
Ainda é possível usar LDAPS:// em vez de START-TLS, usando -H ldaps:///.
Mais adiante neste manual, o leitor verá como usar LDAP para autenticar seus usuários, e então nss_ldap e pam_ldap serão mencionados. Por padrão, o uso de START-TLS já é habilitado nestes pacotes. A configuração necessária para isso é apenas uma linha em /etc/ldap.conf:
ssl start_tls |
Alternativamente, LDAPS também pode ser usado. Para isso, coloque:
ssl on |
Para desabilitar SSL ou START-TLS, use:
ssl off |
Note que as duas opções não podem ser usadas ao mesmo tempo: é uma ou outra.
Antes de executar os scripts de migração, modifique o arquivo /usr/share/openldap/migration/migrate_common.ph:
$DEFAULT_MAIL_DOMAIN = "minhaorganizacao.com.br"; $DEFAULT_BASE = "o=minhaorganizacao,c=br"; $EXTENDED_SCHEMA = 0; |
O valor padrão para o campo $EXTENDED_SCHEMA é zero. Se for modificado para 1, irá ativar o suporte a outras classes de objetos, como person, por exemplo.
Este script irá pesquisar vários arquivos do diretório /etc e criar as entradas no seu Diretório. Note que o último comando é utilizado para deixar os arquivos do diretório com usuário e grupo ldap.
# cd /usr/share/openldap/migration/ # ./migrate_all_offline.sh Creating naming context entries... Migrating aliases... Migrating groups... Migrating hosts... Migrating networks... Migrating users... Migrating protocols... Migrating rpcs... Migrating netgroups... Importing into LDAP... Migrating netgroups (by user)... Migrating netgroups (by host)... Preparing LDAP database... # chown ldap.ldap /var/lib/openldap-data/* |
![]() | Nota |
|---|---|
Esta ação irá migrar apenas os usuários com UID entre 500 e 65533. | |
BASE o=minhaorganizacao,c=br URI ldap://servidor.ldap.minhaorganizacao |
![]() | Atenção |
|---|---|
Se o servidor LDAP estiver utilizando SSL, é imprescindível que a opção URI descrita acima seja substituída pelo nome da máquina onde esteja o servidor. Isto porque o LDAP irá utilizar o comando hostname para identificar o servidor, e se esta opção estiver preenchida com localhost, não será possível completar a autenticação. | |
Use ldaps:// acima, se estiver usando LDAPS (porta 636, portanto).
Para iniciar o servidor LDAP, digite:
# service ldap start |
O OpenLDAP é ligado com o sistema TCP/Wrappers. Por este motivo o controle de acesso pode ser feito através dos arquivos /etc/hosts.allow e /etc/hosts.deny, além do recurso de ACLs do próprio OpenLDAP. Utilize estes arquivos para controlar as máquinas que irão acessar o servidor LDAP. Para acessar através do próprio servidor, caso o arquivo /etc/hosts.deny esteja com o parâmetro ALL:ALL, insira no /etc/hosts.allow a linha:
ALL: localhost |
Abra um terminal e utilize os seguintes comandos:
para verificar tudo que existe no Diretório:
$ ldapsearch "objectclass=*" -x version: 2 # # filter: objectclass=* # requesting: ALL # # minhaorganizacao, br dn: o=minhaorganizacao,c=br dc: minhaorganizacao objectClass: top objectClass: domain # People, minhaorganizacao, br dn: ou=People,o=minhaorganizacao,c=br ou: People objectClass: top objectClass: organizationalUnit ... |
para verificar se os usuários foram inseridos:
$ ldapsearch uid=usuario -x version: 2 # # filter: uid=usuario # requesting: ALL # usuario, People, minhaorganizacao, br dn: uid=usuario,ou=People,o=minhaorganizacao,c=br uid: usuario cn: usuario objectClass: account objectClass: posixAccount objectClass: top objectClass: shadowAccount shadowLastChange: 11725 shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 501 gidNumber: 501 homeDirectory: /home/usuario # numResponses: 2 # numEntries: 1 |
para verificar se as senhas foram inseridas usando a senha do administrador do Diretório:
$ ldapsearch -D cn=manager,o=minhaorganizacao,c=BR \
-W uid=usuario -x -ZZ
Enter LDAP Password:
version: 2
#
# filter: uid=usuario
# requesting: ALL
#
# usuario, People, minhaorganizacao, br
uid=usuario,ou=People,o=minhaorganizacao,c=br
uid=usuario
cn=usuario
sn=usuario
mail=usuario@minhaorganizacao.com.br
objectclass=person
objectclass=organizationalPerson
objectclass=inetOrgPerson
objectclass=account
objectclass=posixAccount
objectclass=top
objectclass=kerberosSecurityObject
userpassword={crypt}VazDY6ytbW/YI
krbname=usuario@MINHAORGANIZACAO.COM.BR
loginshell=/bin/bash
uidnumber=500
gidnumber=500
homedirectory=/home/usuario
# numResponses: 2
# numEntries: 1 |
De acordo com as ACLs, o administrador sempre tem acesso a todos os atributos.
para verificar a senha do seu usuário usando sua própria senha:
$ ldapsearch -D uid=usuario,ou=people,o=minhaorganizacao,c=br \
-W uid=usuario -x -ZZ
Enter LDAP Password:
version: 2
#
# filter: uid=usuario
# requesting: ALL
#
# usuario, People, minhaorganizacao, br
uid=usuario,ou=People,o=minhaorganizacao,c=br
uid=usuario
cn=usuario
sn=usuario
mail=usuario@minhaorganizacao.com.br
objectclass=person
objectclass=organizationalPerson
objectclass=inetOrgPerson
objectclass=account
objectclass=posixAccount
objectclass=top
objectclass=kerberosSecurityObject
userpassword={crypt}VazDY6ytbW/YI
krbname=usuario@MINHAORGANIZACAO.COM.BR
loginshell=/bin/bash
uidnumber=500
gidnumber=500
homedirectory=/home/usuario
# numResponses: 2
# numEntries: 1 |
Note que as ACLSs deverão estar elaboradas de tal forma, que o atributo userpassword possa ser lido somente pelo próprio usuário e pelo usuário root.
Seu servidor LDAP pode autenticar usuários, usando um mecanismo chamado PAM[43] (Módulos de Autenticação Plugáveis). Desde o princípio do Linux, a autenticação de um usuário foi feita através da entrada de uma senha pelo usuário, e o sistema verificando se a senha digitada corresponde à senha oficial criptografada, que fica armazenada no arquivo /etc/passwd. Isto foi apenas no início. Desde então, um número de novos caminhos para a autenticação de usuários vem se tornando popular, incluindo substituições mais complicadas, como por exemplo para o arquivo /etc/passwd e dispositivos de hardware chamados de Smart Cards.
O problema é que a cada vez que um novo esquema de autenticação é desenvolvido, requer que todos os programas necessários (login, ftpd, etc.) sejam reescritos para suportar este novo esquema. O PAM fornece um caminho para desenvolver programas que são independentes do esquema de autenticação. Estes programas precisam de módulos de autenticação, anexados a eles em tempo de execução, para que possam funcionar.
A seguir será visto como configurar o seu sistema para fazer a autenticação via LDAP. O método mais simples consiste em executar o authconfig; entretanto, para aqueles que preferem alterar o arquivo de configuração diretamente, basta seguir os passos abaixo.
No diretório /usr/share/doc/pam_ldap-XX, onde XX é a versão do módulo instalado, você encontrará o diretório pam.d.conectiva que é uma sugestão da Conectiva para o conteúdo do diretório /etc/pam.d. Faça um backup do seu diretório /etc/pam.d original e copie o novo diretório recomendado para o mesmo local:
# mv /etc/pam.d /etc/pam.d.org # cp -R /usr/share/doc/pam_ldapXX/pam.d.conectiva /etc/pam.d |
Edite o arquivo /etc/ldap.conf e altere as linhas HOST e BASE como já foi feito para o arquivo /etc/openldap/ldap.conf. Altere também o arquivo /etc/nsswitch.conf para o seguinte conteúdo:
passwd: files ldap nis nisplus shadow: files ldap nis nisplus group: files ldap nis nisplus |
Para testar a autenticação e o NSS, faça uma cópia do seu /etc/passwd:
# cp /etc/passwd /etc/passwd.org |
Remova deste arquivo um usuário com o comando userdel nome-do-usuário, para ter certeza de que ele não será encontrado no /etc/passwd. Em seguida, experimente:
$ id usuario_removido |
Será possível visualizar o nome do usuário. Experimente também acessar o Conectiva Linux com o usuário que havia no arquivo /etc/passwd.
![]() | Nota |
|---|---|
Se não for utilizar LDAP para autenticação, não esqueça de recuperar o seu /etc/passwd original para continuar com o uso do sistema: | |
# mv /etc/passwd.org /etc/passwd |
O GQ é um cliente LDAP para o ambiente X, com uma interface simples escrito para o Gnome, sendo possível executá-lo em outros gerenciadores de janela também. Instale-o utilizando o Synaptic e selecionando o pacote gq para a instalação.
Como usuário normal, inicialize o programa com o comando gq. Sua configuração também é simples, bastando adicionar o servidor LDAP que você gostaria de usar, e a Base DN do diretório. Um recurso interessante deste aplicativo é o modo de navegação, sendo possível observar o diretório em árvore e ter uma visão completa de todos os dados do diretório.
$ gq |
Para adicionar uma base, dirija-se ao menu -> e selecione a aba Servers, pressionando o botão para adicionar as configurações sobre o servidor LDAP.
Você já pode efetuar consultas. Vá para a aba Search, na janela principal, e proceda sua busca, selecionando o servidor. Em seguida, clique em , e o gq irá fazer a busca no servidor, mostrando os dados em caso de sucesso, ou mostrando uma mensagem No entries found caso os dados não estejam no servidor.
Veja na Figura 13.4. Buscas com o Cliente de LDAP GQ um exemplo de conexão:
Documento sobre LDAP .
Página oficial da Comunidade de desenvolvimento do OpenLDAP, incluindo um Guia para o administrador, em inglês .
Documento Como-Fazer que mostra a integração do LDAP com outras ferramentas, como por exemplo Radius, PAM e NSS.