auth-digest: Autenticación Digest para NGINX
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-auth-digest
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-auth-digest
Habilita el módulo añadiendo lo siguiente en la parte superior de /etc/nginx/nginx.conf:
load_module modules/ngx_http_auth_digest_module.so;
Este documento describe nginx-module-auth-digest v1.0.0 lanzado el 23 de marzo de 2018.
Cambios de otros forks
Correcciones de errores 1, 2, 3
Se agregó un mensaje de registro para intentos de inicio de sesión inválidos
Descripción
El módulo ngx_http_auth_digest complementa la Autenticación Básica incorporada de Nginx módulo proporcionando soporte para la RFC 2617 Autenticación Digest. El módulo es actualmente funcional, pero solo ha sido probado y revisado por su autor. Y dado que este es código de seguridad, un solo par de ojos es casi con certeza insuficiente para garantizar que sea 100% correcto. Hasta que lleguen algunos informes de errores y se eliminen algunos de los ‘desconocidos desconocidos’ en el código, considera este módulo como un ‘alpha’ y trátalo con la cantidad apropiada de escepticismo.
Una lista de problemas conocidos con el módulo se puede encontrar en el archivo bugs.txt así como en el Issue Tracker. Por favor, considera contribuir con un parche si tienes el tiempo y la inclinación. Cualquier ayuda para corregir los errores o cambiar la implementación a una más idiomática de nginx sería muy apreciada.
Ejemplo
Puedes proteger con contraseña un árbol de directorios añadiendo las siguientes líneas en una sección server en tu archivo de configuración de Nginx:
auth_digest_user_file /opt/httpd/conf/passwd.digest; # un archivo creado con htdigest
location /private {
auth_digest 'esto no es para ti'; # establece el realm para este bloque de ubicación
}
Las otras directivas controlan los valores predeterminados de la duración de la sesión de autenticación. Lo siguiente es equivalente al ejemplo anterior pero demuestra todas las directivas:
auth_digest_user_file /opt/httpd/conf/passwd.digest;
auth_digest_shm_size 4m; # el espacio de almacenamiento asignado para rastrear sesiones activas
location /private {
auth_digest 'esto no es para ti';
auth_digest_timeout 60s; # permite a los usuarios esperar 1 minuto entre recibir el
# desafío y presionar enviar en el cuadro de diálogo del navegador
auth_digest_expires 10s; # después de un desafío/respuesta exitoso, permite al cliente
# continuar usando el mismo nonce para solicitudes adicionales
# durante 10 segundos antes de generar un nuevo desafío
auth_digest_replays 20; # también genera un nuevo desafío si el cliente usa el
# mismo nonce más de 20 veces antes del límite de tiempo de expiración
}
Agregar autenticación digest a una ubicación afectará cualquier URI que coincida con ese bloque. Para deshabilitar la autenticación para sub-ramas específicas de una URI, establece auth_digest en off:
location / {
auth_digest 'esto no es para ti';
location /pub {
auth_digest off; # este subárbol será accesible sin autenticación
}
}
Directivas
auth_digest
Sintaxis
auth_digest [realm-name | off]
Predeterminado
off
Contexto
server, location
Descripción
Habilita o deshabilita la autenticación digest para un bloque de servidor o ubicación. El nombre del realm debe corresponder a un realm utilizado en el archivo de usuarios. Cualquier usuario dentro de ese realm podrá acceder a los archivos después de autenticarse.
Para deshabilitar selectivamente la autenticación dentro de una jerarquía de URI protegida, establece auth_digest en “off” dentro de un bloque de ubicación más específico (ver ejemplo).
auth_digest_user_file
Sintaxis
auth_digest_user_file /path/to/passwd/file
Predeterminado
no establecido
Contexto
server, location
Descripción
El archivo de contraseñas debe estar en la forma creada por el comando apache htdigest (o el script incluido htdigest.py). Cada línea del archivo es una lista separada por dos puntos compuesta por un nombre de usuario, realm y hash md5 que combina nombre, realm y contraseña. Por ejemplo: joi:enfield:ef25e85b34208c246cfd09ab76b01db7
auth_digest_timeout
Sintaxis
auth_digest_timeout delay-time
Predeterminado
60s
Contexto
server, location
Descripción
Cuando un cliente solicita por primera vez una página protegida, el servidor devuelve un código de estado 401 junto con un desafío en el encabezado www-authenticate.
En este punto, la mayoría de los navegadores presentarán un cuadro de diálogo al usuario pidiéndole que inicie sesión. Esta directiva define cuánto tiempo permanecerán válidos los desafíos. Si el usuario espera más tiempo que este antes de enviar su nombre y contraseña, el desafío se considerará ‘obsoleto’ y se le pedirá que inicie sesión nuevamente.
auth_digest_expires
Sintaxis
auth_digest_expires lifetime-in-seconds
Predeterminado
10s
Contexto
server, location
Descripción
Una vez que un desafío digest ha sido respondido con éxito por el cliente, las solicitudes subsiguientes intentarán reutilizar el valor ‘nonce’ del desafío original. Para complicar los ataques MitM, es mejor limitar el número de veces que se aceptará un nonce en caché. Esta directiva establece la duración de este período de reutilización después de la primera autenticación exitosa.
auth_digest_replays
Sintaxis
auth_digest_replays number-of-uses
Predeterminado
20
Contexto
server, location
Descripción
La reutilización de nonce también debe limitarse a un número fijo de solicitudes. Ten en cuenta que aumentar este valor causará un aumento proporcional en el uso de memoria y el shm_size puede tener que ajustarse para mantenerse al día con el tráfico pesado dentro de los bloques de ubicación protegidos por digest.
auth_digest_evasion_time
Sintaxis
auth_digest_evasion_time time-in-seconds
Predeterminado
300s
Contexto
server, location
Descripción
La cantidad de tiempo durante el cual el servidor ignorará las solicitudes de autenticación de una dirección de cliente una vez que el número de autenticaciones fallidas de ese cliente alcance auth_digest_maxtries.
auth_digest_maxtries
Sintaxis
auth_digest_maxtries number-of-attempts
Predeterminado
5
Contexto
server, location
Descripción
El número de intentos de autenticación fallidos desde una dirección de cliente antes de que el módulo entre en tácticas evasivas. Para fines de evasión, solo se rastrean los clientes de red, y solo por dirección (sin incluir el número de puerto). Una autenticación exitosa restablece los contadores.
auth_digest_shm_size
Sintaxis
auth_digest_shm_size size-in-bytes
Predeterminado
4096k
Contexto
server
Descripción
El módulo mantiene una caché de tamaño fijo de sesiones digest activas para guardar el estado entre solicitudes autenticadas. Una vez que esta caché está llena, no será posible realizar más autenticaciones hasta que las sesiones activas expiren.
Como resultado, elegir el tamaño adecuado es un poco complicado ya que depende de los valores establecidos en las directivas relacionadas con la expiración. Cada desafío almacenado ocupa 48 + ceil(replays/8) bytes y vivirá hasta auth_digest_timeout + auth_digest_expires segundos. Al usar la configuración predeterminada del módulo, esto se traduce en permitir alrededor de 82k solicitudes no repetidas cada 70 segundos.
GitHub
Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-auth-digest.