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:
- Exact Match (=): Coincidencia perfecta (prioridad alta).
- Prefijo (^~): Coincidencia de ruta física, detiene búsqueda regular expresiones.
- RegEx (~, ~*): Coincidencia mediante patrones regulares (opcional o case-insensitive).
- 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.