# Modos y niveles

> El modo del WAF decide si las detecciones bloquean o solo se registran; el nivel decide cuántas pruebas necesita una petición para bloquearse.

Dos ajustes controlan el WAF de un sitio: `mode` y `waf_level`. Los dos se pueden fijar para toda la zona o para [un nombre](https://developers.openwaf.dev/es/rules/per-name-settings/).

## Modos

| `mode` | Panel | Qué ocurre |
|---|---|---|
| `active` (por defecto) | Proteger | Las peticiones que llegan al umbral de bloqueo se bloquean con un 403. Los escudos bloquean. |
| `log` | Solo observar | Ni el WAF ni los escudos bloquean: cada detección se registra como evento de seguridad con la acción `log` y la petición sigue hasta el origen. |
| `off` | Apagado | Sin inspección del WAF ni escudos. El límite básico por IP (`rate_limit_rpm`) también se apaga. |

El modo no cambia las reglas por IP y por país, las listas de amenazas, las reglas de límite de peticiones, las reglas de límite por ruta ni la puerta de acceso: se aplican en cualquier modo.

## Niveles

OpenWAF ejecuta OWASP CRS 4.25 con nivel de paranoia 1. Cada regla de CRS que coincide con una petición suma puntos a su **puntuación de anomalía** (crítica 5, error 4, aviso 3, nota 2). El nivel fija la puntuación a partir de la cual se bloquea:

| `waf_level` | Panel | Bloquea con una puntuación CRS de | Uso típico |
|---|---|---|---|
| `off` | Apagado: sin reglas del WAF | — | Desactivar el WAF del sitio, como `mode=off`. |
| `low` | Baja | 15 | Solo ataques evidentes; menos falsos positivos. |
| `medium` (por defecto) | Media (recomendada) | 10 | Equilibrado. |
| `high` | Alta | 5 | La más estricta: una sola coincidencia crítica bloquea. Puede bloquear alguna petición legítima. |

Las reglas propias de OpenWAF (identificadores 10000–19999, como ficheros sensibles, recorrido de rutas o *request smuggling*) describen ataques sin ambigüedad: una crítica bloquea en cualquier nivel. Los parches virtuales de emergencia para CVE nuevos, como la regla 10075 para PHP2Shell, son de este grupo.

> **Consejo**
>
> Cuando se bloquea una petición legítima, añade una [excepción del WAF](https://developers.openwaf.dev/es/waf/waf-exceptions/) para la regla que coincidió en esa ruta. Bajar el nivel debilita todo el sitio.


## Aplicación

`stack` describe la aplicación que hay detrás del nombre: `generic` (por defecto), `wordpress`, `nextjs` o `static`. Hoy solo `wordpress` cambia lo que hace el WAF:

- activa el [escudo de endurecimiento de WordPress](https://developers.openwaf.dev/es/waf/shields/#wordpress-hardening) (identificador 1001);
- la regla 10002 de OpenWAF, que bloquea las rutas de WordPress (`/wp-login.php`, `/wp-admin`, `/wp-includes`, `/wp-content/uploads`, `/xmlrpc.php`) en los sitios que **no** son WordPress, deja de bloquear.

`/wp-config.php` se bloquea en todos los sitios, sean WordPress o no.

## Cambiarlos

**Panel**

Dominio → **Seguridad → Firewall → Protección**: **Modo**, **Sensibilidad del WAF** y **Aplicación**. Usa **Se aplica a** para cambiar un solo nombre.
**CLI**

```sh
openwaf-cloud ctl zones set example.com mode=active waf_level=high stack=wordpress --reason "Sitio WordPress, WAF estricto"
```
**API**

```sh
curl -sS -X PATCH "https://dash.openwaf.dev/v1/orgs/$ORG/zones/example.com/edge" \
  -H "Authorization: Bearer $OPENWAF_TOKEN" \
  -H "X-Change-Reason: Sitio WordPress, WAF estricto" \
  -H "Content-Type: application/json" \
  -d '{"mode": "active", "waf_level": "high", "stack": "wordpress"}'
```
**MCP**

`update_settings` con `{"zone": "example.com", "settings": {"mode": "active", "waf_level": "high", "stack": "wordpress"}, "reason": "…"}`; simula y después confirma.
