Restringir acceso y mejorar la seguridad con contraseñas en NGINX

16/12/2023 |
Loading...

Introducción: En este tutorial aprenderá cómo mejorar la seguridad de su sitio web configurando bloques de servidor NGINX y directivas de ubicación. Descubrirá cómo bloquear direcciones IP específicas de clientes, restringir el acceso según ubicaciones geográficas (restricción basada en geo-localización) e implementar autenticación basada en contraseñas utilizando HTTP Basic Authentication. Estas medidas pueden proporcionar una protección adicional para su servidor web mientras le permiten controlar el acceso a páginas web específicas.

Requisitos previos:

  • Un servidor Ubuntu con privilegios de sudo
  • NGINX instalado en su servidor
  • Conocimientos básicos de NGINX y su configuración

Nota: Para la restricción basada en contraseñas, se recomienda tener HTTPS habilitado en su servidor. Puede seguir este

Convenciones de formato:

  • En algunos ejemplos de configuración, se pueden usar puntos suspensivos (...) para indicar partes omitidas.
  • El término "servidor" se refiere a su servidor Ubuntu con NGINX instalado, mientras que "bloque de servidor" se refiere al bloque de configuración de NGINX que se ve así:
server { ... }

Lugares de configuración: Debe saber dónde NGINX almacena sus archivos de configuración:

  • /etc/nginx es el directorio de configuración de NGINX donde se colocan todos los archivos de configuración.
  • /etc/nginx/nginx.conf es el archivo de configuración principal de NGINX, donde NGINX comienza a leer su configuración.
  • /etc/nginx/sites-enabled es donde puede colocar sus archivos de configuración HTTP(S). Después de que NGINX se inicie o recargue, todos los archivos de este directorio serán cargados por NGINX.
  • /etc/nginx/sites-available es donde puede colocar sus archivos de configuración HTTP(S), pero no se cargarán en NGINX a menos que cree un enlace simbólico en el directorio /etc/nginx/sites-enabled.

Archivos de registro: NGINX genera dos archivos de registro predeterminados:

  • /var/log/nginx/access.log: Registra todas las solicitudes.
  • /var/log/nginx/error.log: Registra las condiciones de error e información de estado.

Error al recargar: Si encuentra un error al recargar su configuración de NGINX con sudo systemctl reload nginx, puede ver el error específico ejecutando sudo nginx -t.

Paso 1 - Localizar el archivo de bloque de servidor

Para configurar restricciones, debe encontrar el archivo de bloque de servidor que corresponde a su dominio. Use el siguiente comando para listar los archivos de bloque de servidor:

ls -al /etc/nginx/sites-available/

Suponiendo que desea agregar restricciones a un bloque de servidor que responde a example.com, localice el bloque de servidor con la línea server_name example.com;. Por ejemplo:

server { ... server_name example.com; ... }

Asegúrese de que la directiva listen coincida con el puerto que desea restringir (por ejemplo, listen 80; para HTTP).

Paso 2 - Usar direcciones IP para permitir o denegar acceso

NGINX proporciona las directivas allow y deny para controlar el acceso basado en direcciones IP de clientes. Puede bloquear el acceso a direcciones IP específicas, incluida su propia IP para pruebas.

Paso 2.1 - Encontrar su dirección IP pública Para bloquear su propia dirección IP, primero necesita determinar su dirección IP pública. Ejecute el siguiente comando:

curl -4 https://2ip.io

Recibirá su dirección IP pública como salida (por ejemplo, 15.1.1.1). Si el comando falla, puede encontrar su IP a través de una búsqueda en Google.

Paso 2.2 - Bloquear acceso Para bloquear su dirección IP, agregue la siguiente línea en el contexto de ubicación apropiado en su bloque de servidor, reemplazando 15.1.1.1 con su dirección IP pública:

deny 15.1.1.1;

Aquí hay un ejemplo de fragmento de configuración:

server { listen 80; server_name example.com; location / { deny 15.1.1.1; } }

Después de realizar este cambio, recargue NGINX para aplicar la configuración:

sudo systemctl reload nginx

Ahora, si ejecuta el mismo comando para acceder a su sitio web desde su IP:

curl -4 --head http://example.com

Recibirá un error HTTP 403 Forbidden, lo que indica que el acceso ha sido denegado.

Nota: Puede especificar múltiples directivas allow y deny. La primera directiva que coincida será aplicada. Por ejemplo:

allow 15.1.1.1; allow 15.1.1.2; deny all;

En este ejemplo, se permite el acceso a 15.1.1.1 y 15.1.1.2, mientras que se deniega el acceso a todas las demás direcciones IP.

Paso 3 - Usar el módulo Geo para permitir o denegar acceso

El módulo geo de NGINX ofrece una manera flexible de controlar el acceso basado en ubicaciones geográficas usando bases de datos IP. Para habilitar esta función:

  1. Instale el paquete libnginx-mod-http-geoip2:
sudo apt update && sudo apt install libnginx-mod-http-geoip2
  1. Asegúrese de que /etc/nginx/nginx.conf contenga la siguiente línea:
include /etc/nginx/modules-enabled/*.conf;
  1. Descargue una base de datos IP compatible con GeoIP2. Puede usar el comando proporcionado o crear una cuenta en el sitio web de MaxMind y descargar la base de datos GeoLite2 Country:
cd /etc/nginx && sudo curl --fail -LO https://github.com/P3TERX/GeoLite.mmdb/releases/latest/download/GeoLite2-Country.mmdb
  1. Edite su configuración de NGINX para incluir las directivas de GeoIP2:
geoip2 /etc/nginx/GeoLite2-Country.mmdb { $user_country country iso_code; } map $user_country $not_allowed { CA 1; # Canadá US 1; # Estados Unidos default 0; # Permitir todos los demás países } server { listen 80; server_name example.com; location / { if ($not_allowed) { return 403 "No se le permite acceder."; } } }

En este ejemplo, se deniega el acceso a los usuarios de Canadá (CA) y Estados Unidos (US), mientras que se permite el acceso a todos los demás países.

Recargue NGINX para aplicar los cambios:

sudo systemctl reload nginx

Paso 4 - Autenticación basada en contraseña (HTTP Basic Authentication)

Para restringir el acceso basado en nombre de usuario y contraseña, puede usar HTTP Basic Authentication. Asegúrese de que tiene HTTPS habilitado en su servidor.

  1. Crear un archivo para almacenar los nombres de usuario y contraseñas hasheadas:
sudo touch /etc/nginx/users
  1. Agregue usuarios con el siguiente comando (reemplace user y password con el nombre de usuario y contraseña deseados):
python3 -c 'from subprocess import *; import sys; print("Nombre de usuario: ", end="", file=sys.stderr); user = input(); passwd = run(["openssl", "passwd", "-6"], encoding="utf-8", stdout=PIPE).stdout.strip(); print("Usuario o contraseña está vacía. ¡Intente de nuevo!", file=sys.stderr) if user == "" or passwd == "" else print(user + ":" + passwd)' | sudo tee -a /etc/nginx/users

Este comando agrega un usuario al archivo /etc/nginx/users y muestra el nombre de usuario y la contraseña hasheada como pares user:password. La contraseña no se almacena en texto claro en el servidor.

  1. Modifique su configuración de bloque de servidor para incluir la autenticación HTTP Basic:
server { server_name example.com; location / { } auth_basic "¡Área protegida!"; auth_basic_user_file /etc/nginx/users; listen 443 ssl; # Gestionado por Certbot ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # Gestionado por Certbot ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # Gestionado por Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # Gestionado por Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Gestionado por Certbot }

Asegúrese de reemplazar example.com con su dominio real.

  1. Recargue NGINX para aplicar la configuración:
sudo systemctl reload nginx

Puede probar la nueva configuración con curl. Acceder al sitio sin un nombre de usuario y contraseña debe generar un error HTTP 401 Unauthorized, mientras que proporcionar credenciales válidas debería otorgar acceso.

Restringir acceso a una URL específica

Para restringir el acceso a una URL específica, agregue las directivas auth_basic y auth_basic_user_file directamente en un contexto de ubicación dentro de su bloque de servidor. Ejemplo:

server { server_name example.com; location / { } location /admin { auth_basic "¡Área protegida!"; auth_basic_user_file /etc/nginx/users; } listen 443 ssl; # Gestionado por Certbot ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # Gestionado por Certbot ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # Gestionado por Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # Gestionado por Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Gestionado por Certbot }

En este ejemplo, la URL /admin está protegida por autenticación HTTP Basic.

Registrar detalles de acceso incorrectos

NGINX registra los intentos de acceso incorrectos en el archivo /var/log/nginx/error.log. Esto incluye contraseñas incorrectas y nombres de usuario inexistentes, lo que proporciona visibilidad adicional sobre intentos de acceso no autorizados.

Entradas de registro de ejemplo:

  • Contraseña incorrecta:
2023/03/28 12:06:49 [error] 1865#1865: *14 user "root": password mismatch, client: 15.1.1.1, server: example.com, request: "GET / HTTP/1.1", host: "example.com"
  • Nombre de usuario inexistente:
2023/03/28 12:08:21 [error] 1865#1865: *16 user "root" was not found in "/etc/nginx/users", client: 15.1.1.1, server: example.com, request: "GET / HTTP/1.1", host: "example.com"

Conclusión: Este tutorial le ha proporcionado el conocimiento necesario para mejorar la seguridad de su sitio web utilizando NGINX. Al configurar bloques de servidor, controlar el acceso según direcciones IP, implementar restricciones geográficas y configurar autenticación basada en contraseñas, puede proteger mejor su servidor web y controlar el acceso a recursos específicos. La flexibilidad y las potentes características de NGINX lo convierten en una herramienta valiosa para asegurar sus aplicaciones web. Para obtener más orientación, consulte la documentación oficial de NGINX y los archivos de la lista de correo.

¡Obtén Ofertas y Promociones Exclusivas!

Mantente al día con las últimas ofertas, descuentos y promociones especiales.

Update cookies preferences