Configuração

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:

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
###################################################################

Atenção

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.

Importante

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.

schema's

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.schema

Nú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.schema

Contém a estrutura de atributos básica para armazenar informações de autenticação de usuários Linux/Unix.

inetorgperson.schema

Especifica 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.

serviço

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 nomedoarquivo

Esse parâmetro especifica o local absoluto do arquivo que contém o PID (Process ID) do processo slapd em execução no servidor.

argsfile nomedoarquivo

Esse 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íveldelog

Esse 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 caminho

Especifica o diretório onde estão os módulos que serão carregados dinâmicamente.

moduleload módulo

Carrega 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ívelInformação gravada
-1Todas as informações de log
0Nenhuma informação de log
1Chamadas de funções
2Depuração do manuseamento dos pacotes
4Depuração detalhada
8Gerenciamento da conexão
16Pacotes enviados e recebidos
32Processamento do filtro de pesquisa
64Processamento do arquivo de configuração
128Processamento das listas de controle de acesso
256Estatísticas para conexão, operações e resultados
512Estatísticas para resultados devolvidos aos clientes
1024Comunicação com backends de shell
2048Depuraçã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.

Atenção

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.

segurança

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.

bases de dados

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
…
  1. 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.

  2. 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:

    database

    Define 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.

    suffix

    Determina 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.

    directory

    Configura 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.

    index

    Especifica 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.

    lastmod

    Grava 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.

    mode

    Modo 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.

    cachesize

    Parâmetro para melhorar a performance do banco de dados. Especifica quantas entradas devem ser armazenadas em cache na memória.

  3. 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.

Dica

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".