Autenticação Linux Usando OpenLDAP, Parte Um

Por David "Del" Elson
Última atualização em 25 de Junho de 2001

Introdução

Este é o primeiro de dois artigos que irão discutir um número de aspectos relacionados à autenticação no Linux usando LDAP. Eu irei apresentar o LDAP, a instalação e configuração do OpenLDAP, a migração para o OpenLDAP e a configuração de consultas LDAP. Nesta série, irei centrar o foco no Red Hat Linux versão 7.1 (com alguns comentários sobre versões anteriores), entretanto, muitos dos mesmos princípios podem ser aplicados ao Debian e outras distribuições Linux

Autenticação, PAM e NSS

A autenticação é o processo em que um usuário que está fazendo o login em um sistema Linux tem suas credenciais checadas antes de ter permissão de acesso. Normalmente isto significa que ele precisa fornecer um nome de login e uma senha.

Muitos programas diferentes fornecem autenticação, cada um usando um método diferente. Por exemplo, o programa básico Unix login fornece uma interface de texto simples para um usuário entrar um user ID e uma senha. Sisgemas de login gráfico como o XMD (ou GDM, ou KDM), fornecem uma interface diferente. Programas como o SSH podem autenticar usuários baseados em coisas como chaves RSA ou DSA, bem como assinaturas.

Existem muitos ssitemas de autenticação e protocolos de autenticação diferents disponíveis no Linux hoje. Como todo sistema Unix tradicional, o Linux é capaz de autenticar usuários contra entradas nos arquivos /etc/passwd e /etc/shadow, mas ele também suporta esquemas de autenticação como o Kerberos, RADIUS, e LDAP, que significa Lightweight Directory Access Protocol (Protocolo Leve de Acesso a Diretórios).

O PAM (que significa Pluggable Authentication Modules -- Módulos de Autenticação Plugáveis) é um conjunto de bibliotecas fornecidos com a maioria das distribuições Linux modernas, e é instalado por padrão no Red Hat Linux. As bibliotecas PAM fornecem uma interface consistente a um protocolo de autenticação. Uma aplicação pode usar as bibliotecas PAM para permitir o uso de qualquer protocolo de autenticação dentro da aplicação, assim, se o administrador de sistema quer mudar de, por exemplo, autenticação /etc/passwd para o LDAP, a aplicação não precisa ser re-escrita ou recompilada. O PAM exige um módulo PAM para cada sistema de autenticação. Existem mais módulos de autenticação PAM no site acima.

Infelizmente, o PAM somente fornece parte da informação necessária para controlar os usuários em um sistema Linux. Além de permitir checar se um usuário entrou com a senha correta, um sistema Linux precisa outras informações, como o ID numérico do usuário, o diretório home, o shell padrão, etc. Esta informação, que normlmente é armazenada no arquivo /etc/passwd, pode ser determinada através de uma interface de sistema conhecida como NSS, ou Name Service Switch.

Somente alguns esquemas de autenticação fornecem informações suficientes para serem úteis para NSS. Por exemplo, o Kerberos somente armazena informação de autenticação de usuários, e não detalhes como o diretório home ou shell padrão. Assim, não há um módulo NSS para o Kerberos.

O que é o LDAP?

O LDAP, ou Lightweight Directory Access Protocol, é um protocolo de rede que é usado para acessar informações em um banco de dados orientado a objetos. O LDAP inclui funcionalidades que o tornam útil tanto para o PAM quanto para o NSS, pois pode autenticar usuários, bem como fornecer informações sobre o usuário como nomes de diretórios home e shell padrão para o NSS.

Um Servidor LDAP ou Servidor de Diretório (às vezes abreviado como DS) é um servidor que pode enviar e receber informações via protocolo LDAP. Tipicamente, um servidor LDAP é um software que "ouve" as portas padrão LDAP (389 e às vezes 636) por conexões, e responde a solicitações e consultas LDAP. Para fazer uma analogia com bancos de dados, o LDAP é o equivalente do SQL, e o servidor SQL é como um servidor de bancos de dados, como o Oracle ou MySQL.

Servidores LDAP são particularmente úteis para armazenar informações sobre pessoas. Isto por causa da natureza orientada a objeto do LDAP. Diferente de um banco de dados relacional, um objeto em um diretório LDAP pode conter um número arbitrário de atributos, e cada atributo pode ter um número arbitrário de valores. Isto o torna útil por várias razões. Por exemplo, uma linha de bancos de dados contendo uma coluna para um número de telefone irá permitir uma única entrada naquela coluna de número de telefone para cada linha no banco de dados. Uma pessoa, entretanto, pode ter mais de um número de telefone, assim o LDAP permite que múltiplos números de telefones sejam armazenados no mesmo objeto de pessoa. Note a diferença sutil de terminologia aqui: nós dissemos um 'diretório' LDAP, em vez de 'banco de dados', nós chamamos as entradas no diretório de 'objetos', em vez de 'linhas', e chamamos os valores de campos de um objeto de 'atributos', em vez de 'colunas'.

Por quê usar o LDAP?

Existem várias razões por quê devemos usar o LDAP:

OpenLDAP

O OpenLDAP é uma implementação open source de um servidor de diretório LDAP. O OpenLDAP é instalado por padrão no Red Hat 7.1 e posteriores, e está disponível nas versões 6.2 e posteriores do Red Hat. Note que versões anteriores do Red Hat usam a versão 1 do OpenLDAP. Apesar de ser considerado uma versão estável pelo time OpenLDAP, por um número de razões de segurança eu alerto contra o uso do mesmo. Por exemplo, ele não suporta o SSL ou checagem de esquema. Sua versão do OpenLDAP deve ser a 2.0.7-3 ou posterior.

Instalando o OpenLDAP

Como sempre, você pode instalar o OpenLDAP a partir do código fonte, baixando o mesmo do web site do OpenLDAP, e seguindo as intruções de compilação. Minha preferência, entretanto, é instalar os pacotes OpenLDAP dos arquivos RPM conforme segue. Note que você precisa instalar tanto o pacote do servidor quanto do cliente se você quiser configurar um servidor OpenLDAP. Primeiro, coloque seu CD-ROM do Red Hat na unidade de leitura e use a seguinte seqüência de comandos:

  1. mount /dev/cdrom /mnt/cdrom
  2. cd /mnt/cdrom/RedHat/RPMS
  3. rpm -Uhv openldap-2.0.7-14.i386.rpm openldap-servers-2.0.7-14.i386.rpm
  4. umount /mnt/cdrom

É possível que os pacotes já estejam realmente instalados em seu sistema (para verificar isto você pode executar o comando rpm -q openldap). Também é possível que você precise resolver alguma dependência na instalação dos RPMs acima. Em particular, os pacotes do OpenLDAP exigem o pacote OpenSSL, e, pelo menos, o pacote krb5-libs.

LDAP, e bibliotecas PAM e NSS

Para poder usar o LDAP provavelmente você irá precisar instalar as bibliotecas PAM para o LDAP. No Red Hat 6.2 e posteriores, estas estão incluídas ni pacote nss_ldap (uma vez que as bibliotecas pam_ldap não são muito úteis sem as bibliotecas nss_ldap e vice-versa). Elas são instaladas normalmente por padrão - para testar, use o comando run -q nss_ldap. Se o pacote nss_ldap não está instalado, você pode instalar o mesmo usando o RPM conforme segue:

mount /dev/cdrom /mnt/cdrom
cd /mnt/cdrom/RedHat/RPMS
rpm -Uhv nss_ldap*.rpm
umount /mnt/cdrom

Se você precisar obter o código fonte das bibliotecas pam_ldap e nss_ldap, elas estão disponíveis no PADL.com, nos seguintes locais:

Configurando o OpenLDAP

A configuração do OpenLDAP é feita através do arquivo /etc/openldap/slapd.conf. Existe uma página man descrevendo o conteúdo do arquivo slapd.conf (veja man slapd.conf) bem como um excelente guia de administração no site do OpenLDAP. Como ponto inicial, você pode querer usar este arquivo simples de configuração:

#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/nis.schema
include         /etc/openldap/schema/rfc822-MailMember.schema
include         /etc/openldap/schema/autofs.schema
include         /etc/openldap/schema/kerberosobject.schema

#######################################################################
# ldbm database definitions
#######################################################################

database        ldbm
suffix          "o=MyCompany,c=AU"
rootdn          "uid=root,ou=People,o=MyCompany,c=AU"
rootpw          secret
directory       /var/lib/ldap
# Indices to maintain
index   objectClass,uid,uidNumber,gidNumber     eq
index   cn,mail,surname,givenname               eq,subinitial

#
# ACLs
#

access to dn=".*,ou=People,o=MyCompany,c=AU"
   attr=userPassword
 by self write
 by dn="uid=root,ou=People,o=MyCompany,c=AU" write
 by * auth

access to dn=".*,o=MyCompany,c=AU"
 by self write
 by dn="uid=root,ou=People,o=MyCompany,c=AU" write
 by * read

access to dn=".*,o=MyCompany,c=AU"
 by * read

defaultaccess read

Uma coisa que deve ser notada no arquivo de configuração acima: os usuários devem substituir "o=MyCompany,c=AU" no arquivo com um Base DN que represente sua organização. Note que eu prefiro utilizar a especificação estilo X.500 acima, mas você pode usar a especificação DNS, que é "dc=mycompany,dc=com,dc=au" ou similar. Por exemplo, se sua comania for chamada "farnarkle.com", você pode usar "dc=farnarkle,dc=com" ou pode usar "o=farnarkle,c=US". Lembre desta Base DN, ela será importante mais tarde.

Eu resolvi incluir algum Controle de Acesso elementar no arquivo. O arquivo padrão slapd.conf incluído com o Red Hat Linux não inclui ACLs, mas elas são obrigatórias em uso real. Você pode querer expandir as ACLs acima (veja o manual slapd.conf ou o guia do administrador).

Eu incluí uma senha root padrão - 'secret'. Esta é uma má idéia uma vez que você tenha dados no seu diretório LDAP. Iremos tratar isto mais tarde.

Uma vez que você tenha um arquivo slapd.conf funcional, você pode iniciar seu servidor. É bem fácil fazer isto, você só precisa executar o seguinte comando:

/etc/rc.d/init.d/ldap start

Desde que o arquivo slapd.conf esteja correto, você deve poder usar o pstree para ver um processo slapd em execução. Se o arquivo slapd.conf estiver errado, procure as mensagens de erro (executar o slapd -d pode ser de ajuda), corrija qualquer problema que você veja, e tente novamente.

Migrando para o OpenLDAP

Uma vez que você tenha seu servidor LDAP iniciado, você terá um diretório vazio. A primeira coisa que você precisa fazer é popular o mesmo com dados de sua base de autenticação existente.

Usando as ferramentas LDAP fornecidas

O OpenLDAP fornece uma suite de ferramentas para migrar dados de sua base NIS ou /etc/passwd existente para o LDAP. Se você atualmente executa outro esquema de autenticação como o Kerberos ou S/Key, e está migrando para o LDAP, então eu acho que você está por conta.

No Red Hat Linux 7.1, as ferramentas de migração estão em /usr/share/openldap/migration. No Red Hat 6.2 e anteriores elas estão em /usr/lib/openldap/migration/. Em qualquer dos casos, abra uma janela de shell, mude para aquele diretório, e comece a trabalhar. Primeiro, edite o arquivo migrate_common.ph. Perto da linha 72 você vê um par de linhas parecidas com estas:

$DEFAULT_MAIL_DOMAIN = "babel.com.au";
$DEFAULT_BASE = "o=Babel,c=AU";

Você precisará editar estas duas linhas, colocando seu domínio de correio padrão e a Base DN que você definiu anteriormente no arquivo slapd.conf. A seguir, é só executar as ferramentas de migração. Isto pode ser feito usando um comando simples, assumindo que você está migrando do /etc/passwd para o LDAP:

migrate_all_online.sh

(certifique-se que seu servidro LDAP está sendo executado antes de usar o comando acima). Este comando irá perguntar qual o seu DN root e senha (entre a senha secret que definimos no arquivo slapd.conf), e irá inciar a popular seu diretório LDAP.

Configurando consultas LDAP

Ter os dados no diretório LDAP é bom, mas em algum momento você irá querer consultar os dados. Existe um conjunto padrão de ferramentas de consulta e administração do LDAP baseadas em linha de comando que são fornecidas com o OpenLDAP. Estas incluem o ldapadd, ldapmodify, e o ldapsearch. Cada uma destas ferramentas possui uma página man, e você deve ler em detalhes estas páginas.

O arquivo de configuração padrão para estas ferramentas é o /etc/openldap/ldap.conf. O formato de arquivo é bastante simples. Em um único sistema ele precisa conter somente as seguintes duas linhas:

BASE o=MyCompany,c=AU
URI ldap://127.0.0.1

Lembre-se de substituir o Base DN pelo que você definiu no arquivo slapd.conf, no lugar do o=MyCompany,c=AU mostrado acima.

Em uma rede, você pode ter que substituir o endereço 127.0.0.1 pelo endereço IP do seu servidor LDAP. Para aqueles que entendem um pouco melhor os conceitos do LDAP: o OpenLDAP não suporta (ainda) a localização base SLP ou DNS RR, assim, você precisa ser bastante perciso acerca da localização do servidor -- ou um endereço IP, um nome de host em /etc/hosts, ou algo que possa ser encontrado no DNS.

Uma vez que você tenha feito isto, você deve poder executar uma pesquisa simples. Você pode começar procurando seu usuário root usando o comando abaixo:

ldapseach -x 'uid=root'

Você deve ver uma entrada bastante parecida com a abaixo:

version: 2

#
# filter: uid=root
# requesting: ALL
#

# root,People,MyCompany,AU
dn: uid=root,ou=People,o=MyCompany,c=AU
uid: root
cn: root
sn: root
mail: root@mycompany.com.au
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: kerberosSecurityObject
objectClass: shadowAccount
shadowMax: 99999
shadowWarning: 7
krbName: root@MYCOMPANY.COM.AU
loginShell: /bin/bash
uidNumber: 0
gidNumber: 0
homeDirectory: /root
gecos: root

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Agora que você chegou tão longe, pare e sorria. Você conseguiu fazer o LDAP funcionar, o que às vezes não é uma tarefa fácil!

Isto nos leva ao fim do primeiro artigo desta série de dois artigos. No próximo artigo, iremos continuar a discussão do OpenLDAP e do Linux, cobrindo assuntos como: Configurar o PAM e NSS para o LDAP, Ferramentas LDAP, tornar o OpenLDAP mais seguro e a geração de chaves SSL para o OpenLDAP.

Artigo original: http://online.securityfocus.com/infocus/1427

1