miércoles, 12 de mayo de 2021

NTLM sobre NGINX reverse proxy



Cómo autenticar un usuario con NTLM a través de NGINX.



Si tenemos un aplicativo web corriendo sobre un Microsoft IIS que requiera usuario y contraseña en un pop up para acceder a una determinada parte de la web, probablemente se use el protocolo NTLM.

NTLM (sucesor de NT LAN Manager) recoge un nombre de dominio, un nombre de usuario y una contraseña y usa cifrado para autenticar a un usuario sin enviar la contraseña del usuario a través de la conexión. En su lugar, el sistema que solicita la autenticación debe realizar un cálculo que demuestre que tiene acceso a las credenciales NTLM protegidas.

La autenticación NTLM implica por tanto tres actores: un cliente, un servidor y un controlador de dominio que realice los cálculos de autenticación en nombre del servidor.

Para saber si un Windows Server usa autenticación NTLM o no, podemos echar un ojo a los headers que envía el servidor y ver si está presente el siguiente header:

WWW-Authenticate: NTLM

Si el header está presente, pasamos el dominio de la web a través de NGINX y enviamos las peticiones hacia el Windows Server, no nos funcionará la autenticación de usuarios.

NTLM no funcionará porque los paquetes TCP no se reenvían exactamente como los recibió el proxy inverso. Por este motivo, muchos servidores 'proxy inverso' no funcionan con la autenticación NTLM ya que reenvían las solicitudes HTTP correctamente pero no los paquetes TCP.

Para solucionar el problema, me temo que debemos adquirir una licencia de NGINX Plus y usar el módulo NTLM, solo disponible en la versión de pago.

Para permitir autenticación NTLM a través de NGINX deberemos usar el siguiente código:

upstream http_backend { server 192.168.1.1:443; ntlm; } server { ... location /http/ { proxy_pass https://http_backend; proxy_http_version 1.1; proxy_set_header Connection ""; } }

Lo que hace este código es mandar las peticiones TCP enviadas a /http/ a un upstream y servir una conexión distinta para cada usuario. Huelga decir que con la orden "ntlm" (solo disponible en NGINX Plus) especificamos que se está usando NTLM en la autenticación de los usuarios.

Importante: para que la autenticación NTLM funcione correctamente, es necesario que la directiva proxy_http_version sea "1.1" y el campo de encabezado "Conexión" sea borrado.


Fuentes:

https://docs.microsoft.com/es-es/windows/win32/secauthn/microsoft-ntlm
https://nginx.org/en/docs/http/ngx_http_upstream_module.html#ntlm
0

0 comentarios:

Publicar un comentario