viernes, 1 de junio de 2012

Apache2 IE Single Sign On con NTLM

He estado peleando con un sitio web que debe recoger las credenciales de un usuario ingresado en Active Directory de manera transparente (es decir, sin que ingrese nombre de usuario y contraseña). El navegador no es un problema, ya que es un entorno corporativo y sólo utilizan Internet Explorer.

Mi primer intento fue con un módulo de Perl, llamado AuthenNTLM. La configuración es extremadamente sencilla, sólo hay que recordar que el PDC debe estar indicado como nombre de máquina, sin el dominio:

/etc/apache2/conf.d/ntlm.conf
...
PerlAddVar ntdomain "dominio.com pdc" # y NO "dominio.com pdc.dominio.com"
...

También es importante que el sitio quede incluido en la configuración de Sitios Locales (o Local Intranet) de Internet Explorer, en la pestaña de seguridad de las preferencias, o si no el navegador no le enviará las credenciales al servidor.

Inmediatamente comenzó a funcionar en el ordenador en el que trabajo, y desde PHP pude acceder fácilmente a $_SERVER[´REMOTE_USER´] para averiguar el nombre de usuario del dominio.

El problema fue cuando lo probé en otro ordenador. Una y otra vez pedía el nombre de usuario y contraseña. En los logs de Apache, una y otra vez:

[error] Wrong password/user (rc=3/1/327681): ...

¿Cuál era el problema? El sistema operativo. Windows XP utiliza NTLMv1 (soportado por el módulo de Perl), mientras que Windows 7 se niega a usar nada menor a NTLMv2 (no soportado).

En realidad, se pueden cambiar las preferencias de Windows 7 para que acepte NTLMv1 (link). Pero según dicen, el protocolo era tan malo e inseguro que mejor no hacerlo. ¿Alternativas? Usar NTLM con Kerberos y Winbindd (pero mantener un servidor Winbindd puede ser un infierno) o probar con este módulo en Python que sí soporta NTLMv2: PyAuthenNTLM2

No hay comentarios: