Luego de implementar mi servidor OpenLDAP con PostgreSQL como backend, el siguiente paso consistió en configurar SSL/TLS para implementar un nivel de seguridad mínimo en las comunicaciones entre el servidor LDAP y los clientes.

Aunque se trabaje sobre un entorno de pruebas o desarrollo, es indispensable contar con un certificado de confianza válido. Esto se debe a que OpenLDAP no permite utilizar un certificado autofirmado para utilizar en el servidor. De este modo tenemos varias alternativas: comprar un certificado firmado por una entidad de confianza; generar un certificado gratuito con certbot; o crear nuestra propia CA autofirmada.

Crear nuestra propia CA tiene sus ventajas, ya que nos permite generar cualquier número de certificados y nos da mayor flexibilidad, aunque implica una mayor cantidad de trabajo al momento de configurar el servidor LDAP. Este artículo explica cómo configurar OpenLDAP para que haga uso de un certificado generado a través de nuestra propia CA (de forma similar a como lo hace OpenVPN).



Para comenzar se debe crear una autoridad certificante. También es posible utilizar una CA ya existente en nuestra organización. Los pasos necesarios para crear una CA están detallados claramente en el artículo: Cómo crear tu propia autoridad certificante (CA). Sin embargo, repasemos los pasos mínimos involucrados.

Es necesario definir una ubicación para el directorio de configuración de la CA. En este caso utilizo el directorio de configuración base de OpenLDAP. Cambiar al directorio de configuración de OpenLDAP:

# cd /usr/local/etc/openldap/

Configuración de la CA

Crear el certificado autofirmado para la CA (utilizar cualquier CN):

# openssl req -new -nodes -keyout ldap-ca.key -out ldap-ca.csr -days 3650
# openssl x509 -req -days 3650 -in ldap-ca.csr -signkey ldap-ca.key -out ldap-ca.crt

Crear la solicitud de certificado para uso de slapd (utilizar el nombre completamente calificado del host como CN):

# openssl req -new -nodes -keyout slapd.key -out slapd.csr -days 3650

Luego crear el archivo de configuración para la CA (se asume que OpenSSL ya está instalado en el sistema:

# cp /etc/ssl/openssl.cnf ldap-ca.conf

Modificar la configuración de la CA por defecto para adaptarla a nuestras necesidades:

# nano ldap-ca.conf

Se deben modificar, como mínimo, las siguientes variables:

dir             =./ldap-ca              # Where everything is kept
certificate     = $dir/ldap-ca.crt      # The CA certificate
private_key     = $dir/private/ldap-ca.key # The private key

A continuación se crean los directorios necesarios para nuestra CA:

# mkdir ldap-ca
# mkdir ldap-ca/certs
# mkdir ldap-ca/private
# mkdir ldap-ca/crl
# mkdir ldap-ca/newcerts

Mover los archivos correspondientes a la solicitud, el certificado y la clave privada de la CA a sus ubicaciones definitivas:

# mv ldap-ca.crt ldap-ca/
# mv ldap-ca.csr ldap-ca/
# mv ldap-ca.key ldap-ca/private/

Crear el índice y número de serie para la CA:

# echo -n > ldap-ca/index.txt
# echo -n 01 > ldap-ca/serial

Finalmente, establecer los permisos mínimos para los certificados, claves y directorios de la CA y el certificado de slapd:

# chown ldap:ldap slapd.{csr,crt,key}
# chmod 400 slapd.{csr,crt,key}
# chown -R root:root ldap-ca*
# chmod 755 ldap-ca
# chmod 750 ldap-ca/{certs,crl,newcerts,private}
# chmod 400 ldap-ca/private/ldap-ca.key 
# chmod 444 ldap-ca/ldap-ca.crt 

Configuración de slapd

Una vez creada la CA y los certificados, se debe configurar el demonio slapd para que soporte SSL/TLS. Editar el archivo slapd.conf:

# nano slapd.conf

Y agregar las siguientes líneas:


#######################################################################
# TLS configuration 
#######################################################################

TLSCACertificateFile /usr/local/etc/openldap/ldap-ca/ldap-ca.crt
TLSCertificateFile /usr/local/etc/openldap/slapd.crt
TLSCertificateKeyFile /usr/local/etc/openldap/slapd.key

Verificar que las rutas al certificado de la CA; al certificado para slapd y a la clave privada correspondiente con el mismo sean correctas.

Reiniciar el servidor LDAP:

# service slapd restart

En caso de que el servidor no inicie, es posible detectar errores gracias a la opción debug provista por el script de inicio de slapd. Simplemente utilizar "debug" en vez de "restar" o "start".

Configuración de los clientes

Para que los clientes puedan verificar la validez del certificado presentado por el servidor LDAP, es necesario que cuenten con el certificado de nuestra CA. Se debe entonces copiar el certificado en todos los clientes (por ejemplo, utilizando scp):

root@debian8:/usr/local/etc/openldap# scp ldap-ca/ldap-ca.crt emi@hal9000:~
Password for emi@hal9000:

En cada cliente, mover el certificado al directorio de configuración de OpenLDAP

emi@hal9000:~ % sudo su
root@hal9000:/usr/home/emi # mv ldap-ca.crt /usr/local/etc/openldap/

Luego configurar el cliente para que conozca la existencia de dicho certificado, editando el archivo de configuración ldap.conf:

root@hal9000:/usr/home/emi # nano /usr/local/etc/openldap/ldap.conf

Agregar la siguiente línea:


TLS_CACERT /usr/local/etc/openldap/ldap-ca.crt 

Esta variable indica la ruta al certificado de la CA en el sistema local.

Por último, establecer los permisos correctos para el certificado:

root@hal9000:/usr/home/emi # chown root:wheel /usr/local/etc/openldap/ldap-ca.crt
root@hal9000:/usr/home/emi # chmod 644 /usr/local/etc/openldap/ldap-ca.crt

Comprobar el funcionamiento

Finalmente es posible verificar el correcto funcionamiento de LDAP sobre SSL/TLS. Para ello se puede recurrir a la herramienta ldapserach y realizar una búsqueda en el directorio:

emi@hal9000:~ % ldapsearch -x -H ldaps://ldap.linuxito.com:636 -b "dc=example,dc=com" "cn=*Torvlobnor*"
# extended LDIF
#
# LDAPv3
# base  with scope subtree
# filter: cn=*Torvlobnor*
# requesting: ALL
#

# Torvlobnor Puzdoy, example.com
dn: cn=Torvlobnor Puzdoy,dc=example,dc=com
objectClass: inetOrgPerson
cn: Torvlobnor Puzdoy
sn: Puzdoy
seeAlso: documentTitle=book1,dc=example,dc=com
givenName: Torvlobnor
telephoneNumber: 545-4563

# search reference
ref: ldap://localhost:9012/dc=example,dc=com??sub

# search result
search: 2
result: 0 Success

# numResponses: 3
# numEntries: 1
# numReferences: 1

Notar que en lugar de utilizar la opción de conexión -h para especificar el nombre de host, se utiliza -H junto con una URI como parámetro. En la misma, se debe indicar correctamente el puerto SSL/TLS (por defecto 636).

En caso de errores o problemas al intentar conectarse con el servidor LDAP, es posible recurrir al modo debug de ldapsearch. Por ejemplo, agregar la opción -d 1.

Referencias


Tal vez pueda interesarte


Compartí este artículo