Como ativar o suporte TLS no OpenLDAP

gnutls-logo

GnuTLS ou OpenSSL?

Pesquisando bastante sobre a implementação de um servidor OpenLDAP, tive que enfrentar outro dilema: GnuTLS ou OpenSSL? Na maior parte da documentação que encontrei pela internet era utilizado o OpenSSL para criar o certificado auto-assinado. Percebi que tanto as versões do slapd compiladas no Debian quanto no Ubuntu Server estão migrando para o GnuTLS. Mas, se o OpenSSL é tão utilizado, porque utilizar o GnuTLS?

O GnuTLS é uma implementação que utiliza licença LGPL do Transport Layer Security, o sucessor do SSL. Ao GnuTLS evita-se os problemas de licenciamento que podem surgir a partir da utilização do pacote bastante conhecido OpenSSL. Por esta razão, alguns pacotes como OpenLDAP são compilados com suporte para GnuTLS em vez de OpenSSL em versões recentes do Debian.

Com o comando ldd podemos identificar o referenciamento do GnuTLS nas bibliotecas do  OpenLDAP:

# ldd /usr/lib/x86_64-linux-gnu/libldap-2.4.so.2

linux-vdso.so.1 =>  (0x00007fffe13ff000)
liblber-2.4.so.2 => /usr/lib/x86_64-linux-gnu/liblber-2.4.so.2 (0x00007f4ad023c000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f4ad0026000)
libsasl2.so.2 => /usr/lib/x86_64-linux-gnu/libsasl2.so.2 (0x00007f4acfe0a000)

libgnutls.so.26 => /usr/lib/x86_64-linux-gnu/libgnutls.so.26 (0x00007f4acfb4a000)

libgcrypt.so.11 => /lib/x86_64-linux-gnu/libgcrypt.so.11 (0x00007f4acf8cc000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f4acf6af000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4acf324000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f4acf120000)
libtasn1.so.3 => /usr/lib/x86_64-linux-gnu/libtasn1.so.3 (0x00007f4acef0e000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f4acecf7000)
libp11-kit.so.0 => /usr/lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007f4aceae5000)
libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007f4ace8e1000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4ad06a3000)

Instalar o GnuTLS

Pelo APT, instalar os seguintes pacotes:

# apt-get install gnutls-bin ssl-cert

Criar o certificado auto-assinado

Criar um diretório para armazenar as chaves:

# mkdir /etc/ldap/tls

Criar uma chave privada para a Autoridade Certificadora (CA):

# certtool --generate-privkey > /etc/ldap/tls/cakey.pem

Criar o template para definir a CA com o seguinte conteúdo:

# vim /etc/ldap/tls/ca.info
cn = Instituição X
ca
cert_signing_key

Criar o certificado CA auto-assinado:

# certtool --generate-self-signed \ --load-privkey /etc/ldap/tls/cakey.pem \ --template /etc/ldap/tls/ca.info \ --outfile /etc/ldap/tls/cacert.pem

Fazer uma chave privada para o servidor:

# certtool --generate-privkey --bits 1024 --outfile /etc/ldap/tls/server_key.pem

Criar o template com o seguinte conteúdo:

# vim /etc/ldap/tls/ldap.info
organization = Instituição X
cn = ldap.dominio.local
tls_www_server
encryption_key
signing_key
expiration_days = 3650

Note que o template indica que o certificado expirará após uma década. Ajuste conforme a sua necessidade.

Criar o certificado:

# certtool --generate-certificate \ --load-privkey /etc/ldap/tls/server_key.pem \ --load-ca-certificate /etc/ldap/tls/cacert.pem \ --load-ca-privkey /etc/ldap/tls/cakey.pem \ --template /etc/ldap/tls/ldap.info \ --outfile /etc/ldap/tls/server_cert.pem

Ajustar algumas permissões no sistema:

# gpasswd -a openldap ssl-cert
# chown root.ssl-cert -Rfv /etc/ldap/tls/
# chmod 750 /etc/ldap/tls/
# chmod 640 /etc/ldap/tls/*

Aplicar as novas configurações no sldap

Criar o arquivo olc_tls.ldif com o seguinte conteúdo:

# vim /tmp/olc_tls.ldif
dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ldap/tls/cacert.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/tls/server_cert.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/tls/server_key.pem

Adicione as novas configurações:

# ldapadd -Y EXTERNAL -H ldapi:/// -f /tmp/olc_tls.ldif

Ao contrário da crença popular, não é necessário acrescentar ldaps:// no arquivo /etc/default/slapd para usar a encriptação. Só isso é necessário:

SLAPD_SERVICES="ldap:/// ldapi:///"

Teste

Para testar as configurações, devemos ativar o suporte no cliente:

# vim /etc/ldap/ldap.config

Modificar da seguinte forma:

BASE    dc=dominio,dc=local
#URI    ldap://ldap.example.com ldap://ldap-master.example.com:666
#SIZELIMIT      12
#TIMELIMIT      15
# TLS certificates (needed for GnuTLS)
#TLS_CACERT     /etc/ssl/certs/ca-certificates.crt
TLS_CACERT      /etc/ldap/tls/cacert.pem
TLS_REQCERT     allow

Finalmente, executar o teste com o ldapsearch com o parâmetro -ZZ que solicita a conexão segura:

# ldapsearch -x -ZZ uid=ggaldino

Referências

Ubuntu Server Guide – OpenLDAP TLS

Wiki Debian – Setting up an LDAP server with OpenLDAP