Neste artigo vamos analisar a forma de instalar e configurar um servidor de LDAP no Debian Linux.
No entanto, antes disso, convém explicar o que vem a ser um servidor de LDAP. Assim vai-se explicar de uma forma rápida no que consiste o servidor de LDAP. E a seguir vamos instalar e configurar o OpenLDAP.
O servidor consiste numa base de dados leve que é acedida por diversos serviços unificando-se desta forma num único ponto a informação do sistema. Os servidores de LDAP podem ser utilizados para diversas funções:
Em regra, esta base de dados não é modificada com muita frequência, sendo utilizada mais para leitura do que para escrita.
A base de dados é organizada numa estrutura hierarquica em árvore. Por exemplo:
É importante compreender desde o início que esta árvore pode ter qualquer estrutura que nós queiramos. No entanto o modelo apresentado é seguido em muitos sitios, porque permite usar o DNS para para localizar serviços de LDAP.
O formato completo desta estrutura é definido no RFC2253 , "Lightweight Directory Access Protocol (v3): UTF-8 String Representation of Distinguished Names."
String | X.500 AttributeType |
---|---|
CN | commonName |
L | localityName |
ST | stateOrProvinceName |
O | organizationName |
OU | organizationalUnitName |
C | countryName |
STREET | streetAddress |
DC | domainComponent |
ID | userid |
A estrutura da árvore é governada por schemas. Existem muitos shemas standard.
Com a distribuição do OpenLDAP são fornecidos vários que podem ser utilizados como estão. Notar também que os serviços que suportam LDAP são feitos para funcionar com um certo schema, logo a nossa árvore tem de se adaptar a estes constrangimentos.
Na realidade não somos muito limitados por estes uma vez que é possível extender estes, ou mesmo criar novos shemas. É normal certas aplicações terem os seus próprios schemas, que deverão ser incluídos na configuração do servidor.
Outro ponto com que nos devemos preocupar é se o nosso servidor vai funcionar em modo standalone ou se vai interagir com outros servidores.O servidor LDAP pode ser configurado para depender de um servidor mestre, ou diferir os pedidos dos clientes para um terceiro servidor, eventualmente de nível superior. Por agora vamos apenas preocupar-nos com a configuração mais simples, i.e., uma configuração composta apenas por um servidor e multiplos clientes.
No Debian a instalação é bastante simples. Para instalarmos o servidor de LDAP basta fazer:
# apt-get install slapd ldap-utils libsasl2
Vai aparecer uma tela onde se pergunta se se quer que o sistema faça a configuração inicial do servidor. A configuração que é feita é bastante standard e até poderia ser utilizada para os nossos objectivos. No entanto, para compreendermos melhor a estrutura do servidor, prefiro fazer a configuração completa, pelo que, vamos escolher Yes para omitir este passo da configuração.
Antes de termos o servidor correctamente configurado, convêm desligá-lo. Para isso fazemos:
/etc/init.d/slapd stop
O pacote openssl é utilizado para providenciar serviços de encriptação na ligação ao servidor LDAP. Uma vez que as redes são cada vez mais sítios inseguros e como um serviço de directório vai, pela sua própria natureza, conter material de caracter sensível, faz todo o sentido encriptar as comunicações com o servidor.
O pacote libsasl2 proporciona os mecânismos de autenticação ao servidor.
A configuração vai residir em /etc/ldap e tem a seguinte árvore de directorias:
. |-- ldap.conf |-- sasl2 `-- schema |-- README |-- corba.schema |-- core.ldif |-- core.schema |-- cosine.schema |-- dyngroup.schema |-- inetorgperson.schema |-- java.schema |-- misc.schema |-- nis.schema |-- openldap.ldif |-- openldap.schema `-- ppolicy.schema
Além desta estrutura ainda temos o ficheiro /etc/default/slapd onde são definidos alguns parâmetros de inicialização.
Em primeiro lugar vamos concentrar-nos no ficheiro /etc/ldap/slapd.conf. Este ficheiro pode ser dividido em três grandes secções, a primeira preocupa-se com os parâmetros necessários para o servidor funcionar, a segunda configura o backend da base de dados e finalmente, na terceira, definimos os níveis de acesso à informação.
Começamos por escolher os schemas que serão incluídos no servidor. Naturalmente que os schemas escolhidos dependem das aplicação que vão interagir com servidor.
# /etc/ldap/slapd.conf ##################### ## Parâmetros Globais # Schemas incluídos: include /etc/ldap/schema/core.schema include /etc/ldap/schema/cosine.schema include /etc/ldap/schema/inetorgperson.schema
A seguir é necessário definir o nível de logging que o servidor vai fazer:
# Registos (consultar slapd.conf(5) para mais informação): loglevel 296 pidfile /var/run/slapd/slapd.pid argsfile /var/run/slapd/slapd.args
São suportados módulos no servidor, que são carregados quando este é iniciado. Necessitamos de carregar o módulo do backend da base de dados:
# Onde estão guardados os módulos e qual o backend utilizado: modulepath /usr/lib/ldap moduleload back_bdb
O servidor OpenLDAP suporta vários mecanismos de autenticação (ver man 5 slapd.conf e procurar por sasl-secprops. No nosso servidor vamos utilizar:
# Negar o uso de autenticação em texto simples, ou anónima # Usar encriptação DES sasl-secprops noplain,noanonymous,minssf=56
Finalmente, na secção global, resta-nos definir o tipo de encriptação usado para guardar as palavras passe:
# Várias configurações de segurança: password-hash {SSHA}
Até agora a nossa configuração consiste de:
# /etc/ldap/slapd.conf ##################### ## Parâmetros Globais # Schemas incluídos: include /etc/ldap/schema/core.schema include /etc/ldap/schema/cosine.schema include /etc/ldap/schema/inetorgperson.schema # Registos (consultar slapd.conf(5) para mais informação): loglevel 296 pidfile /var/run/slapd/slapd.pid argsfile /var/run/slapd/slapd.args # Onde estão guardados os módulos e qual o backend utilizado: modulepath /usr/lib/ldap moduleload back_bdb # Negar o uso de autenticação em texto simples, ou anónima # Usar encriptação DES sasl-secprops noplain,noanonymous,minssf=56 # Várias configurações de segurança: password-hash {SSHA}
Agora, na segunda parte do ficheiro de configuração, vamos definir os parâmetros que governam a base de dados. O backend escolhido deve ser (na maioria dos casos) o bdb (baseado na Berkeley DB 4):
## Início da secção da base de dados backend bdb database bdb
Depois devemos definir o sufixo de raíz da base do nosso servidor:
# Roor suffix: suffix "dc=meudominio,dc=com"
Nesta altura define-se também o utilizador que vai administrar o servidor e a respectiva palavra passe:
# Administrador do servidor: rootdn "cn=Manager,dc=meudominio,dc=com" rootpw {SSHA}N9R59Iv4CCg+trgsG0XUOoZBMwisNiip
Para gerar o hash da palavra passe faz-se:
# slappasswd -s teste {SSHA}N9R59Iv4CCg+trgsG0XUOoZBMwisNiip
Neste caso a hash apresentada corrasponde à hash da palavra "teste".
Devemos definir a directoria que vai conter os ficheiros da base de dados:
# Directoria com a base de dados directory /arquivo/ldap # Modo de criação dos ficheiros (apenas leitura e escrita para o dono # do ficheiro mode 0600
Deve-se já criar esta directoria e dar-lhe as permissões e ownership adequadas (assume-se que foi criada a partição "/arquivo", como sugerido no artigo sobre a instalação do sistema operativo, se não tem esta directoria, deve escolher um sitio apropriado, com espaço suficiente para albergar a base de dados):
# mkdir /arquivo/ldap # chown openldap:openldap /arquivo/ldap
Na versão do Debian utilizada, este necessita de um ficheiro de configuração da base de dados, extra. Basta copiar a versão disponibilizada no pacote de instalação:
# cd /arquivo/ldap # cp /usr/share/doc/slapd/examples/DB_CONFIG . # chown openldap:openldap DB_CONFIG
Este ficheiro está profusamente comentado, pelo que mais tarde se devem ajustar os parâmetros de acordo com a carga a que o nosso servidor está sujeito.
O user e grupo openldap são automáticamente criados.
A base de dados faz uso intenso de índices para melhorar a performance de acesso à base. Devemos pois indicar ao servidor quais os índices que deve criar:
# Índices da base de dados index objectClass eq index cn pres,eq # Manter em memória 2000 registos cachesize 2000
Esta configuração vai indexar a informação necessária para fazer uma procura exacta quando se pergunta à base de dados quais as objectClass presentes. Também é indexada a informação necessária para responder a perguntas sobre o cn quanto à presença ou igualdade. Podem, e devem-se, acrescentar mais índices de acordo com os schemas escolhidos. Muitos dos problemas de performance devem-se à não construção dos índices ou então à sua definição de forma errada.
Temos pois, que, esta segunda secção consiste de:
## Início da secção da base de dados backend bdb database bdb # Roor suffix: suffix "dc=meudominio,dc=com" # Administrador do servidor: rootdn "cn=Manager,dc=meudominio,dc=com" rootpw {SSHA}N9R59Iv4CCg+trgsG0XUOoZBMwisNiip # Directoria com a base de dados directory /arquivo/ldap # Modo de criação dos ficheiros (apenas leitura e escrita para o dono # do ficheiro mode 0600 # Índices da base de dados index objectClass eq index cn pres,eq # Manter em memória 2000 registos cachesize 2000
Restanos agora definir os acessos ao nosso servidor:
## Listas de controlo de acesso access to * by * read
Estes controlos de acesso devem ser lidos da seguinte forma: "acesso a * (indica tudo) por * (indica todos) apenas de leitura".
Este é o tipo de acesso mais simples que se pode conceber. Num directório em produção vamos querer de certeza ter esquemas de acessos mais complicados. Por exemplo, é natural que queiramos dar acesso de escrita a certas pessoas na organização para actualizarem o livro de endereços.
Por agora este controlo vai ser suficiente para testar o servidor.
Notar que no ficheiro de configuração slapd.conf considera-se que estamos na mesma linha, desde que a linha seguinte comece com um espaço. Assim:
access to * by * read
É equivalente a:
access to * by * read
O nosso ficheiro /etc/ldap/slapd.conf fica:
# /etc/ldap/slapd.conf #################### # Parâmetros Globais # Schemas incluídos: include /etc/ldap/schema/core.schema include /etc/ldap/schema/cosine.schema include /etc/ldap/schema/inetorgperson.schema # Registos (consultar slapd.conf(5) para mais informação): loglevel 296 pidfile /var/run/slapd/slapd.pid argsfile /var/run/slapd/slapd.args # Onde estão guardados os módulos e qual o backend utilizado: modulepath /usr/lib/ldap moduleload back_bdb # Negar o uso de autenticação em texto simples, ou anónima # Usar encriptação DES sasl-secprops noplain,noanonymous,minssf=56 # Várias configurações de segurança: password-hash {SSHA} ## Início da secção da base de dados backend bdb database bdb # Roor suffix: suffix "dc=meudominio,dc=com" # Administrador do servidor: rootdn "cn=Manager,dc=meudominio,dc=com" rootpw {SSHA}N9R59Iv4CCg+trgsG0XUOoZBMwisNiip # Directoria com a base de dados directory /arquivo/ldap # Modo de criação dos ficheiros (apenas leitura e escrita para o dono # do ficheiro mode 0600 # Índices da base de dados index objectClass eq index cn pres,eq # Manter em memória 2000 registos cachesize 2000 ## Listas de controlo de acesso access to * by * read
Antes de pudermos inicializar o servidor, temos que definir alguns parâmetros de sistema. O ficheiro /etc/defaults/slapd é lido pelos scripts de inicialização do servidor. Os ajustes são simples o suficiente:
SLAPD_CONF=/etc/ldap/slapd.conf SLAPD_SERVICES="ldap:///"
A primeira variável modificada indica o caminho para o ficheiro de configuração que acabámos de criar e a segunda faz com que o servidor escute em todas as interfaces sem usar encriptação.
Pra iniciar o servidor fazemos:
# /etc/init.d/slapd start
Em /var/log/syslog vai aparecer:
Jun 4 17:00:51 localhost slapd[9944]: @(#) $OpenLDAP: slapd 2.3.30 (Mar 9 2007 05:43:02) $ ^Iroot@windlord:/tmp/buildd/openldap2.3-2.3.30/debian/build/servers/slapd Jun 4 17:00:51 localhost slapd[9944]: daemon: IPv6 socket() failed errno=97 (Address family not supported by protocol) Jun 4 17:00:51 localhost slapd[9947]: slapd starting Jun 4 17:00:51 localhost slapd[9949]: daemon: added 4r listener=(nil) Jun 4 17:00:51 localhost slapd[9949]: daemon: added 6r listener=0x8129c00 Jun 4 17:00:51 localhost slapd[9949]: daemon: added 7r listener=0x8129d00 Jun 4 17:00:51 localhost slapd[9949]: daemon: select: listen=6 active_threads=0 tvp=NULL Jun 4 17:00:51 localhost slapd[9949]: daemon: select: listen=7 active_threads=0 tvp=NULL
Para desligar o servidor fazer:
# /etc/init.d/slapd stop
Para verificarmos se o servidor está a correr, fazer:
$ ps -ef | grep slapd | grep -v grep openldap 1246 1 0 21:19 ? 00:00:00 /usr/sbin/slapd -g openldap -u openldap -f /etc/ldap/slapd.conf openldap 1247 1246 0 21:19 ? 00:00:00 /usr/sbin/slapd -g openldap -u openldap -f /etc/ldap/slapd.conf openldap 1248 1247 0 21:19 ? 00:00:00 /usr/sbin/slapd -g openldap -u openldap -f /etc/ldap/slapd.conf openldap 1252 1247 0 21:19 ? 00:00:00 /usr/sbin/slapd -g openldap -u openldap -f /etc/ldap/slapd.conf openldap 1283 1247 0 21:27 ? 00:00:00 /usr/sbin/slapd -g openldap -u openldap -f /etc/ldap/slapd.conf
Agora que temos o servidor configurado, é altura de construirmos os nós principais:
Devemos desligar o servidor:
# /etc/init.d/slapd stop
A seguir devemos construir o ficheiro LDIF, com o seguinte conteúdo:
# Ficheiro construção dos nós (/tmp/root_node.ldif) # Nó raiz dn: dc=meudominio,dc=com dc: meudominio objectClass: dcObject objectClass: organizationalUnit ou: Gato Pardo Enterprises # Nó Pessoas dn: ou=pessoas,dc=meudominio,dc=com ou: pessoas objectClass: organizationalUnit
A seguir utilizamos o programa slapadd para adicionar os nós:
# slapadd -v -l root_node.ldif added: "dc=meudominio,dc=com" (00000001) added: "ou=pessoas,dc=meudominio,dc=com" (00000002)
Se voltarmos a iniciar o servidor, já podemos efectuar uma busca no mesmo:
$ ldapsearch -x -b "dc=meudominio,dc=com" "(objectclass=*)" # extended LDIF # # LDAPv3 # basewith scope subtree # filter: (objectclass=*) # requesting: ALL # # meudominio.com dn: dc=meudominio,dc=com dc: meudominio objectClass: dcObject objectClass: organizationalUnit ou: Gato Pardo Enterprises # pessoas, meudominio.com dn: ou=pessoas,dc=meudominio,dc=com ou: pessoas objectClass: organizationalUnit # search result search: 2 result: 0 Success # numResponses: 3 # numEntries: 2
No pacote ldap-utils existem vários utilitários para gerir a base de dados:
Por exemplo para acrescentar um contacto ao nosso livro de endereços, usando estas ferramentas, teríamos primeiro de definir o ficheiro LDIF. Notar que muitas das aplicações que gerem livros de endereços, podem exportar directamente neste formato, facilitando assim o nosso trabalho.
# Entrada para o livro de enderços /tmp/contacto.ldif dn: cn=Helder Guerreiro,ou=pessoas,dc=meudominio,dc=com cn: Helder Guerreiro sn: Guerreiro mail: helder@bombolom.com mail: webmaster@bombolom.com labeledURI: http://www.bombolom.com objectClass: inetOrgPerson
Como os acessos de escrita estão neste momento restritos ao administrador do servidor, temos que ligar ao mesmo com as suas credenciais:
$ ldapmodify -W -D "cn=Manager,dc=meudominio,dc=com" -x -a -f contacto.ldif Enter LDAP Password: adding new entry "cn=Helder Guerreiro,ou=pessoas,dc=meudominio,dc=com"
É claro que existem editores da base de dados gráficos, por exemplo:
Resta-nos configurar os clientes. Por exemplo para o Thunderbird, temos:
Adicionar um novo livro de endereços (só que desta vez remoto).
Configurar o nosso servidor recém criado.
Consultar o servidor.
Neste momento temos o nosso servidor instalado e a funcionar. Os passos seguintes serão:
Para quem está a usar o SuSE este documento pode-se usar sem grandes alterações:
As diferenças da configuração do slapd no SuSE em relacção ao Debian são as seguintes:
Naturalmente que convém usar os processos normais do SuSE para inscrever o serviço nas listas de inicialização. Para o caso do slapd isto implica fazer:
# chkconfig slpd on
Para começar os serviços.
Finalmente ter em conta a configuração da firewall, nas interfaces em que queremos prestar o serviço tem de ser aberta as portas:
ldap 389/tcp # Lightweight Directory Access Protocol ldap 389/udp # Lightweight Directory Access Protocole
ldaps 636/tcp # ldap protocol over TLS/SSL (was sldap) ldaps 636/udp # ldap protocol over TLS/SSL (was sldap)
Por agora ficamos por aqui...