← [Раздел 05](README.md) · [Главная](../README.md)

# Threat modeling (lite)

## Цель

Научиться делать **упрощённый threat model** для типичного веб-сервиса: определить активы, границы доверия, угрозы и меры — без академической перегрузки.

## Предварительно

- [shift-left.md](shift-left.md) — понимаете, зачем думать о безопасности на этапе design.
- Базово: HTTP, API, база данных, пользователь с браузером.

## Время

~30 минут чтения + 45 минут на упражнение с диаграммой

---

## Что такое threat modeling

**Threat modeling** — структурированный способ ответить на вопросы:

- **Что** мы защищаем (активы)?
- **Кто** может атаковать (угрозы)?
- **Как** они могут это сделать (attack vectors)?
- **Что** мы делаем против этого (controls)?

Это не pentest и не сканер — это **мышление на бумаге/доске** до или параллельно с кодом.

## Когда делать

| Ситуация | Нужен threat model? |
|----------|---------------------|
| Новый сервис с PII/платежами | Да, обязательно |
| Новый API endpoint с auth | Да |
| Косметический текст на лендинге | Минимально |
| Крупное изменение архитектуры | Да, обновить существующий |

## Метод STRIDE (упрощённо)

STRIDE — мнемоника категорий угроз от Microsoft:

| Буква | Категория | Пример вопроса |
|-------|-----------|----------------|
| **S** | Spoofing (подмена) | Можно ли выдать себя за другого пользователя? |
| **T** | Tampering (изменение) | Можно ли подменить данные в transit/at rest? |
| **R** | Repudiation (отказ) | Можно ли отрицать действие без логов? |
| **I** | Information disclosure | Утечёт ли лишнее в ответе API? |
| **D** | Denial of service | Можно ли положить сервис дешёвыми запросами? |
| **E** | Elevation of privilege | Может ли user стать admin через баг? |

Не нужно помнить все буквы наизусть — используйте как **чеклист вопросов**.

## Шаги lite threat model (5 шагов)

### 1. Нарисовать границы (Data Flow Diagram)

Минимум: **Client → Load Balancer → App → Database**.

```
[Browser] ──HTTPS──► [API Gateway] ──► [App Pod] ──► [PostgreSQL]
                           │
                           └──► [Redis cache]
```

Пометьте **trust boundaries** (линии, где меняется уровень доверия): интернет ↔ DMZ ↔ internal.

### 2. Перечислить активы

| Актив | Почему ценен |
|-------|--------------|
| JWT / session tokens | Доступ к аккаунтам |
| PII (email, телефон) | GDPR, репутация |
| Database credentials | Полный компромисс данных |
| Admin API | Управление системой |

### 3. Список угроз (top threats)

Для каждой границы — 1–3 сценария. Пример для `/api/login`:

| ID | Угроза | STRIDE |
|----|--------|--------|
| T1 | Brute force пароля | D |
| T2 | Credential stuffing | S |
| T3 | Утечка stack trace в ошибке | I |

### 4. Оценка риска (простая матрица)

**Risk = Likelihood × Impact** (низкий / средний / высокий — без формул).

| Угроза | Impact | Likelihood | Risk | Приоритет |
|--------|--------|------------|------|-----------|
| T1 | Высокий | Высокий | **Critical** | 1 |
| T3 | Средний | Средний | Medium | 3 |

### 5. Controls (меры)

| Угроза | Мера | Где реализуется |
|--------|------|-----------------|
| T1 | Rate limit, CAPTCHA после N попыток | API Gateway / App |
| T2 | MFA, breach password check | Auth service |
| T3 | Generic error messages, no debug in prod | App config |

Controls превращайте в **security requirements** → [bezopasnye-trebovaniya.md](bezopasnye-trebovaniya.md).

## Шаблон документа threat model

```markdown
# Threat Model: Сервис «example-auth»

## Scope
- In: REST API auth, web login
- Out: Mobile app v1 (отдельный TM)

## Diagram
(ссылка на draw.io / Excalidraw)

## Assets
- ...

## Threats & Controls
| ID | Threat | Control | Owner | Status |
|----|--------|---------|-------|--------|

## Open questions
- Нужен ли IP allowlist для admin?
```

## Частые ошибки новичков

| Ошибка | Как лучше |
|--------|-----------|
| Слишком детальная диаграмма | 5–7 блоков достаточно для v1 |
| Threat model «один раз навсегда» | Пересмотр при каждом major change |
| Только технические угрозы | Учитывать insider, misconfiguration |
| Controls без owner | Каждая мера — ответственный и срок |

## Инструменты (опционально)

| Инструмент | Назначение |
|------------|------------|
| OWASP Threat Dragon | Диаграммы + threats |
| Microsoft Threat Modeling Tool | Классика STRIDE |
| Excalidraw / Miro | Быстрые схемы на воркшопе |

Инструмент не обязателen — важнее **регулярная практика**.

## Упражнение

Возьмите воображаемый «сервис записи на мероприятие»:

1. Нарисуйте DFD из 4 блоков.
2. Запишите 5 активов.
3. Примените STRIDE — минимум 6 угроз.
4. Для top-3 угроз опишите control и этап SDLC, где её проверить.

---

## Самопроверка

1. Чем threat model отличается от DAST?
2. Что такое trust boundary? Приведите пример.
3. Назовите две категории STRIDE и типичную угрозу для API.
4. Когда threat model устаревает и его нужно обновить?

## Дальше

[Безопасные требования](bezopasnye-trebovaniya.md) — переводим угрозы в проверяемые требования.
