OpenLDAP y passwords temporales (OTP)

Hoy traigo un post que tenía pendiente desde hace tiempo y que nos va a servir para poder tener OTP dentro de nuestro OpenLDAP como sistema de autenticación.

¿Qué es OTP?

OTP viene de las siglas en inglés One Time Password, o contraseñas de un único uso. Estas contraseñas pueden generarse de dos maneras:

  • Sincronización de tiempo: Tiene que haber sincronización de tiempo entre el servidor de autenticación y el cliente que genera la contraseña. Estas contraseñas son válidas durante un corto periodo de tiempo (normalmente 30 segundos).
  • Usando algoritmo matemático:
    • Basadas en la contraseña anterior.
    • Basadas en un desafío (número aleatorio…).

Os sonará si tenéis algún servicio de internet con sistema de doble autenticación (2FA) activado. No voy a dar más la chapa sobre esto, si queréis saber más, en la Wikipedia encontraréis mucha más información sobre OTP, TOTP y HOTP 😉

 

Instalación en OpenLDAP/slapd

Logo de OpenLDAP

Este post tiene como finalidad mostrar cómo compilar e instalar el módulo OTP para OpenLDAP en Debian 9 (Stretch). El problema que tenemos es que el módulo como tal ya existe en la rama master del repositorio de OpenLDAP,  pero hasta la versión 2.5 no saldrá de manera oficial, y casi todas las distribuciones tienen la 2.44 o 2.46. Así que vamos a ello:

Preparación del entorno

Como ya he dicho, vamos a hacer la instalación en una Debian 9. Como vamos a tener que compilar el módulo, como preparación también vamos a tener que compilar el propio OpenLDAP. Para ello, necesitamos tener los repositorios “source” en nuestro fichero /etc/apt/sources.list :

Y ahora actualizamos los repositorios y descargamos las dependencias para compilar OpenLDAP/slapd:

Ahora como un usuario no privilegiado hacemos:

Con esto hemos configurado las opciones como lo hace el propio mantenedor del paquete de Debian. Las opciones del configure las he sacado del fichero debian/configure.options. Podría parecer que ya está, pero no, todavía falta un poco más. Modificamos los siguientes ficheros:

  • libraries/liblber/Makefile
  • libraries/libldap/Makefile
  • libraries/libldap_r/Makefile

Y donde pone “VERSION_OPTION = @VERSION_OPTION@” lo substituimos por “VERSION_OPTION = ./“. Si no hacemos estos cambios obtendremos errores al compilar las librerías. Compilamos librerías y el propio OpenLDAP.

OJO!! No hagáis el mítico “make install”

 

Compilamos módulo TOTP

Como hemos comentado, el módulo TOTP está en fase beta y no se encuentra en Debian, por lo que necesitamos el código fuente del repositorio:

El módulo se encuentra concretamente en el directorio contrib/slapd-modules/passwd/totp/. Copiamos este directorio dentro del directorio de los sources de debian y lo compilamos:

El módulo se compila y se queda en el directorio oculto .libs . Lo copiamos al directorio de OpenLDAP instalado por paquetes Debian. Lo bueno es que si tenemos varios servidores Debian 9 con OpenLDAP, podemos copiar esta librería en el resto de servidores sin tener que repetir el proceso.

 

Configurar módulo TOTP

Desde las versiones 2.3.X OpenLDAP se configura en un árbol interno del ldap llamado cn=config. Vamos a explicar todos los pasos que hay que realizar:

Activar el acceso a cn=config

Generamos la contraseña para el usuario que podrá conectarse al árbol de configuración, que será cn=admin,cn=config . Con el siguiente comando nos pedirá que introduzcamos la contraseña y nos devolverá el hash:

Y generamos un fichero llamado olcRootPW.ldif con lo siguiente:

conexión con jxplorer

Y ahora tenemos que importarlo con:

Ahora podemos hacer uso de un cliente de LDAP (como jxplorer) para poder acceder a la sección de administración:

Cargar módulo pw-totp

En la parte de configuración, con jxplorer, deberíamos tener module{0} .Dentro de este “nodo”, tenemos que seleccionar olcModuleLoad, dar “click derecho” y darle “add another value” que tiene que ser {1}pw-totp, por lo que nos debería quedar como en la imagen.

Añadimos overlay

Gerenamos el fichero overlay.ldif con el siguiente contenido:

Y añadimos la config haciendo:

 

Configurar usuarios para autenticación TOTP

Ahora nos queda lo más importante, hacer que los usuarios tengan autenticación TOTP. Lo importante del usuario es lógicamente el campo userPassword. Lo tenemos que añadir como texto plano (desde jxplorer, phpldapadmin,…) y que sea algo tal que:

Hay que entender dos partes:

  • {TOTP1}: Es para indicar que el usuario va a usar el nuevo módulo TOTP.
  • MNMGI3CZLBHGWZLONBVE22SFPJNFQSRQLJDVU3SZGNNGSQ3HHU6QU===: es la base32 del base 64 de un string creado aleatorio. ¡Este código tiene que ser diferente para cada usuario!

Para generar el secreto que hay que darle al usuario:

 

Autenticación TOTP

Vamos a comprobar que lo que hemos hecho hasta ahora funciona. Tras instalar el paquete oathtool generamos el TOTP:

Si queremos usar nuestro móvil con el programa FreeOTP, necesitamos generar un código QR. Para ello necesitamos instalar el paquete qrencode y generar el código QR.

El QR que genera lo tenéis aquí, y lo podéis escanear con FreeOTP. Los puntos a tener en cuenta en la URL del comando anterior son:

  • otpauth:// : esquema/protocolo a utilizar
  • totp: tipo de autenticación (podria ser totp o hotp).
  • testldap:rgomez@irontec.com: es un string que indica la cuenta asociada y el nombre de la cuenta (normalmente un e-mail)
  • secret: el secreto en base32. Fijaros que hemos quitado los “=” del final del hash!!!
  • issuer: proveedor de asociado a esta cuenta
  • period: cuanto va a durar la contraseña generada
  • digits: número de dígitos que va a tener el TOTP
  • algorithm: algoritmo de creación.

Un poco más de información en la web de Google Authenticator. Tanto el TOTP generado en FreeOTP como el de consola os tiene que dar los mismos dígitos 😀

Y confirmamos que la autenticación funciona ejecutando el siguiente comando y metiendo el código OTP que obtenemos del QR o el comando:

 

Conclusión

Aunque lo habitual es que OTP se use como autenticación de 2 factores, en este caso lo que hemos hecho ha sido que OpenLDAP lo use como sistema principal aunque no sea lo más óptimo. Esperemos que la versión 2.5 salga cuanto antes para que sea más sencillo de usar 😀  Y vosotros, ¿para qué usáis los OTP? ¿Los tenéis integrado en vuestros sistemas?



¿Te gusta este post? Es solo un ejemplo de cómo podemos ayudar a tu empresa...
Sobre Rubén Gómez Olivencia

De programador a administrador de sistemas... Algunos dirán que tengo personalidad múltiple developer-bofh, pero ¿quién no tiene taras mentales? :P

Queremos tu opinión :)