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