FeaturedNOTICIAS

Cómo configurar la autenticación HTTP básica en NGINX – CloudSavvy IT


Logotipo de Nginx.

La autenticación básica de nombre de usuario y contraseña es una forma fácil y sencilla de proteger los paneles administrativos y los servicios de backend. Nginx puede configurarse para proteger ciertas áreas de su sitio web o incluso utilizarse como proxy inverso para proteger otros servicios.

¿Cómo funciona la autenticación HTTP?

En la autenticación HTTP básica, algunas rutas del servidor están bloqueadas y requieren un nombre de usuario y una contraseña para acceder a ellas. Por ejemplo, los paneles de administración de la mayoría de los enrutadores domésticos están protegidos de esta manera; cuando intenta acceder a él, el navegador abre un cuadro de diálogo solicitando sus credenciales.

Cuando un usuario intenta acceder a un recurso protegido, el servidor envía al usuario uno WWW-Authenticate encabezado junto con aa 401 Unauthorized respuesta. El cliente devuelve el nombre de usuario y la contraseña correspondientes, almacenados en el Authorization encabezado y, si coincide con un archivo de clave, pueden conectarse.

Dado que la autenticación HTTP básica requiere que se envíen contraseñas a través de la red, debe tener HTTPS / TLS configurado en el servidor; de lo contrario, cualquiera que esté en el medio podría olfatear la contraseña en texto sin cifrar. HTTPS cifrará la conexión, haciendo que su transmisión sea segura. Puede configurar un certificado gratuito con LetsEncrypt, o si está buscando asegurar un servidor privado, cree y firme uno usted mismo.

La autenticación básica de nombre de usuario / contraseña es solo uno de los muchos esquemas de autenticación; otro esquema común son los tokens de portador, que se utilizan para los flujos de OAuth 2.0. Puede usar este esquema con Nginx usando el módulo JSON Web Tokens, pero la configuración completa es mucho más compleja que la autenticación de nombre de usuario / contraseña.

Generar un archivo de contraseña

Puedes usar el htpasswd para generar archivos de contraseña. Lo más probable es que ya esté instalado en su sistema, pero si no lo está, puede instalarlo desde el apache2-utils paquete. (Nginx usa el mismo formato de contraseña que Apache):

sudo apt-get install apache2-utils

Genere un nuevo archivo de contraseña ejecutando htpasswd con el -c bandera, en este caso, para el usuario «admin»:

sudo htpasswd -c /etc/nginx/.htpasswd admin

Se le pedirá que ingrese una contraseña, que será hash y almacenada en /etc/nginx/.htpasswd. Si desea agregar más usuarios, omita el -c bandera para agregar nuevas entradas.

Habilitar la autenticación HTTP básica

Puede proteger cualquier ruta en nginx usando el auth_basic directiva dentro de un puesto. Por ejemplo, para proteger con contraseña /admin, colocaría este bloque de ubicación dentro del bloque del servidor en su archivo de configuración nginx principal (generalmente ubicado en /etc/nginx/nginx.conf):

location /admin {
  try_files $uri $uri/ =404;
  auth_basic "Restricted Content";
  auth_basic_user_file /etc/nginx/.htpasswd;
}

La auth_basic_user_file La directiva debe apuntar al archivo de contraseña creado en el primer paso. Esto no tiene que tener un nombre especial, por lo que puede crear diferentes archivos de contraseña para diferentes rutas.

Nginx debería encargarse del resto por ti. Reinicie para aplicar los cambios:

sudo service nginx restart

Y verifique la ruta segura en su navegador. Se le debe solicitar una contraseña y se le negará el acceso si no puede proporcionarla.

Usando la autenticación de proxy

Un caso de uso común para la autenticación básica es proteger un recurso externo con un proxy inverso nginx. Funciona perfectamente con auth_basic, y es tan simple como usar los dos juntos:

location / {
  #//turn on auth for this location
  auth_basic "Restricted Content";
  auth_basic_user_file /etc/nginx/.htpasswd;

  #//normal proxy configuration
  proxy_http_version 1.1;
  proxy_pass_request_headers on;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Accept-Encoding "";

  proxy_pass https://<ip-address>;
  proxy_redirect default;
}

Funciona al denegar cualquier acceso al proxy antes de que un usuario se autentique. Una vez autenticado, nginx funciona normalmente.

Sin embargo, si desea autenticarse en el servidor detrás del proxy inverso, la configuración es más complicada. En su lugar, querrá que nginx reenvíe su entrada al servidor web, que podría, por ejemplo, consultar una base de datos o realizar verificaciones más complejas que un simple archivo de contraseña.

Deberá utilizar el módulo headers-more para poder editar los encabezados de forma más directa:

location / {
  proxy_http_version 1.1;
  proxy_pass_request_headers on;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Accept-Encoding "";

  proxy_pass https://<ip-address>;
  proxy_redirect default;

  more_set_input_headers 'Authorization: $http_authorization';
  more_set_headers -s 401 'WWW-Authenticate: Basic realm="your_server.com"';
}

La configuración del proxy es la misma, excepto que falta auth_basic porque no queremos autenticarnos con nginx. La more_set_input_headers La directiva está haciendo la magia aquí y establece el encabezado para cuando se comunica con el servidor web para incluir el $http_authorization variable obtenida del cliente. De esta manera, el nombre de usuario y la contraseña se pasan a través de nginx al backend.

La siguiente línea es más complicada; la forma normal de configurar los encabezados anulará la realm variable cuando es proxy a través de nginx, lo cual no es ideal. Utilizando more_set_headers lo conservará y le mostrará al cliente la información correcta.

TE INTERESA>>  ¿Por qué tardas tanto en encontrar el amor, según tu signo zodiacal?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba