
# keenauth_attack_protection

El recurso `keenauth_attack_protection` gestiona los ajustes de protección frente a ataques del entorno: fuerza bruta, limitación de IP sospechosas, credential stuffing y modo de ataque, protección frente a bots, contraseñas filtradas, protección del registro, protección frente al fraude por SMS y política de riesgo.

## Un objeto por entorno

El objeto de protección frente a ataques existe una sola vez por entorno y siempre está presente. Declara el recurso como máximo una vez por configuración del proveedor. Al crearlo, el recurso lee el objeto actual y escribe solo lo que cambia tu configuración. Destruirlo solo lo elimina del estado; el entorno conserva sus ajustes de protección, así que un `destroy` nunca reduce la seguridad en silencio.

## Solo se gestiona lo que escribes

Un atributo o un grupo que omites conserva su valor actual. Quitar un atributo de la configuración conserva su último valor. El estado guarda los valores **efectivos**, es decir, los valores predeterminados, los mínimos de seguridad y las restricciones de plan que aplicó la API, así que un plan rebajado aparece como un cambio en el siguiente `plan`. Las listas como `suspicious_ip_throttling.allowlist` y `sms_protection.allowed_countries` son conjuntos, por lo que su orden no importa.

```terraform
resource "keenauth_attack_protection" "this" {
  brute_force = {
    max_failures = 10
    lock_minutes = 30
  }

  suspicious_ip_throttling = {
    allowlist = ["203.0.113.0/24"]
  }

  sms_protection = {
    allowed_countries = ["DE", "TR"]
    daily_cap         = 500
  }

  risk_policy = {
    mode                = "enforce"
    challenge_threshold = 5
    block_threshold     = 8
  }
}
```

## Grupos

| Atributo | Qué controla |
|---|---|
| `brute_force` | Bloqueo por usuario tras inicios de sesión fallidos: modo, fallos antes de un bloqueo, ventana de conteo, duración del bloqueo, correo electrónico del usuario. |
| `suspicious_ip_throttling` | Límites por IP para inicios de sesión y registros fallidos, y la lista de permitidos CIDR que queda exenta. |
| `credential_stuffing` | Modo de detección de credential stuffing y modo de ataque (inicio automático, duración). |
| `bot_protection` | Modo del desafío anti-bots (`off`, `risk_based`, `always`) y proveedor. |
| `breached_password` | Qué ocurre cuando se usa una contraseña filtrada al registrarse, al cambiarla y al iniciar sesión. |
| `signup_protection` | Correos desechables, subdirecciones con `+` y registros por dispositivo en 30 días. |
| `sms_protection` | Países a los que se pueden enviar SMS, límite diario y cortacircuitos de conversión. |
| `risk_policy` | Modo de riesgo, umbrales de desafío y de bloqueo, notificación de nuevo dispositivo. |

## Mínimos de seguridad y restricciones de plan

- Los valores por debajo de un mínimo de seguridad (más de 100 intentos fallidos antes de un bloqueo, un bloqueo de menos de 5 minutos, más de 20 registros por IP y hora) se rechazan ya en el plan. Las opciones bloqueantes de `breached_password.on_signup` y `on_password_change` también son mínimos.
- `risk_policy.block_threshold` debe ser mayor que `risk_policy.challenge_threshold`.
- `risk_policy.mode = "enforce"` requiere el plan Startup o superior; de lo contrario, la API responde `403 plan_feature_unavailable`.
- `block_threshold` y `daily_cap` son `null` en el estado mientras están desactivados. Una vez establecidos, la configuración ya no puede desactivarlos; para eso usa el panel o la API de gestión.
- Las entradas de la lista de permitidos son direcciones de red canónicas como `203.0.113.0/24`. Se rechazan los prefijos IPv4 más amplios que /8 y los prefijos IPv6 más amplios que /32.

## Cambios seguros

- Una actualización envía solo los campos modificados como JSON merge patch con `If-Match`. Si alguien cambió el objeto después de crear el plan, la API responde `412` y nada cambia. Ejecuta `plan` de nuevo.
- Un cambio hecho en el panel aparece en el siguiente `plan` como deriva, y `apply` lo revierte para los atributos que gestionas.
- Los bloqueos activos y el modo de ataque son operaciones, no configuración: usa para ellos el panel o la API de gestión (`/v1/attack-protection/lockouts` y `/v1/attack-protection/attack-mode`).

## Importación

```shell
tofu import keenauth_attack_protection.this attack-protection
```
