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

# Secrets scanning

## Цель

Понять, почему **секреты в git** — критический риск, как работает secrets scanning, и как настроить защиту на pre-commit и в CI без ложного чувства безопасности.

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

- [README раздела 06](README.md).
- Git: commit, history, `.gitignore`.

## Время

~20 минут чтения + 30 минут на настройку demo

---

## Что считается секретом

| Тип | Примеры (плейсхолдеры) |
|-----|------------------------|
| API keys | `YOUR_AWS_ACCESS_KEY`, Stripe `sk_live_...` |
| Tokens | GitHub PAT, JWT signing key |
| Passwords | DB password, admin creds |
| Private keys | SSH, TLS `.pem` |
| Connection strings | `postgres://user:PASS@host/db` |

**Правило:** если злоумышленник знает значение — получает доступ или данные.

## Почему «удалил из последнего commit» недостаточно

Git хранит **историю**. Секрет в commit год назад остаётся в clone/fork/mirror.

| Действие | Эффект |
|----------|--------|
| Delete file + new commit | Секрет всё ещё в history |
| Force push rewrite history | Лучше, но forks/caches остаются |
| **Rotate secret** | Обязательно после любой утечки |

## Где секреты появляются (типично)

- `.env` случайно committed
- Config YAML с production паролем
- Debug log с Authorization header
- Screenshot в README
- Terraform `variable` default = real password ❌

## Как работает scanner

1. **Regex / entropy** — паттерны (`AKIA...`, high-entropy strings)
2. **Vendor signatures** — известные форматы GitHub, Slack, AWS
3. **Git history scan** — весь repo, не только diff
4. **Allowlist** — пометить false positive (осторожно)

## Инструменты (обзор)

| Tool | Где запускать | Особенность |
|------|---------------|-------------|
| **GitLeaks** | CI, local | Популярен, gitleaks.toml allowlist |
| **TruffleHog** | CI | Verified secrets (API check) |
| **detect-secrets** | pre-commit | Baseline file |
| **GitHub Secret Scanning** | Platform | Push protection (GitHub.com) |

Примеры команд (локально, без реальных ключей):

```bash
# GitLeaks — scan repo
gitleaks detect --source . --verbose

# TruffleHog — git mode
trufflehog git file://. --only-verified
```

## Defense in depth: слои

```
Developer machine          CI / Platform
─────────────────          ─────────────
pre-commit hook     →      gitleaks in pipeline
.env.example only   →      block merge on finding
secret manager      →      push protection (GitHub)
```

### Pre-commit (пример flow)

1. Dev пишет код
2. Hook перед commit сканирует staged files
3. Finding → commit отменён, исправить локально

### CI gate

- Scan на каждый PR (включая history для новых branches)
- **Critical:** fail pipeline, no merge
- Отчёт в PR comment (SARIF / markdown)

## Хранение секретов правильно

| ❌ Нельзя | ✅ Можно |
|----------|----------|
| Hardcode в source | Vault, AWS Secrets Manager, K8s Secrets (encrypted etcd) |
| Commit `.env` | `.env.example` с `YOUR_DB_PASSWORD` |
| Share в Slack | One-time link + rotation |

Inject в runtime: env vars из CI secrets / K8s external secrets operator.

## Allowlist и false positives

Пример: тестовый JWT в fixture похож на secret.

| Подход | Риск |
|--------|------|
| `.gitleaksignore` / fingerprint | OK если осознанно |
| «Отключить rule» глобально | Пропустите real leak |
| Commit real-looking test key | Плохая практика |

## Incident: секрет утёк

Чеклист реагирования:

- [ ] **Rotate** секрет немедленно (assume compromised)
- [ ] Revoke old token in provider console
- [ ] Scan logs: использовался ли секрет post-leak
- [ ] Git history: BFG/git filter-repo + force push (с согласованием команды)
- [ ] Post-mortem: как попало, как предотвратить
- [ ] Enable push protection / mandatory scan

## Политика для команды (1 страница)

| Правило | Enforcement |
|---------|-------------|
| No secrets in git | Pre-commit + CI block |
| All prod secrets in vault | Audit quarterly |
| Leak = rotate within 1h | On-call runbook |
| `.env.example` only placeholders | PR review |

---

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

1. Почему rotation важнее «удалить строку из файла»?
2. Чем pre-commit отличается от CI scan?
3. Назовите 3 места, где секреты часто утекают кроме `.env`.
4. Что делать в первые 15 минут после leak AWS key в public repo?

## Дальше

[SCA — сканирование зависимостей](sca-zavisimosti.md)
