Saltar a contenido

spnego-http-auth: módulo NGINX para autenticación HTTP SPNEGO

Requiere el plan Pro (o superior) de la suscripción GetPageSpeed NGINX Extras.

Instalación

Puedes instalar este módulo en cualquier distribución basada en RHEL, incluyendo, pero no limitado a:

  • RedHat Enterprise Linux 7, 8, 9 y 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 y Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-spnego-http-auth
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-spnego-http-auth

Habilita el módulo añadiendo lo siguiente en la parte superior de /etc/nginx/nginx.conf:

load_module modules/ngx_http_auth_spnego_module.so;

Este documento describe nginx-module-spnego-http-auth v1.2.0 lanzado el 14 de febrero de 2026.


Este módulo implementa soporte para SPNEGO en nginx(http://nginx.org). Actualmente solo soporta autenticación Kerberos a través de GSSAPI

Requisitos previos

La autenticación ha sido probada con (al menos) los siguientes:

  • Nginx 1.2 a 1.15
  • Internet Explorer 8 y superior
  • Firefox 10 y superior
  • Chrome 20 y superior
  • Curl 7.x (GSS-Negotiate), 7.x (SPNEGO/fbopenssl)

La biblioteca kerberos subyacente utilizada para estas pruebas fue MIT KRB5 v1.12.

Referencia de configuración

Puedes configurar la autenticación GSS por ubicación y/o de manera global:

Estas opciones son requeridas. * auth_gss: on/off, para facilitar la desactivación mientras se dejan otras opciones en el archivo de configuración * auth_gss_keytab: ruta absoluta al archivo keytab que contiene las credenciales del servicio

Estas opciones SOLO deben especificarse si tienes un keytab que contiene principales privilegiados. En casi todos los casos, no deberías poner estas en el archivo de configuración, ya que gss_accept_sec_context hará lo correcto. * auth_gss_realm: nombre del reino Kerberos. Si esto se especifica, el reino solo se pasa a la variable nginx $remote_user si difiere de este valor por defecto. Para anular este comportamiento, establece auth_gss_format_full en on en tu configuración. * auth_gss_service_name: nombre del principal del servicio a utilizar al adquirir credenciales.

Si deseas autorizar solo un conjunto específico de principales, puedes usar la directiva auth_gss_authorized_principal. La sintaxis de configuración soporta múltiples entradas, una por línea.

auth_gss_authorized_principal <primary1>@<realm>
auth_gss_authorized_principal <primary2>@<realm>

Los principales también pueden ser autorizados utilizando un patrón regex a través de la directiva auth_gss_authorized_principal_regex. Esta directiva puede usarse junto con la directiva auth_gss_authorized_principal.

auth_gss_authorized_principal <primary1>@<realm>
auth_gss_authorized_principal_regex ^(<primary2>)/(<instance>)@<realm>$

El encabezado de usuario remoto en nginx solo puede ser establecido mediante autenticación básica. Por lo tanto, este módulo establece un encabezado de autenticación básica falso que llegará a tu aplicación backend para establecer este encabezado/variable nginx. La forma más fácil de desactivar este comportamiento es agregar la siguiente configuración a tu configuración de ubicación.

proxy_set_header Authorization "";

Una futura versión del módulo puede hacer que este comportamiento sea una opción, pero esto debería ser una solución suficiente por ahora.

Si deseas habilitar las reglas de nombre local GSS para reescribir nombres de usuario, puedes especificar la opción auth_gss_map_to_local.

Delegación de credenciales

Las credenciales de usuario pueden ser delegadas a nginx utilizando la directiva auth_gss_delegate_credentials. Esta directiva habilitará la delegación no restringida si el usuario elige delegar sus credenciales. La delegación restringida (S4U2proxy) también puede ser habilitada utilizando la directiva auth_gss_constrained_delegation junto con la directiva auth_gss_delegate_credentials. Para especificar el nombre del archivo ccache para almacenar el ticket de servicio utilizado para la delegación restringida, establece la directiva auth_gss_service_ccache. De lo contrario, se utilizará el nombre de ccache por defecto.

auth_gss_service_ccache /tmp/krb5cc_0;
auth_gss_delegate_credentials on;
auth_gss_constrained_delegation on;

Las credenciales delegadas se almacenarán dentro del directorio tmp del sistema. Una vez que la solicitud se complete, el archivo de credenciales será destruido. El nombre del archivo de credenciales se especificará dentro de la variable nginx $krb5_cc_name. El uso de la variable puede incluir pasarla a un programa fcgi utilizando la directiva fastcgi_param.

fastcgi_param KRB5CCNAME $krb5_cc_name;

La delegación restringida actualmente solo es compatible utilizando el esquema de autenticación negotiate y solo ha sido probada con MIT Kerberos (Usa bajo tu propio riesgo si usas Heimdal Kerberos).

Recaída a autenticación básica

El módulo recae en la autenticación básica por defecto si no se intenta ninguna negociación por parte del cliente. Si estás utilizando SPNEGO sin SSL, se recomienda desactivar la recaída a autenticación básica, ya que la contraseña se enviaría en texto plano. Esto se hace estableciendo auth_gss_allow_basic_fallback en el archivo de configuración.

auth_gss_allow_basic_fallback off

Estas opciones afectan el funcionamiento de la autenticación básica: * auth_gss_realm: nombre del reino Kerberos. Si esto se especifica, el reino se pasa solo a la variable nginx $remote_user si difiere de este valor por defecto. Para anular este comportamiento, establece auth_gss_format_full en 1 en tu configuración. * auth_gss_force_realm: Autenticar forzosamente utilizando el reino configurado en auth_gss_realm o el reino por defecto del sistema si auth_gss_realm no está configurado. Esto reescribirá $remote_user si el cliente proporcionó un reino diferente. Si auth_gss_format_full no está configurado, $remote_user no incluirá un reino incluso si uno fue especificado por el cliente.

Solución de problemas

Revisa los registros. Si ves una mención de NTLM, tu cliente está intentando conectarse utilizando NTLMSSP, que no es compatible y es inseguro.

Verifica que tienes un principal HTTP en tu keytab

Utilidades MIT Kerberos

$ KRB5_KTNAME=FILE:<ruta a tu keytab> klist -k

o

$ ktutil
ktutil: read_kt <ruta a tu keytab>
ktutil: list

Utilidades Heimdal Kerberos

$ ktutil -k <ruta a tu keytab> list

Obtén un principal HTTP

Si descubres que no tienes el principal de servicio HTTP, estás ejecutando en un entorno de Active Directory, y estás unido al dominio de tal manera que las herramientas de Samba funcionan correctamente

$ env KRB5_KTNAME=FILE:<ruta a tu keytab> net ads -P keytab add HTTP

Si estás ejecutando en un entorno kerberos diferente, probablemente puedas ejecutar

$ env KRB5_KTNAME=FILE:<ruta a tu keytab> krb5_keytab HTTP

Aumentar el tamaño máximo permitido del encabezado

En un entorno de Active Directory, el token SPNEGO en el encabezado de Autorización incluye información PAC (Privilege Access Certificate), que incluye todos los grupos de seguridad a los que pertenece el usuario. Esto puede hacer que el encabezado crezca más allá del límite por defecto de 8 kB y causar el siguiente mensaje de error:

400 Bad Request
Request Header Or Cookie Too Large

Por razones de rendimiento, la mejor solución es reducir el número de grupos a los que pertenece el usuario. Cuando esto es impráctico, también puedes optar por aumentar el tamaño del encabezado permitido estableciendo explícitamente el número y tamaño de los búferes de encabezado de Nginx:

large_client_header_buffers 8 32k;

Depuración

El módulo imprime todo tipo de información de depuración si nginx está compilado con la opción --with-debug, y la directiva error_log tiene un nivel debug.

NTLM

Ten en cuenta que el módulo no soporta NTLMSSP en Negotiate. NTLM, tanto v1 como v2, es un protocolo explotable y debe ser evitado cuando sea posible.

Windows

Para entornos KDC/AD de Windows, consulta la documentación aquí.

Ayuda

Si no puedes resolver las cosas, no dudes en abrir un problema en Github y haré lo posible por ayudarte.