OpenLDAP: cn=config ou slapd.conf? Qual usar?
Há pouco começamos a ouvir sobre uma mudança na configuração do OpenLDAP que deixa de usar o arquivo slapd.conf e passa a usar uma base chamada cn=config. O que é, especificamente, este cn=config? Tem algum vantagem em usar este formato?
Este tipo de configuração, apesar de muitos acharem que é novo, é suportado no OpenLDAP há mais de 5 anos. Oficial este tipo de configuração foi incluído na série 2.3 do OpenLDAP. Servidores de Diretórios comerciais como RedHat Directory Server®, Tivoli Directory Server®, Oracle Sun Directory Server Enterprise Edition® e outros já usam este formato há muito tempo e olha que estes servidores são usados em grandes volumes de dados.
O que é cn=config?
Até pouco tempo atrás todo mundo falava de configurar o OpenLDAP usando o arquivo slapd.conf. Hoje se escuta muito esse tal de cn=config... principalmente quem tem usado Ubuntu.
O cn=config é um database que armazena as configurações do OpenLDAP. Dentro deste database ficam as informações do seu Diretório, dc=empresa,dc=com,dc=br por exemplo. Aqui também são registradas as informações dos schemas utilizados. Seus schemas não ficam mais em arquivos. Você lê os arquivos .schema e os carrega na base cn=config diretamente. O rootdn passa a ser indicado diretamente nesta base, além de todas as permissões de acesso (acls).
Usando um servidor Debian Lenny como exemplo, a configuração convertida para cn=config deve ser algo parecido com esta a seguir.
$ ldapsearch -x -LLL -D cn=admin,cn=config -w config -b cn=config dn
dn: cn=config
dn: cn=module{0},cn=config
dn: cn=schema,cn=config
dn: cn={0}core,cn=schema,cn=config
dn: cn={1}cosine,cn=schema,cn=config
dn: cn={2}nis,cn=schema,cn=config
dn: cn={3}inetorgperson,cn=schema,cn=config
dn: olcDatabase={-1}frontend,cn=config
dn: olcDatabase={0}config,cn=config
dn: olcDatabase={1}hdb,cn=config
Dentro de cada dn listado na saída anterior há várias informações, os dados do Diretório criado está dentro do último dn listado. Consultando este dn temos o conteúdo a seguir:
$ ldapsearch -x -LLL -D cn=admin,cn=config -w config -b cn=config olcDatabase={1}hdb
dn: olcDatabase={1}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=savant,dc=com,dc=br
olcAccess: {0}to attrs=userPassword,shadowLastChange by anonymous auth by se
lf write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by * read
olcLastMod: TRUE
olcMaxDerefDepth: 15
olcReadOnly: FALSE
olcRootDN: cn=admin,dc=savant,dc=com,dc=br
olcMonitoring: FALSE
olcDbCacheSize: 1000
olcDbCheckpoint: 512 30
olcDbConfig: {0}set_cachesize 0 2097152 0
olcDbConfig: {1}set_lg_regionmax 1048576
olcDbConfig: {2}set_lg_max 10485760
olcDbConfig: {3}set_lg_bsize 2097152
olcDbConfig: {4}set_lk_max_objects 1500
olcDbConfig: {5}set_lk_max_locks 1500
olcDbConfig: {6}set_lk_max_lockers 1500
olcDbNoSync: FALSE
olcDbDirtyRead: FALSE
olcDbIDLcacheSize: 0
olcDbIndex: objectClass eq
olcDbIndex: uid eq
olcDbLinearIndex: FALSE
olcDbMode: 384
olcDbSearchStack: 16
olcDbShmKey: 0
olcDbCacheFree: 1
olcDbDNcacheSize: 0
Na saída anterior você percebe informações como o sufixo da base: dc=savant,dc=com,dc=br, ou as acls que foram criadas. Você consegue identificar o rootdn, os índices e mesmo as configurações do DB_CONFIG podem ser vistas aqui.
Ao trabalhar com este formato, todas as configurações passam a ser feitas neste novo database.
Tem vantagem em usar este tipo de configuração?
Quando a configuração do OpenLDAP é feita usando o arquivo slapd.conf, toda vez que você precisa incluir um novo schema você altera este arquivo e reinicia seu serviço LDAP. Para criar um novo índice, além de alterar a configuração, você precisa parar o serviço LDAP, reindexar a base, verificar se os arquivos, normalmente em /var/lib/ldap, pertencem ao usuário e grupo corretos e só depois reiniciar o servidor LDAP.
A grande vantagem em migrar para cn=config é que passamos a usar uma configuração do tipo runtime configuration ou simplesmente rtc. Agora todos os procedimentos são on-line. Criar um novo índice ou uma acl não requer a parada do serviço. Incluir um novo sufixo pode ser feito com o Diretório funcionando.
Se não bastasse estes motivos para você pensar em mudar sua configuração para este método, há um outro ponto importante: algumas configurações mais interessantes só estão disponíveis por meio deste recurso, é o caso de configuração de servidores em modo multi-master.
Como a gente gerencia o OpenLDAP usando o cn=config?
Se por gerenciamento você fala de criar índices, acls, opções do database ou mesmo criar novos DITs no seu LDAP, estas configurações devem ser feitas diretamente na base cn=config.
Uma forma de gerenciar esta configuração do cn=config é por meio de arquivos ldif. Não sei quanto a vocês mas eu acho isto muito cansativo...
Há várias aplicações que permitem a configuração do cn=config, tanto gráficas quanto via web.
Posso migrar um servidor em produção para usar o cn=config?
Com certeza, sim. E olha que o processo é bem simples mas é melhor você fazer testes antes de se aventurar com este tipo de configuração. Se não estiver confortável com o novo modelo, você pode enfrentar alguns problemas sérios quando precisar alterar algo em sua estrutura.
Depois vou postar um artigo sobre como migrar a configuração para este formato.
[]'s
Marcos Sungaila


