Configuración Avanzada y Seguridad con Módulos Esenciales de Nginx

Gestión de Accesos y Autenticación Básica

Para restringir o permitir el tráfico hacia recursos específicos, se utiliza el módulo ngx_http_access_module. Este permite definir políticas basadas en direcciones IP o subredes.

El proceso evalúa las directivas secuencialmente; por tento, las reglas más específicas deben colocarse antes que las generales.

# Ejemplo de configuración básica
location /recursos-seguros {
    deny   192.168.1.0/24;      # Deniega acceso a esta subred
    allow  10.20.30.0/24;       # Permite acceso desde este rango
    allow  2001:db8::/32;       # Permite acceso IPv6 específico
    deny   all;                 # Niega todo lo demás por defecto
}

La sintaxis soporta bloques en contextos http, server y location.

Ejemplo de Implementación en VHost

A continuación se muestra cómo integrar el control de accesos en un bloque de servidor, protegiendo un directorio sensible:

server {
    listen 80;
    server_name api.corp.net;

    location /api/admin {
        root /var/www/api;
        deny 10.0.0.0/8;          # Bloqueo interno de red
        allow 172.16.5.0/24;      # Solo red de desarrollo
        index index.php;
    }

    location / {
        root /var/www/public;
    }
}

Autenticación HTTP Básica

El módulo ngx_http_auth_basic_module protege directorios o ubicaciones solicitando credenciales al cliente mediante una ventana emergente de navegación estándar.

location /portal-confidencial {
    auth_basic "Acceso Restringido";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

Es necesario generar el archivo de contraseñas encriptadas utilizando la utilidad externa htpasswd.

# Crear nuevo archivo de usuarios
htpasswd -bc /etc/nginx/.htpasswd usuario_admin ContraseñaSegura123

# Verificar permisos de seguridad
chmod 600 /etc/nginx/.htpasswd

Los parámetros disponibles incluyen:

  • -c: Crea un nuevo archivo si no existe.
  • -b: Utiliza contraseña desde línea de comandos (modo batch).
  • -n: Muestra salida en consola sin guardar archivos.

Ocultar Información del Servidor

Exponer el número de versión exacto de Nginx puede ser un riesgo de seguridad, facilitando ataques dirigidos a vulnerabilidades conocidas. Se recomienda deshabilitar esta información en los encabezados.

Inclusión en el contexto global http:

http {
    server_tokens off;
    include mime.types;
    default_type application/octet-stream;
}

Adicionalmente, si se integra con PHP, es crucial ocultar la variable SERVER_SOFTWARE en las configuraciones fastcgi_params y fastcgi.conf para evitar fugas de identidad adicionales.

La funcionalidad ngx_http_autoindex_module genera automáticamente índices de directorio cuando falta un archivo de índice principal (como index.html).

server {
    listen 80;
    server_name descargas.corp.net;

    location /files {
        root /srv/web/shared;
        autoindex on;               # Habilitar listado
        charset utf-8;              # Evitar caracteres extraños en nombres
        alias /srv/web/shared;
    }
}

Atención: Los tipos de contenido definidos en mime.types influyen en si el navegador intenta visualizar o descargar el archivo. Modificar este archivo permite controlar qué extensiones se muestran como texto o binario.

Módulo de Estado y Monitoreo

El módulo ngx_http_stub_status_module proporciona métricas básicas sobre conexiones activas, procesamiento y solicitudes. Ideal para integración con herramientas de monitorización externa.

location /metrics {
    stub_status on;
    access_log off;
    allow 10.0.0.0/24;         # Solo subred de monitores
    deny all;
}

Interpretación de las métricas clave:

  • Active connections: Número total de conexiones TCP actualmente abiertas.
  • accepts/handled: Contadores acumulados de conexiones aceptadas y procesadas.
  • requests: Total de peticiones HTTP recibidas.
  • Reading/Writing/Waiting: Estados internos del ciclo de vida de la conexión entre recepción y respuesta.

Captura de Logs y Depuración

El formato de registros debe adaptarse a las necesidades de aálisis forense o auditoría. Se define usando log_format.

log_format detailed '$remote_addr [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent"';

access_log /var/log/nginx/access.log detailed;

Variables comunes de log:

  • $remote_addr: Dirección IP del cliente.
  • $request: Línea de solicitud completa (método + URI).
  • $status: Código de respuesta HTTP final.
  • $http_user_agent: Identificación del navegador o bot.

Para errores críticos, el nivel mínimo recomendado suele ser error o warn, dependiendo de la capacidad de almacenamiento en disco.

error_log /var/log/nginx/error.log warn;

Lógica de Coincidencia en Location

La selectividad de rutas depende del orden y tipo de prefijo utilizado. La prioridad se resuelve según la siguiente jerarquía:

  1. Exact Match (=): Coincidencia perfecta (prioridad alta).
  2. Prefijo (^~): Coincidencia de ruta física, detiene búsqueda regular expresiones.
  3. RegEx (~, ~*): Coincidencia mediante patrones regulares (opcional o case-insensitive).
  4. Prefijo Genérico (/): Atrapa cualquier ruta restante.

Ejemplo práctico de definición estratificada:

location = /login {
    return 302 /portal/login.html;
}

location ^~ /images/ {
    root /var/www/media;
}

location ~* \.(css|js)$ {
    expires 30d;
}

location / {
    proxy_pass http://backend_app:8080;
}

Redirecciones y Reescritura

El módulo ngx_http_rewrite_module permite modificar URLs entrantes. Es vital para migraciones SEO y corrección de cadenas obsoletas.

server {
    listen 80;
    server_name app-v1.corp.net;

    rewrite ^/(.*) http://app-v2.corp.net/$1 permanent;
}

server {
    listen 80;
    server_name app-v2.corp.net;
    
    location / {
        root /var/www/v2;
        index index.html;
    }
}

Flags de comportamiento:

  • permanent: Respuesta 301 (Redirección permanente, cacheable).
  • redirect: Respuesta 302 (Redirección temporal).
  • Last: Detiene procesamiento posterior de reglas.

Prevención de bucles infinitos: Al usar condicionales if dentro de sevridores anidados, verifique que la variable $host coincida correctamente para evitar redirecciones recursivas.

Etiquetas: Nginx security-hardening access-control http-modules web-server-config

Publicado el 9-10 09:44