Introducción

Buenas, en este post vamos a configurar el servidor LDAP instalado anteriormente para que utilice el protocolo ldaps:// a la vez que el ldap:// utilizando un certificado x509.

Ficheros necesarios

Hemos creado una clave privada y un fichero .csr para que nos lo pueda firmar nuestra entidad certificadora con la siguiente instrucción:

openssl req -out cabezas.gonzalonazareno.org.csr -newkey rsa:2048 -nodes -keyout cabezas.gonzalonazareno.org.key

Una vez que nos lo han firmado, tenemos un archivo .crt:

cabezas.gonzalonazareno.org.crt

Nos hemos descargado de gestiona el certificado del gonzalo:

gonzalonazareno.crt

Instalación certificado gonzalo

Para instalar el certificado del gonzalo, movemos el fichero:

sudo mv gonzalonazareno.crt /usr/local/share/ca-certificates/

Y ejecutamos la instrucción:

sudo update-ca-certificates

Se generará el siguiente fichero

/etc/ssl/certs/gonzalonazareno.pem

Tendremos que copiarlo a otra ubicación posteriormente.

Creación carpetas necesarias:

mkdir -p /etc/ssl/openldap/{private,certs,newcerts}

Ubicación de ficheros

Necesitaremos crear los siguientes archivos para rastraear certificados firmados:

echo "1001" > /etc/ssl/openldap/serial
touch /etc/ssl/openldap/index.txt

Después de mover los ficheros mencionados anteriormente tendremos que tener el siguiente árbol:

/etc/ssl/openldap/
├── certs
│   ├── cabezas.gonzalonazareno.org.crt
│   └── gonzalonazareno.pem
├── index.txt
├── newcerts
├── private
│   └── cabezas.gonzalonazareno.org.key
└── serial

Cambiamos los permisos:

sudo chown -R openldap: /etc/ssl/openldap/

Modificación ficheros configuración

Tendremos que editar varios archivos. Uno de ellos:

sudo nano /usr/lib/ssl/openssl.cnf

Y cambiamos la línea:

dir            = ./demoCA              # Where everything is kept

Por esta otra:

dir             = /etc/ssl/openldap

Actualización certificados TLS OpenLDAP

Debemos de actualizar los certificados TLS de OpenLDAP, para ello crearemos un fichero ldif:

nano ssl.ldif

Con la siguiente información:

dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/openldap/certs/gonzalonazareno.pem
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/openldap/certs/cabezas.gonzalonazareno.org.crt
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/openldap/private/cabezas.gonzalonazareno.org.key

Y con ldapmodify importaremos lo anterior:

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f ldap-tls.ldif

Para verificar que ha funcionado:

slapcat -b "cn=config" | grep -E "olcTLS"

olcTLSCACertificateFile: /etc/ssl/openldap/certs/gonzalonazareno.pem
olcTLSCertificateFile: /etc/ssl/openldap/certs/cabezas.gonzalonazareno.org.cert
olcTLSCertificateKeyFile: /etc/ssl/openldap/private/cabezas.gonzalonazareno.org.key

Podemos validar la configuración de LDAP con el siguiente comando:

sudo slaptest -u

También tendremos que modificar:

sudo nano /etc/ldap/ldap.conf

Y actualizar la línea:

TLS_CACERT      /etc/ssl/openldap/certs/cabezas.gonzalonazareno.org.crt

Y por último editar el fichero:

sudo nano /etc/default/slapd

Y la línea:

SLAPD_SERVICES

Dejarla de la siguiente forma:

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

Reiniciamos el servicio:

sudo systemctl restart slapd

Configuracion en cliente

En el cliente tendremos que tener el fichero cabezas.gonzalonazareno.org.crt, lo instalaremos igual que hicimos anteriormente.

Y tendremos que modificar el fichero:

sudo nano /etc/ldap/ldap.conf

Para añadir lo siguiente:

BASE dc=freston,dc=cabezas,dc=gonzalonazareno,dc=org
URI ldaps://freston.cabezas.gonzalonazareno.org
TLS_CACERT /etc/ssl/certs/cabezas.gonzalonazareno.org.pem
TLS_REQCERT demand

Así la conexión la hará por ldaps por defecto y escogerá el certificado que le indiquemos.

Comprobación desde un cliente externo

Desde dulcinea vamos a probar la conexión mediante ldaps y ldap:

LDAPs

ldapsearch -x -D "cn=admin,dc=freston,dc=cabezas,dc=gonzalonazareno,dc=org" -b dc=freston,dc=cabezas,dc=gonzalonazareno,dc=org -H ldaps://freston.cabezas.gonzalonazareno.org:636 -W
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <dc=freston,dc=cabezas,dc=gonzalonazareno,dc=org> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# freston.cabezas.gonzalonazareno.org
dn: dc=freston,dc=cabezas,dc=gonzalonazareno,dc=org
objectClass: top
objectClass: dcObject
objectClass: organization
o: Cabezas company
dc: freston

# admin, freston.cabezas.gonzalonazareno.org
dn: cn=admin,dc=freston,dc=cabezas,dc=gonzalonazareno,dc=org
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9amhZcWJyRWs1T2FYcXZ2RVhDZkRpb0E2LzFuMS94Lzg=

# People, freston.cabezas.gonzalonazareno.org
dn: ou=People,dc=freston,dc=cabezas,dc=gonzalonazareno,dc=org
ou: People
objectClass: organizationalUnit

# Group, freston.cabezas.gonzalonazareno.org
dn: ou=Group,dc=freston,dc=cabezas,dc=gonzalonazareno,dc=org
ou: Group
objectClass: organizationalUnit

# search result
search: 2
result: 0 Success

# numResponses: 5
# numEntries: 4

LDAP

ldapsearch -x -D "cn=admin,dc=freston,dc=cabezas,dc=gonzalonazareno,dc=org" -b dc=freston,dc=cabezas,dc=gonzalonazareno,dc=org -H ldap://freston.cabezas.gonzalonazareno.org -W
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <dc=freston,dc=cabezas,dc=gonzalonazareno,dc=org> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# freston.cabezas.gonzalonazareno.org
dn: dc=freston,dc=cabezas,dc=gonzalonazareno,dc=org
objectClass: top
objectClass: dcObject
objectClass: organization
o: Cabezas company
dc: freston

# admin, freston.cabezas.gonzalonazareno.org
dn: cn=admin,dc=freston,dc=cabezas,dc=gonzalonazareno,dc=org
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9amhZcWJyRWs1T2FYcXZ2RVhDZkRpb0E2LzFuMS94Lzg=

# People, freston.cabezas.gonzalonazareno.org
dn: ou=People,dc=freston,dc=cabezas,dc=gonzalonazareno,dc=org
ou: People
objectClass: organizationalUnit

# Group, freston.cabezas.gonzalonazareno.org
dn: ou=Group,dc=freston,dc=cabezas,dc=gonzalonazareno,dc=org
ou: Group
objectClass: organizationalUnit

# search result
search: 2
result: 0 Success

# numResponses: 5
# numEntries: 4

Verificación del certificado

Para poder verificar el certificado vamos a instalar Apache Directory Studio en nuestra máquina(hemos añadido previamente la configuración que hicimos en Configuracion en cliente ) Y haremos la siguiente conexión, siendo:

1

Pulsamos en View Certificate para ver nuestro certificado:

2

3

Y cuando lo veamos y digamos que confiamos en él, pulsamos en siguiente y añadimos la ruta DN para el usuario admin:

4

Finalizamos y ya tendremos la conexión a través de Apache Directory:

5

Se me olvidaba comentar que para poder realizar la conexión a través de nuestra máquina hemos tenido que añadir las siguientes reglas en dulcinea:

iptables -t nat -A PREROUTING -i eth2 -p tcp --dport 389 -j DNAT --to 10.0.1.9:389
iptables -t nat -A PREROUTING -i eth2 -p tcp --dport 636 -j DNAT --to 10.0.1.9:636