
# Einstellungen des Angriffsschutzes abrufen

`GET /v1/attack-protection` · Berechtigung `attack-protection:read`

Gibt das Angriffsschutz-Objekt der Umgebung zurück: Brute-Force-Schutz, Drosselung verdächtiger IPs, Credential Stuffing, Bot-Schutz, kompromittierte Passwörter, Schutz bei der Registrierung, SMS-Schutz und Risikorichtlinie. Jeder Abschnitt hat zwei Ansichten: `configured` ist der von Ihnen geschriebene Wert, `effective` ist der gültige Wert, auf den Standardwerte, die Sicherheitsuntergrenze und Ihr Tarif angewendet wurden. Ein nie geschriebener Abschnitt hat `configured: {}`. Der Antwort-Header `ETag` kennzeichnet den Inhalt des Objekts; senden Sie ihn als `If-Match` bei `PUT` und `PATCH`.

## Anfrage

Diese Operation hat keine Pfad-, Abfrage- oder Body-Felder. Die Umgebung ergibt sich aus den Anmeldedaten.

## Antwort

`200 OK` mit dem Objekt und dem Header `ETag`.

```json
{
  "schema_version": 1,
  "brute_force": {
    "configured": {"max_failures": 10},
    "effective": {"mode": "enforce", "max_failures": 10, "window_minutes": 15, "lock_minutes": 15, "notify_user": true}
  },
  "risk_policy": {
    "configured": {"mode": "enforce"},
    "effective": {"mode": "log", "challenge_threshold": 4, "block_threshold": null, "notify_user_on_new_device": true}
  },
  "bot_protection": {
    "configured": {},
    "effective": {"mode": "risk_based", "provider": "altcha"}
  }
}
```

Das Beispiel ist gekürzt: Jede Antwort enthält alle acht Abschnitte (`brute_force`, `suspicious_ip_throttling`, `credential_stuffing`, `bot_protection`, `breached_password`, `signup_protection`, `sms_protection`, `risk_policy`). Im Beispiel umfasst der Tarif die Risikodurchsetzung nicht mehr; das konfigurierte `enforce` bleibt erhalten, wird aber als `log` angezeigt.

## Felder

| Feld | Typ | Bereich oder Werte | Standard | Untergrenze |
|---|---|---|---|---|
| `brute_force.mode` | Text | `log`, `enforce` | `enforce` | |
| `brute_force.max_failures` | Ganzzahl | 5-100 | 20 | höchstens 100 |
| `brute_force.window_minutes` | Ganzzahl | 5-60 | 15 | |
| `brute_force.lock_minutes` | Ganzzahl | 5-60 | 15 | mindestens 5 |
| `brute_force.notify_user` | Wahrheitswert | | `true` | |
| `suspicious_ip_throttling.mode` | Text | `log`, `enforce` | `enforce` | |
| `suspicious_ip_throttling.login_failures_per_ip_per_day` | Ganzzahl | 10-10000 | 100 | |
| `suspicious_ip_throttling.signups_per_ip_per_hour` | Ganzzahl | 1-20 | 20 | höchstens 20 |
| `suspicious_ip_throttling.allowlist` | Textliste | bis zu 100 CIDR-Präfixe; IPv4 nicht breiter als /8, IPv6 nicht breiter als /32 | `[]` | |
| `credential_stuffing.mode` | Text | `log`, `enforce` | `enforce` | |
| `credential_stuffing.attack_mode_auto` | Wahrheitswert | | `true` | |
| `credential_stuffing.attack_mode_duration_minutes` | Ganzzahl | 15-240 | 30 | |
| `bot_protection.mode` | Text | `off`, `risk_based`, `always` | `risk_based` | |
| `bot_protection.provider` | Text | `altcha` | `altcha` | |
| `breached_password.on_signup` | Text | `block` | `block` | `block` |
| `breached_password.on_password_change` | Text | `block` | `block` | `block` |
| `breached_password.on_login` | Text | `require_reset`, `notify` | `require_reset` | |
| `breached_password.notify_user` | Wahrheitswert | | `true` | |
| `signup_protection.block_disposable_email` | Wahrheitswert | | `true` | |
| `signup_protection.block_email_subaddress` | Wahrheitswert | | `false` | |
| `signup_protection.max_signups_per_device_30d` | Ganzzahl | 1-50 | 3 | |
| `sms_protection.allowed_countries` | Textliste | bis zu 250 ISO-3166-1-Alpha-2-Codes | `[]` (Tarifstandard) | |
| `sms_protection.daily_cap` | Ganzzahl \| null | 1-1000000; `null` ist der Tarifwert | `null` | |
| `sms_protection.conversion_breaker` | Wahrheitswert | | `true` | `true` |
| `risk_policy.mode` | Text | `log`, `enforce` (`enforce` erfordert den Tarif Startup oder höher) | `log` | |
| `risk_policy.challenge_threshold` | Ganzzahl | 3-8 | 4 | |
| `risk_policy.block_threshold` | Ganzzahl \| null | 6-12, größer als `challenge_threshold`; `null` ist aus | `null` | |
| `risk_policy.notify_user_on_new_device` | Wahrheitswert | | `true` | |

## Fehler

| HTTP | Code | Wann |
|---|---|---|
| 401 | `unauthenticated` | Die Anmeldedaten fehlen, sind ungültig oder widerrufen. |
| 403 | `insufficient_permissions` | Den Anmeldedaten fehlt die erforderliche Berechtigung. |
| 429 | `rate_limited` | Das Ratenlimit wurde überschritten; nach der Zeit aus `Retry-After` erneut versuchen. |
| 503 | `service_unavailable` | Eine Abhängigkeit ist vorübergehend nicht verfügbar; nach der Zeit aus `Retry-After` erneut versuchen. |

## Beispiel

```bash
curl https://api.eu.keenauth.com/v1/attack-protection \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
```
