
# keenauth_attack_protection

`keenauth_attack_protection` 리소스는 환경의 공격 방어 설정을 관리합니다. 대상은 무차별 대입, 의심스러운 IP 제한, 자격 증명 스터핑과 공격 모드, 봇 방어, 유출된 비밀번호, 가입 방어, SMS 사기 방지, 위험 정책입니다.

## 환경마다 하나의 객체

공격 방어 객체는 환경마다 하나만 존재하며 항상 있습니다. 리소스는 프로바이더 구성마다 최대 한 번만 선언하세요. 생성 시에는 현재 객체를 읽고, 구성이 바꾸는 항목만 기록합니다. 삭제하면 상태에서만 제거됩니다. 환경은 방어 설정을 그대로 유지하므로 `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를 보낼 수 있는 국가, 일일 상한, 전환 차단기. |
| `risk_policy` | 위험 모드, 챌린지와 차단 임곗값, 새 기기 알림. |

## 보안 하한과 요금제 제한

- 보안 하한보다 낮은 값(잠금 전 실패 100회 초과, 5분 미만 잠금, IP별 시간당 가입 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
```
