Como ativar o suporte TLS no OpenLDAP
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