
# keenauth_attack_protection

`keenauth_attack_protection` リソースは、環境の攻撃防御設定を管理します。対象は、ブルートフォース、疑わしい IP アドレスの制限、クレデンシャルスタッフィングと攻撃モード、ボット防御、漏えいしたパスワード、サインアップ防御、SMS 不正防止、リスクポリシーです。

## 環境ごとに 1 つのオブジェクト

攻撃防御のオブジェクトは環境ごとに 1 つだけ存在し、常に存在します。リソースはプロバイダー設定ごとに多くても 1 回だけ宣言してください。作成時には現在のオブジェクトを読み取り、設定で変更した内容だけを書き込みます。削除するとステートから取り除かれるだけです。環境の防御設定はそのまま残るため、`destroy` によってセキュリティが黙って緩むことはありません。

## 書いたものだけが管理される

記述を省略した属性やグループは、現在の値を維持します。設定から属性を削除しても、最後の値を維持します。ステートには**有効な値**、つまり API が適用した既定値、セキュリティの下限、プランによる制限が保存されます。そのため、プランをダウングレードすると次の `plan` で変更として表示されます。`suspicious_ip_throttling.allowlist` や `sms_protection.allowed_countries` などのリストは集合として扱われるため、順序は関係ありません。

```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
  }
}
```

## グループ

| 属性 | 制御する内容 |
|---|---|
| `brute_force` | サインイン失敗後のユーザーごとのロック: モード、ロックまでの失敗回数、集計期間、ロック時間、ユーザーのメールアドレス。 |
| `suspicious_ip_throttling` | サインイン失敗とサインアップ失敗に対する IP ごとの上限、および対象外となる CIDR 許可リスト。 |
| `credential_stuffing` | クレデンシャルスタッフィングの検知モードと攻撃モード(自動開始、継続時間)。 |
| `bot_protection` | ボットチャレンジのモード(`off`、`risk_based`、`always`)とプロバイダー。 |
| `breached_password` | サインアップ、パスワード変更、サインイン時に漏えいしたパスワードが使われた場合の動作。 |
| `signup_protection` | 使い捨てメールアドレス、`+` のサブアドレス、30 日間のデバイスごとのサインアップ数。 |
| `sms_protection` | SMS の送信先として許可する国、1 日の上限、コンバージョンのブレーカー。 |
| `risk_policy` | リスクモード、チャレンジとブロックのしきい値、新しいデバイスの通知。 |

## セキュリティの下限とプランによる制限

- セキュリティの下限を下回る値(ロックまでの失敗が 100 回超、ロックが 5 分未満、IP ごとの 1 時間あたりのサインアップが 20 回超)は、plan の時点で拒否されます。`breached_password.on_signup` と `on_password_change` のブロック設定も下限です。
- `risk_policy.block_threshold` は `risk_policy.challenge_threshold` より大きくなければなりません。
- `risk_policy.mode = "enforce"` には Startup 以上のプランが必要です。それ以外の場合、API は `403 plan_feature_unavailable` を返します。
- `block_threshold` と `daily_cap` は、無効な間はステートで `null` になります。一度設定すると、設定ではそれを無効にできません。無効化するにはダッシュボードまたは管理 API を使用してください。
- 許可リストのエントリは `203.0.113.0/24` のような正規のネットワークアドレスです。/8 より広い IPv4 プレフィックスと /32 より広い IPv6 プレフィックスは拒否されます。

## 安全な変更

- 更新は、変更されたフィールドだけを `If-Match` 付きの JSON merge patch として送信します。plan の作成後に誰かがオブジェクトを変更していた場合、API は `412` を返し、何も変更されません。`plan` を再実行してください。
- ダッシュボードでの変更は次の `plan` にドリフトとして表示され、管理対象の属性について `apply` で元に戻されます。
- 有効なロックと攻撃モードは設定ではなく操作です。これらにはダッシュボードまたは管理 API(`/v1/attack-protection/lockouts` と `/v1/attack-protection/attack-mode`)を使用してください。

## インポート

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