('

Solo permite los métodos HTTP autorizados: corta las peticiones ruidosas con 405/444 en Nginx

\n

Al monitorear los logs de una aplicación web en producción, a veces aparece algo inesperado.

\n
    \n
  • Pensaba que solo usaba GET / POST / PUT / DELETE
  • \n
  • En los logs aparece un método que nunca había visto
  • \n
\n

Por ejemplo, PROPFIND, un método WebDAV, aparece en el registro. La aplicación lo tratará como “método no soportado”, pero lo importante es:

\n

¿Realmente necesitamos que una aplicación que ya hace su trabajo maneje peticiones ruidosas? La respuesta suele ser “no”. Por eso es limpio permitir solo los métodos autorizados y cortar el resto en Nginx.

\n
\n

¿Por qué bloquearlo en Nginx?

\n

Se puede hacer a nivel de aplicación, pero cuando la petición llega a la app ya se incurre en costos.

\n
    \n
  • Entrada a WSGI/ASGI
  • \n
  • Middleware, logging, autenticación se ejecutan parcialmente
  • \n
  • Los logs de la app se ensucian y ocultan problemas reales
  • \n
  • Con mucho tráfico, el sobrecosto se acumula
  • \n
\n

Al bloquearlo en Nginx:

\n
    \n
  • Cierre inmediato en la capa más externa → mínimo costo
  • \n
  • Logs de la app más limpios → más fácil operación
  • \n
  • Superficie de ataque reducida → se eliminan métodos innecesarios
  • \n
\n

En una frase:

\n
\n

La app crea el producto, Nginx actúa como guardia.

\n
\n
\n

Los métodos extraños en los logs suelen ser “no tráfico normal”

\n

PROPFIND es un caso típico.

\n
    \n
  • Escaneo rápido para ver si WebDAV está habilitado
  • \n
  • Si PUT/MKCOL está abierto, intentan avanzar al siguiente nivel
  • \n
  • A veces el User‑Agent está vacío o se envía con HTTP/1.0 de forma improvisada
  • \n
\n

El punto clave es:

\n

Si nuestro servicio no usa ese método, es casi seguro que no sea tráfico legítimo. No tiene sentido enviarlo a la app y responder amablemente.

\n
\n

La estrategia es simple: operar con una lista blanca (Allowlist)

\n

Imagen de un guardia de seguridad de Nginx gestionando la entrada

\n

El principio es “abrir solo lo necesario y cerrar el resto”.

\n
    \n
  • Páginas web estáticas: normalmente GET y HEAD son suficientes
  • \n
  • API: permitir POST/PUT/PATCH/DELETE solo en los endpoints que lo requieran
  • \n
\n

Y cualquier otro método (por ejemplo, PROPFIND, MKCOL, LOCK) que no usemos, bloqueamos. Es la forma más sencilla de operar.

\n
\n

405 vs 444: ¿qué respuesta usar?

\n

Hay dos formas principales de bloquear.

\n

1) 405 Method Not Allowed

\n
    \n
  • Estándar y fácil de entender
  • \n
  • Informa claramente a un cliente legítimo que el método no está permitido
  • \n
\n

2) 444 (solo de Nginx: cerrar la conexión sin respuesta)

\n
    \n
  • Cierra sin decir nada
  • \n
  • Da menos pistas a escáneres/bots
  • \n
  • Operativamente silencioso y limpio (“ocultamos el ruido”)
  • \n
\n

En la práctica se suele combinar:

\n
    \n
  • Métodos sin sentido en la web pública: 444
  • \n
  • Clientes legítimos que pueden cometer errores: 405
  • \n
\n
\n

Ejemplo de configuración de Nginx: “cortar fuera de los métodos permitidos” – 2 patrones

\n

A continuación se presentan ejemplos listos para copiar y pegar.

\n

Patrón A) GET/HEAD por defecto, API con métodos adicionales

\n
server {\n    # ... listen/server_name etc ...\n\n    # 1) Por defecto: web/estáticos solo GET/HEAD\n    location / {\n        if ($request_method !~ ^(GET|HEAD)$) { return 444; }  # o 405\n        proxy_pass http://app;\n    }\n\n    # 2) API: solo los métodos necesarios\n    location /api/ {\n        if ($request_method !~ ^(GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS)$) { return 444; }\n        proxy_pass http://app;\n    }\n}\n
\n
    \n
  • / suele ser suficiente con GET/HEAD para la visualización de páginas.
  • \n
  • /api/ necesita OPTIONS por CORS.
  • \n
\n

Patrón B) Bloquear explícitamente “métodos extraños” (inicio ligero)

\n
location / {\n    if ($request_method ~ ^(PROPFIND|PROPPATCH|MKCOL|COPY|MOVE|LOCK|UNLOCK)$) { return 444; }\n    proxy_pass http://app;\n}\n
\n
    \n
  • Elimina los métodos ruidosos que vemos en producción.
  • \n
  • A largo plazo, el patrón A (Allowlist) es más seguro y fácil de mantener.
  • \n
\n
\n

Nota: aunque if en Nginx puede ser peligroso si se abusa, en este caso de “retorno inmediato” es bastante común. Si prefieres algo más estricto, puedes usar limit_except.

\n
\n
\n

Conclusión: “solo permite lo autorizado” simplifica la operación

\n

El mensaje es claro.

\n
    \n
  • Los métodos extraños casi nunca son tráfico legítimo
  • \n
  • Enviarlos a la app genera costos y ensucia los logs
  • \n
  • Por eso, en Nginx, deja pasar solo los métodos permitidos y corta el resto con 405/444
  • \n
\n

Aplicar este patrón trae:

\n
    \n
  • Menos consumo de recursos en la app
  • \n
  • Logs más limpios
  • \n
  • Operación más sencilla
  • \n
', '/media/editor_temp/6/e09dd4fc-f987-43bf-b38f-9ac6c4c594f6.png')