Ldaps

Configura el servidor LDAP de Freston para que utilice el protocolo ldaps:// a la vez que el ldap:// utilizando el certificado x509 de la práctica de HTTPS o solicitando el correspondiente a través de gestiona. Realiza las modificaciones adecuadas en el cliente LDAP de Freston para que todas las consultas se realicen por defecto utilizando ldaps://

Si quieres saber como instalar un servidor LDAP, puedes consultar este post.

Si queremos configurar Freston para que utilice el protocolo ldaps:// y que así la información viaje cifrada y de manera segura, lo primero que debemos hacer es solicitar el certificado. En mi caso, voy a solicitar un certificado wildcard ya que posteriormente voy a necesitar utilizarlo en otras máquinas que se encuentran bajo el mismo dominio que Freston (xxxxx.javierpzh.gonzalonazareno.org).

Para crear este certificado, vamos a crear una clave privada de 4096 bits, para ello vamos a utilizar openssl. Vamos a guardar esta clave en el directorio /etc/ssl/private/. Para crear esta clave privada empleamos el siguiente comando:

root@freston:~# openssl genrsa 4096 > /etc/ssl/private/freston.key
Generating RSA private key, 4096 bit long modulus (2 primes)
.........................................++++
...........................................................................................................................++++
e is 65537 (0x010001)

Debemos cambiarle los permisos a la clave privada a 400, así únicamente el propietario podrá leer el contenido. Para ello, haremos uso de la herramienta chmod:

root@freston:/etc/ssl/private# ls -l
total 4
-rw-r--r-- 1 root root 3243 Dec 18 08:59 freston.key

root@freston:/etc/ssl/private# chmod 400 /etc/ssl/private/freston.key

root@freston:/etc/ssl/private# ls -l
total 4
-r-------- 1 root root 3243 Dec 18 08:59 freston.key

Pero claro, también hay que pensar que el usuario de LDAP debe poder leer esta clave, así que, para ello, he decidido crear una ACL para que únicamente este usuario, llamado openldap tenga acceso a la clave privada. Para ello instalamos el paquete acl:

apt install acl -y

Y creamos la ACL adecuada:

root@freston:# setfacl -m u:openldap:r-x /etc/ssl/private/

root@freston:# setfacl -m u:openldap:r-x /etc/ssl/private/freston.key

Lo siguiente sería generar una solicitud de firma de certificado, es decir, un fichero .csr, que posteriormente enviaremos a la entidad del Gonzalo Nazareno para que nos lo firmen.

Para generar nuestro archivo .csr:

root@freston:~# openssl req -new -key /etc/ssl/private/freston.key -out /root/wildcard.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Sevilla
Locality Name (eg, city) []:Dos Hermanas
Organization Name (eg, company) [Internet Widgits Pty Ltd]:IES Gonzalo Nazareno
Organizational Unit Name (eg, section) []:Informatica
Common Name (e.g. server FQDN or YOUR name) []:*.javierpzh.gonzalonazareno.org
Email Address []:javierperezhidalgo01@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

root@freston:~# ls
wildcard.csr

Como Freston es una instancia del cloud, voy a pasarme este fichero wildcard.csr a mi máquina anfitriona para enviárselo a la entidad certificadora, que en este caso es el Gonzalo Nazareno. Si quieres entender mejor la estructura del escenario donde estamos trabajando puedes echarle un vistazo a este post, Modificación del escenario de trabajo en OpenStack.

Por tanto, pasaré este archivo a mi equipo mediante scp.

Una vez tenemos el certificado firmado por la entidad certificadora, lo pasamos a Freston. También hemos tenido que descargar el certificado de la entidad Gonzalo Nazareno. Por tanto lo vamos a mover también a Freston.

root@freston:~# ls
gonzalonazareno.crt  wildcard.crt  wildcard.csr

Lógicamente, estos certificados no debemos dejarlos en este directorio, por lo que, los vamos a mover a la ruta /etc/ssl/certs:

root@freston:~# mv gonzalonazareno.crt /etc/ssl/certs/

root@freston:~# mv wildcard.crt /etc/ssl/certs/

Es importante que ambos archivos, posean a root como usuario y grupo propietario, por tanto le cambio el propietario y el grupo:

root@freston:/etc/ssl/certs# chown -R root:root wildcard.crt

root@freston:/etc/ssl/certs# chown -R root:root gonzalonazareno.crt

Aquí podemos ver el resultado:

root@freston:~# ls -l /etc/ssl/certs/ | grep gonzalo
-rw-r--r-- 1 root root   3634 Dec 18 09:34 gonzalonazareno.crt

root@freston:~# ls -l /etc/ssl/certs/ | grep wildcard
-rw-r--r-- 1 root root  10119 Dec 18 09:29 wildcard.crt

Vamos a crear de nuevo las ACL adecuadas para que el usuario openldap pueda leer estos archivos:

root@freston:~# setfacl -m u:openldap:r-x /etc/ssl/certs/gonzalonazareno.crt

root@freston:~# setfacl -m u:openldap:r-x /etc/ssl/certs/wildcard.crt

Ya tenemos todos los certificados almacenados correctamente y con los usuarios/grupos/permisos adecuados.

Es la primera vez que estoy utilizando LDAP, y me ha sorprendido mucho la manera en la que se realiza su configuración, ya que no vamos a llevar a cabo las modificaciones en unos ficheros de configuración como es lo habitual, sino que vamos a crear un fichero .ldif, como los que creamos para introducir objetos. Esto se debe a que, de esta manera, podremos manipular la configuración sin tener que reiniciar el servicio, por tanto, nunca dejaría de funcionar.

Creamos el fichero .ldif e introducimos las siguientes líneas:

dn: cn=config
changetype: modify
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/gonzalonazareno.crt
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/freston.key
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/wildcard.crt

Una vez creado, vamos a hacer uso del siguiente comando para aplicar los cambios y modificar la configuración:

root@freston:~# ldapmodify -Y EXTERNAL -H ldapi:/// -f configuracion.ldif

SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"

Para ver si hemos introducido y se han aplicado correctamente los cambios, vamos a introducir el siguiente comando:

root@freston:~# slapcat -b "cn=config" | grep -E "olcTLS"

olcTLSCACertificateFile: /etc/ssl/certs/gonzalonazareno.crt
olcTLSCertificateKeyFile: /etc/ssl/private/freston.key
olcTLSCertificateFile: /etc/ssl/certs/wildcard.crt

Vemos que nos muestra las tres líneas que hemos añadido con nuestro fichero .ldif. En el caso de que la salida no nos mostrara nada, significaría que no se han llevado a cabo los cambios.

Vale, una vez hemos importado el fichero .ldif destinado a la configuración, nos quedaría hacer una modificación en el fichero /etc/default/slapd, ya que por defecto, el protocolo ldaps:// no viene habilitado. Para habilitarlo, debemos buscar la línea SLAPD_SERVICES y añadir el valor ldaps://, de manera que quedaría así:

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

Reiniciamos el servidor LDAP para aplicar los cambios:

systemctl restart slapd.service

Por último, en la parte del cliente (en mi caso, se trata de la misma máquina), debemos realizar una modificación en el fichero de configuración /etc/ldap/ldap.conf. Hay que descomentar el apartado llamado URI. Quedaría así:

URI     ldaps://localhost

Esto hará, que el cliente utilice de manera predeterminada el protocolo ldaps://.

Debemos copiar el certificado de la entidad certificadora a la ruta /usr/local/share/ca-certificates, y luego ejecutar el comando update-ca-certificates. Esta herramienta, lo que hará, es que, sobre los certificados almacenados, se cree un enlace simbólico a la ruta /etc/ssl/certs/.

root@freston:~# cp /etc/ssl/certs/gonzalonazareno.crt /usr/local/share/ca-certificates/

Ejecutamos el siguiente comando:

root@freston:~# update-ca-certificates

Updating certificates in /etc/ssl/certs...
rehash: warning: skipping duplicate certificate in gonzalonazareno.crt
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.

Para finalizar, vamos a realizar una consulta. Para realizar consultas en LDAP se utiliza la herramienta ldapsearch:

root@freston:~# ldapsearch -x -b "dc=javierpzh,dc=gonzalonazareno,dc=org"
# extended LDIF
#
# LDAPv3
# base <dc=javierpzh,dc=gonzalonazareno,dc=org> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# javierpzh.gonzalonazareno.org
dn: dc=javierpzh,dc=gonzalonazareno,dc=org
objectClass: top
objectClass: dcObject
objectClass: organization
o: javierpzh.gonzalonazareno.org
dc: javierpzh

# admin, javierpzh.gonzalonazareno.org
dn: cn=admin,dc=javierpzh,dc=gonzalonazareno,dc=org
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

# Personas, javierpzh.gonzalonazareno.org
dn: ou=Personas,dc=javierpzh,dc=gonzalonazareno,dc=org
objectClass: top
objectClass: organizationalUnit
ou: Personas

# Grupos, javierpzh.gonzalonazareno.org
dn: ou=Grupos,dc=javierpzh,dc=gonzalonazareno,dc=org
objectClass: top
objectClass: organizationalUnit
ou: Grupos

# search result
search: 2
result: 0 Success

# numResponses: 5
# numEntries: 4

La salida es correcta y por tanto ya habríamos configurado LDAPs.