Autentificación segura OpenSSL y OpenLDAP

Los permisos que los usuarios tienen sobre los sistemas se basan en la autentificación del usuario. Aunque ya se han desarrollado sofisticados métodos de autentificación como sistemas de tarjeta electrónica (DNI electrónico) o sistemas biológicos como la huella dactilar o el iris del ojo, la realidad es que requieren de elementos caros para su aplicación. En entornos educativos y en pequeñas y medianas empresas, se sigue utilizando el mecanismo tradicional de autentificación del usuario mediante su nombre de usuario (login) y su contraseña (password).

Desde que el usuario introduce su contraseña hasta que ésta llega al servidor para comprobar la autentificación, el paquete de datos que contiene la contraseña viaja por los cables de red atravesando concentradores (hubs), conmutadores (switches) y enrutadores (routers) hasta llegar al servidor. Durante el trayecto, cualquier persona con los conocimientos necesarios podría quedarse con una copia del paquete de datos para, posteriormente analizarlo y tratar de descubrir el nombre y la contraseña del usuario sin que éste se percatase.

Con la finalidad de dificultar que alguien trate de descubrir contraseñas analizando los datos que las contienen, existe la posibilidad de cifrar los paquetes de datos en el PC antes de enviarlos por la red, de manera que lleguen al servidor cifrados. De esta forma, aunque un usuario malintencionado capture un paquete de datos con la información del usuario y la contraseña, será muy dificil, por no decir imposible, que sea capaz de descifrarlos ya que se utiliza cifrado asimétrico

El cifrado asimétrico permite la generación de una pareja de claves comunmente denominadas clave pública y clave privada en el servidor. La pareja de claves es tal que, todo lo cifrado con una, solo se puede descifrar con la otra.

El servidor tiene guardada en un lugar seguro la clave privada. Cuando un cliente intenta autentificarse, el servidor le trasfiere la clave pública para que cifre los datos con dicha clave antes de enviarlos. El cliente utiliza la clave pública del servidor para cifrar los datos, así al llegar el paquete al servidor, éste podrá descifrarlo porque dispone de la clave privada. Si un usuario malintencionado intercepta el paquete de datos cifrado con la clave pública, no podrá hacer nada porque no dispone de la clave privada. Si el usuario malintencionado intercepta el primer paquete que envía el servidor con la clave pública, no le servirá para nada ya que no le permitirá descifrar los datos emitidos por el PC que se va autentificar.



Fundamentos de la autentificación segura

 

LDAP seguro - ldaps

Al igual que el servidor web apache utiliza el puerto 80 para transmitir información sin encifrar (protocolo http) y el puerto 443 para transmitir información cifrada (protocolo https), openLDAP también se puede configurar para que utilice las prestaciones de cifrado que ofrece OpenSSL.

Normalmente las consultas al servidor LDAP se realizan por el puerto 389 (protocolo ldap) pero dichas consultas se transmiten sin cifrar. Para realizar consultas seguras cifrando los datos con SSL, es necesasrio utilizar el puerto 636 (protocolo ldaps o protocolo ldap seguro). Para ello, el servidor deberá disponer de un certificado firmado por una entidad certificadora (CA) y habrá que configurar slapd para que utilice los certificados. Se deberán realizar los siguentes pasos:

  • Crear una nueva entidad certificadora
  • Crear una petición de firma de certificado del servidor
  • Firmar el certificado con la CA
  • Copiar los certificados a la carpeta deseada, renombrar y proteger
  • Configurar slapd para que utilice los certificados
  • Modificar script de inicio de slapd para que utilice protocolo seguro ldaps
  • Reiniciar slapd

Crearemos un script que realizará automáticamente todos los pasos. Guardaremos el script en /tmp/ldap-seguro.sh:

# ------- Script /tmp/ldap-seguro.sh -------

apt-get install gnutls-bin
sh -c "certtool --generate-privkey > /etc/ssl/private/cakey.pem"

echo cn = IES La Paloma>/etc/ssl/ca.info
echo ca>>/etc/ssl/ca.info
echo cert_signing_key>>/etc/ssl/ca.info

certtool --generate-self-signed --load-privkey /etc/ssl/private/cakey.pem  --template  /etc/ssl/ca.info --outfile /etc/ssl/certs/cacert.pem
sh -c "certtool --generate-privkey > /etc/ssl/private/ldap01_slapd_key.pem"

echo organization = IES La Paloma>/etc/ssl/ldap01.info
echo cn = ldap01.example.com>>/etc/ssl/ldap01.info
echo tls_www_server>>/etc/ssl/ldap01.info
echo encryption_key>>/etc/ssl/ldap01.info
echo signing_key>>/etc/ssl/ldap01.info

certtool --generate-certificate --load-privkey /etc/ssl/private/ldap01_slapd_key.pem --load-ca-certificate /etc/ssl/certs/cacert.pem --load-ca-privkey /etc/ssl/private/cakey.pem --template /etc/ssl/ldap01.info --outfile /etc/ssl/certs/ldap01_slapd_cert.pem

ldapmodify -Y EXTERNAL -H ldapi:/// << EOF
dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/cacert.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap01_slapd_cert.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap01_slapd_key.pem
EOF

adduser openldap ssl-cert
chgrp ssl-cert /etc/ssl/private/ldap01_slapd_key.pem
chmod g+r /etc/ssl/private/ldap01_slapd_key.pem

echo SLAPD_SERVICES=\"ldap:/// ldapi:/// ldaps:///\" >> /etc/default/slapd
/etc/init.d/slapd restart

# ----------- FIN del Script -----------

Una vez guardado el script, solo queda ejecutarlo:

// Ejecutar script /tmp/ldap-seguro.sh
sudo sh /tmp/ldap-seguro.sh

Al finalizar el script se habrá reinciado el servidor slapd y admitirá conexiones seguras por el puerto 636.

 

Probando el acceso por ssl

Si nuestro servidor LDAP está funcionando en modo seguro, estará escuchando en el puerto 636 ya que es el puerto utilizado por el protocolo ldaps. Para probarlo, iniciamos JXplorer pero la conexión la realizamos a dicho puerto y el nivel de seguridad seleccionamos SSL + User + Password ya que la autentificación va a ser por usuario y contraseña pero utilizando SSL:



Ldaps utiliza el puerto 636

Al intentar conectar, nos aparecerá la información del certificado. Podremos aceptar el certificado para esta sesión (This session only) o para siempre (Always):



Aceptar certificado

Una vez que hemos conectado, podemos apreciar en la parte inferior que la conexión se ha realizado al puerto 636:



Conexión segura

Icono de iDevice

Reflexión

¿Por qué deberíamos siempre conectarnos al servidor LDAP utilizando el protocolo seguro ldaps?