O arquivo de configuração[3] do serviço de diretório da suíte OpenLDAP (slapd) é o /etc/ldap/slapd.conf. Esse arquivo possui vários parâmetros que configuram desde a execução do serviço
slapd até o backend de banco de dados que será utilizado, assim como os índices que devem ser gerados para agilizar as buscas e também a senha de administração para acessar o diretório. Ou seja, esse arquivo é a peça chave da implantação e sua configuração deve ser feita com bastante rigor. Devemos também nos certificar de que o acesso a esse arquivo estará restrito.
As seguintes regras, comuns aos arquivos de configuração de sistemas Unix, são válidas para o /etc/ldap/slapd.conf:
Linhas em branco e linhas começando com # são ignoradas.
Parâmetros e valores associados são separados por caracteres em branco (espaço ou tabulação).
Linhas com espaços em branco na primeira coluna serão consideradas como continuação da linha anterior.
Exemplo 2.1. Arquivo de configuração /etc/ldap/slapd.conf
####################### /etc/ldap/slapd.conf ######################
# Arquivo de configuração do serviço slapd.
# schema's
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
schemacheck on
# serviço
pidfile /var/run/slapd/slapd.pid
argsfile /var/run/slapd/slapd.args
loglevel 296
modulepath /usr/lib/ldap
moduleload back_bdb
# segurança
allow bind_v2
# bases de dados
backend bdb
checkpoint 512 30
## base de dados no. 1
database bdb
suffix "dc=ime,dc=usp,dc=br"
directory "/var/lib/ldap"
index objectClass eq
rootdn "cn=admin,dc=ime,dc=usp,dc=br"
rootpw {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==
lastmod on
mode 0600
cachesize 2000
## ACL's para a base de dados no. 1
access to attrs=userPassword
by dn.base="cn=admin,dc=ime,dc=usp,dc=br" write
by anonymous auth
by self write
by * none
access to *
by dn.base="cn=admin,dc=ime,dc=usp,dc=br" write
by * read
###################################################################
O arquivo /etc/ldap/slapd.conf contém informações sigilosas. Não se esqueça de ajustar as permissões deste arquivo para 600 e certifique-se de que o seu proprietário seja o usuário root.
Os parâmetros de configuração do arquivo /etc/ldap/slapd.conf podem ser organizados em seções que ajustam cada aspecto do serviço. Se organizados em seções, podemos dividir os parâmetros como abaixo:
Essa estrutura será adotada neste texto de forma a facilitar a explicação de cada parâmetro.
A ordem de alguns parâmetros no arquivo de configuração é significativa. Se resolver adotar outro tipo de organização, consulte a manpage do arquivo /etc/ldap/slapd.conf antes de mudar um parâmetro de lugar.
Os arquivos de schema definem que tipo de informação poderá ser armazenada no diretório, de acordo com as necessidades de cada aplicação que irá acessá-lo. Em outras palavras, eles definem quais atributos estarão disponíveis para cada entrada adicionada à árvore do diretório.
O pacote slapd contém alguns arquivos de schema por padrão. O principal deles é o core.schema, que provê a funcionalidade básica do serviço. A maioria dos schema's inclusos fornecem a estrutura necessária para o armazenamento de informações de autenticação e suporte a aplicações distribuídas. O seguinte exemplo exibe a seção de schema's que utilizaremos por enquanto:
… # schema's include /etc/ldap/schema/core.schema include /etc/ldap/schema/cosine.schema include /etc/ldap/schema/nis.schema include /etc/ldap/schema/inetorgperson.schema schemacheck on …
Cada schema a ser utilizado pelo servidor deve ser declarado através do parâmetro include. Arquivos de schema possuem dependências entre si, ou seja, para utilizar um determinado schema em seu diretório deve-se declarar também todos os arquivos dos schema's dos quais ele depende. Os schema's normalmente encontram-se armazenados dentro do subdiretório schema, que reside no mesmo diretório onde as configurações do serviço estão armazenadas. Na distribuição Ubuntu, os schema's estão localizados em /etc/ldap/schema.
Os schema's adicionados no exemplo acima são os necessários para prover um serviço básico de autenticação em ambientes Linux/Unix. Mais arquivos de schema's podem ser incluídos para aumentar a versatilidade do diretório ao torná-lo compatível com outros serviços da rede.
core.schemaNúcleo do OpenLDAP. Esse schema é obrigatório para que o serviço funcione.
cosine.schema
O schema cosine.schema é pré-requisito do nis.schema.
nis.schemaContém a estrutura de atributos básica para armazenar informações de autenticação de usuários Linux/Unix.
inetorgperson.schemaEspecifica os atributos utilizados para armazenar informações de catálogo de endereços (informações sobre os usuários).
O parâmetro schemacheck serve para configurar se as entradas adicionadas ou modificadas na base de dados serão verificadas para garantir que obedeçam às regras impostas por cada schema incluído.
Essa seção configura alguns aspectos gerais do serviço de diretório. Existem parâmetros que controlam a quantidade de informações que será gerada nos arquivos de log, assim como o local onde serão armazenadas as informações sobre o processo em execução no servidor. Também configuramos quais módulos deverão ser carregados.
Abaixo temos um exemplo dessa seção contendo os principais parâmetros:
… # serviço pidfile /var/run/slapd/slapd.pid argsfile /var/run/slapd/slapd.args loglevel 296 modulepath /usr/lib/ldap moduleload back_bdb …
Esses parâmetros são explicados abaixo:
pidfile nomedoarquivoEsse parâmetro especifica o local absoluto do arquivo que contém o PID (Process ID) do processo slapd em execução no servidor.
argsfile nomedoarquivoEsse parâmetro especifica o local absoluto do arquivo que contém os parâmetros de linha de comando utilizados pelo processo slapd em execução no servidor.
loglevel níveldelogEsse parâmetro é configurado através de um inteiro, que representa os tipos de informação que devem ser guardados nos arquivos de log do serviço. Esses níveis de informação estão listados na Tabela 2.1, “Níveis de log do OpenLDAP”.
modulepath caminhoEspecifica o diretório onde estão os módulos que serão carregados dinâmicamente.
moduleload móduloCarrega um determinado módulo. No caso estamos carregando o módulo que dará suporte à backend BDB (Sleepycat Berkeley Database v4).
Tabela 2.1. Níveis de log do OpenLDAP
| Nível | Informação gravada |
|---|---|
| -1 | Todas as informações de log |
| 0 | Nenhuma informação de log |
| 1 | Chamadas de funções |
| 2 | Depuração do manuseamento dos pacotes |
| 4 | Depuração detalhada |
| 8 | Gerenciamento da conexão |
| 16 | Pacotes enviados e recebidos |
| 32 | Processamento do filtro de pesquisa |
| 64 | Processamento do arquivo de configuração |
| 128 | Processamento das listas de controle de acesso |
| 256 | Estatísticas para conexão, operações e resultados |
| 512 | Estatísticas para resultados devolvidos aos clientes |
| 1024 | Comunicação com backends de shell |
| 2048 | Depuração da análise sintática (parsing) das entradas |
No exemplo, configuramos o nível de log para 296, que é igual a 8 + 32 + 256. Ou seja, estamos guardando informações relacionadas ao gerenciamento da conexão, processamento do filtro de pesquisa e estatísticas para conexão, operações e resultados. Recomenda-se utilizar pelo menos o nível de log 256.
Toda essa informação será armazenada através do sistema syslog LOG_LEVEL4. Para gravar os log's do slapd em um arquivo diferente, configure o arquivo /etc/syslog.conf e reinicie o serviço syslogd. Um exemplo de configuração seria adicionar a seguinte linha ao /etc/syslog.conf:
local4.debug /var/log/slapd.log
Consulte a manpage do syslog.conf para maiores detalhes.
Se nenhum dado estiver sendo guardado com essa configuração, tente criar um arquivo de log vazio com o comando touch. Algumas versões do syslog precisam que o arquivo de log exista antes que comecem a escrever as informações nele.
Aspectos mais específicos relacionados a segurança serão abordados posteriormente na seção “Aumentando a segurança”. Por enquanto vamos configurar apenas um parâmetro relacionado com a compatibilidade com versões anteriores do protocolo:
… # segurança allow bind_v2 …
O parâmetro allow e seu complementar disallow permitem especificar algumas permissões do serviço. Nessa linha estamos permitindo que clientes LDAP conectem ao nosso diretório utilizando a versão 2 do protocolo. Atualmente a suíte OpenLDAP utiliza a versão 3, mas mantém o suporte à versão 2 pois muitos aplicativos, principalmente clientes de e-mail, ainda a utilizam.
Aqui concentramos todos os parâmetros relacionados às bases de dados que armazenarão as informações do diretório. Primeiro definimos as opções que são específicas de cada backend utilizado, depois criamos as instâncias de bases de dados.
…
# bases de dados
backend bdb
checkpoint 512 30
## base de dados no. 1
database bdb
suffix "dc=ime,dc=usp,dc=br"
directory "/var/lib/ldap"
index objectClass eq
rootdn "cn=admin,dc=ime,dc=usp,dc=br"
rootpw {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==
lastmod on
mode 0600
cachesize 2000
## ACL's para a base de dados no. 1
access to attrs=userPassword
by dn.base="cn=admin,dc=ime,dc=usp,dc=br" write
by anonymous auth
by self write
by * none
access to *
by dn.base="cn=admin,dc=ime,dc=usp,dc=br" write
by * read
…
Configurando opções que afetarão todas as bases de dados
A diretiva backend permite configurar as opções específicas de cada backend. No exemplo, estamos configurando opções que são específicas da backend BDB. Todas as opções listadas abaixo dessa diretiva serão aplicadas à essa backend até que exista outra diretiva backend no arquivo de configuração.
As opções de uma determinada backend configuradas utilizando essa diretiva afetarão todas as instâncias de bases de dados que a usam. Por exemplo, se estivéssemos utilizando duas bases de dados, cada uma utilizando uma backend diferente, poderíamos incluir duas diretivas backend para configurar as opções específicas a cada uma das backends.
O parâmetro checkpoint kbyte min define quando os buffers da base de dados BDB devem ser gravados no disco, como medida de segurança para evitar possíveis perdas. Um limite em kbytes e um outro em minutos é fornecido, o que vencer primeiro dispara o checkpoint e grava uma entrada no arquivo de log para registrar o evento. Esse parâmetro é específico da backend BDB e é recomendado pela configuração padrão do pacote slapd na distribuição Ubuntu. Para maiores informações sobre as opções específicas do BDB, consulte a manpage slapd-dbd.
Adicionando bases de dados ao diretório
A diretiva database inicia uma nova instância de uma base de dados, utilizando a backend especificada. Todos os parâmetros colocados depois dessa diretiva serão aplicados a essa instância, até que exista outra diretiva database. Pode ser interessante, por exemplo, criar bases de dados diferentes para armazenar cada sub-árvore do diretório, ou distribuir essas sub-árvores entre vários servidores e configurá-los de forma que um referencie o outro quando for consultado sobre uma partição do diretório que não está armazenada localmente (semelhante à maneira como o serviço de DNS funciona).
Os seguintes parâmetros configuram a instância de base de dados:
databaseDefine a backend utilizada pela instância de base de dados. BDB é a backend recomendada atualmente pela documentação do OpenLDAP e também a utilizada por padrão na distribuição Ubuntu.
suffixDetermina o contexto do diretório que será servido por essa base de dados, especificando qual será a sua raiz. No nosso exemplo configuramos o contexto como sendo a raiz do nosso domínio, pois vamos colocar todo o nosso diretório em apenas uma instância de base de dados. O sufixo é escrito utilizando atributos no padrão X.500.
directoryConfigura o local onde serão armazenados os arquivos da base de dados. Se estiver utilizando mais de uma instância de base de dados, é uma boa prática armazenar os arquivos de cada uma em um subdiretório diferente.
indexEspecifica para quais atributos o slapd deve manter índices de forma a otimizar as operações de busca. Existem quatro tipos de índices, e o suporte de um tipo de índice por parte de um atributo é determinado pelo arquivo de schema ao qual o atributo pertence. Os quatro tipos de índices são:
approx (approximate)Indexa a informação de acordo com uma combinação aproximada ou fonética dos valores dos atributos.
eq (equality)Indexa a informação de acordo com a combinação exata dos valores dos atributos. Essa combinação pode ser sensível a maiúsculas/minúsculas ou a espaços em branco, de acordo com as regras definidas na sintaxe do atributo.
pres (presence)Indexa a informação de acordo com a presença de valores. Se um atributo não possui um valor, então ele não estará presente na entrada do diretório para efeito de busca.
sub (substring)Indexa a informação para realizar pesquisas por substrings dentro dos valores dos atributos.
Pode-se definir mais de um tipo de índice para o parâmetro index, desde que seja suportado pelo atributo e eles estejam separados por vírgula. Também podem existir várias definições index para uma mesma base de dados.
rootdn
Um diretório LDAP pode ter um usuário root, semelhante ao super-usuário dos sistemas Linux/Unix. Quando autenticado, tem acesso irrestrito ao diretório e por essa razão muitos administradores preferem não configurá-lo. O nome do rootdn é arbitrário e ele não precisa ser um usuário do sistema, apenas do diretório. Normalmente utiliza-se nomes como admin ou manager. Esse parâmetro não é obrigatório.
rootpw
Especifica a hash que contém a senha do rootdn e o algoritmo utilizado para gerá-la. Utilize o comando slappasswd para gerar a hash que será utilizada. A hash listada no exemplo foi gerada com o comando slappasswd -h {MD5} -s secret. Se o administrador optar por não configurar um rootdn para o diretório esse parâmetro não é necessário.
lastmodGrava informações de tempo em cada modificação e criação das entradas no diretório. Necessário para o caching no lado do cliente, pois permite verificar quando a informação foi atualizada.
modeModo em que os arquivos serão criados. É recomendável permitir acesso de gravação e leitura apenas ao proprietário do processo slapd (0600), que normalmente será o usuário root do sistema.
cachesizeParâmetro para melhorar a performance do banco de dados. Especifica quantas entradas devem ser armazenadas em cache na memória.
ACL's
As ACL's (Access Control Lists) definem quem tem acesso a qual informação no diretório. Sua sintaxe é muito flexível e não entraremos em detalhes nessa seção, se quiser saber mais a respeito de sua implementação consulte o Apêndice A, ACL's no final do texto.
A ordem das ACL's também é relevante, sendo que as que contém as regras mais restritivas devem aparecer antes das mais gerais para que tenham efeito. As configurações das ACL's serão aplicadas apenas à instância de base de dados que as contém.
A primeira configuração listada no exemplo garante direito de acesso ao atributo userPassword para escrita (e conseqüentemente leitura) ao usuário admin, para autenticação aos usuários anônimos e para escrita aos usuários autenticados (apenas para as suas próprias entradas), ou seja, permite que os usuários alterem a própria senha.
A segunda configuração garante direito de acesso à todo o diretório para escrita (e conseqüentemente leitura) ao usuário admin e para leitura aos demais usuários.
Verifique que como a primeira ACL é mais restritiva, ela vai impedir que a segunda ACL garanta direito de leitura das senhas aos usuários comuns. Se a ordem estivesse invertida, a primeira ACL listada perderia seu efeito.
Como dissemos anteriormente, muitos administradores preferem não especificar um rootdn para o diretório por questões de segurança. Um dos motivos é o de que será necessário armazenar a hash da senha no arquivo de configuração do slapd, o que é inconveniente, mesmo estando com os arquivos devidamente protegidos. O outro motivo é o de que existirá um usuário no diretório para o qual nenhuma ACL terá efeito, tornando-o um perigo em potencial. A alternativa existente é não definir um rootdn e criar um usuário administrador, determinando suas permissões explicitamente através das ACL's. Definimos o rootdn nesse caso apenas para ilustrar uma possibilidade de configuração.
Ao finalizar a configuração do seu arquivo /etc/ldap/slapd.conf, execute o comando slaptest para verificar se está tudo certo:
usuario@ldapserver:~$ sudo slaptest
config file testing succeeded
[3] Atualmente existe uma maneira alternativa de armazenar as configurações do serviço de diretório slapd, que é dentro de um diretório LDAP, na forma de um DIT. Ou seja, usando a própria estrutura que o serviço disponibiliza. A configuração nesse caso é carregada através de um arquivo LDIF e a vantagem é a de que existe a possibilidade de alterar os parâmetros em tempo de execução, isto é, sem a necessidade de reiniciar o servidor, através de comandos de acesso ao diretório. Porém, atualmente existem problemas de compatibilidade com alguns backends e com o sistema de replicação. Sendo assim preferimos adotar o modo "antigo".