11 de Enero, 2009

IMAPs como alternativa a la autenticación LDAP

Para conseguir centralizar la gestión de usuarios con LDAP es imprescindible que todos los servicios implicados nos dejen autenticar contra un servidor LDAP. Parece evidente :).

En nuestro caso tuvimos bastante suerte y fue relativamente fácil de conseguir en todos los casos, menos uno.

El modelo de desarrollo Open Source de OrangeHRM es cuanto menos curioso (aunque yo diría muy ineficiente, porque se cargan el release early, release often).

Rompen completamente la posibilidad de tener una comunidad de desarrolladores, porque la actualización de una versión a la siguiente no está soportada: necesitamos una subscripción de pago.

Así que, bajo la condición de reinstalar y no poder migrar datos fácilmente, veo complicado que se contribuyan parches para ser integrados en la rama principal de desarrollo, porque mucha gente no actualizará.

La verdad es que esta política de subscripciones me ha decepcionado bastante, así que cuando vi que la única opción de soporte LDAP es mediante un add-on, que luego no sabemos si podremos modificar legalmente en caso de que no se ajuste a nuestras necesidades.

Para una empresa los $99 es una cantidad despreciable, pero pensé: voy a mirar el código, y como esté claro... lo implemento en llegar a casa. Pues ha sido muy fácil :D.

Lo único que me daba pereza era el API de LDAP que tiene PHP, que no lo conozco y atendiendo a los ejemplos, me iba a llevar más tiempo del que le quería dedicar al invento.

Así que me vino a la cabeza otra posibilidad: las funciones para acceder a IMAP desde PHP. Es un API sencillo, el servicio está disponible en nuestro Zimbra (que ya va con LDAP), soporta SSL, y solo necesitamos hacer login ;).

Supongamos un esquema sencillo:

/* intentamos hacer login */
$mbox = @imap_open("{imap.mydomain.dom:993/imap/ssl/novalidate-cert}Drafts", 
        "usuario@mydomain.dom", 
        "secretpassword", OP_HALFOPEN);

/* evaluamos el resultado */
if($mbox)
{
	echo "La autenticación se ha realizado con éxito :)\n";
	imap_close($mbox);
}
else
	echo "Ha fallado la autenticación :(\n";

Es bastante sencillo el ejemplo, aunque hay algunas particularidades:

  • /imap/ssl/novalidate-cert: indicamos que queremos trabajar con el protocolo IMAPs (imap con ssl). Si usamos un certificado firmado por nosotros mismos, deberemos indicar el novalidate-cert (lo digo porque es un poco oscura la opción y se trata de un caso bastante frecuente).
  • Indicamos la carpeta Drafts: aunque gracias a OP_HALFOPEN dará igual porque no vamos a abrir el buzón, solo queremos hacer login. Esto es porque realmente es lo que necesitamos y para asegurarnos de que no hay problemas de rendimiento (si el buzón tiene muchos mensajes, imagino que puede ser lento).
  • Usamos la @ delante de la función: porque, aunque se abra la sesión con éxito, imap_open es demasiado detallista en lo que respecta a warnings. A fin de cuenta solo queremos saber si todo funciona o no, para más detalles está imap_errors (PHP5+).

Después de ojear un rato el login.php de nuestro OrangeHRM 2.2.2.2, fue realmente fácil pasar a usar IMAPs para la autenticación.

No obstante hay que tener un par de detalles en cuenta: que la autenticación se realiza con IMAPs, pero hay que seguir obteniendo el usuario de OrangeHRM (en mi caso dejo el usuario tal cual, y concateno el dominio para hacer login en Zimbra), y que para validar el hack hay que tener claro qué ocurre en las distintas posibilidades:

Login IMAPsUsuario en OrangeHRMResultado
OKOKOK
OKDeshabilitadoFAIL
FAILOKFAIL
OKNo existeFAIL
FAILNo existeFAIL

Con OrangeHRM ha sido bastante fácil, y el hack ha quedado muy limpio (la única cosa rara es deshabilitar temporalmente el gestor de errores que instala OrangeHRM, por si el login falla, porque parece que ignora la @). Por si a alguien le interesa, aquí hay un diff contra el login.php de la versión 2.2.2.2: login_imap_orangeHRM-2.2.2.2.diff.

En resumen: es fácil autenticar contra IMAPs, y puede ser un complemento sencillo si solo queremos eso de un servicio tan complejo de utilizar como es LDAP.

Anotación por Juan J. Martínez, clasificada en: imap, ldap, security.

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Algunas anotaciones relacionadas: