🧯 Реагирование на инцидент (Incident Response)
Короткий план на случай отказа/компрометации/утечки. Приоритет - защита денег и данных клиентов и быстрое восстановление. Все инциденты фиксируются в
capital-support. Матрица отказов - вАрхитектура Capital v1.0.md §9.
Порядок действий (всегда)
- 🛑 Изоляция - остановить распространение (снять трафик/сервис, отозвать доступ, заблокировать источник).
- 🔎 Оценка - что затронуто (деньги? данные клиентов? доступ?), радиус, когда началось.
- 🩹 Восстановление - вернуть рабочее состояние (rollback / restore / DR - см.
runbooks/rollback.md). - 📝 Пост-мортем - root cause, что предотвратит повтор, запись в
capital-support. - 📣 Уведомления - клиентам/партнёрам/регулятору, если задело их (по политике).
Матрица отказов (кратко)
| Отказ | Клиент видит | Действия | Время |
|---|---|---|---|
| capital-prod умер | страница тех-работ (CF) | DR: новый сервер + restore + перевод tunnel | ≤ 2-4 ч |
| Данные повреждены | тех-работы | PITR на момент до сбоя | ≤ 2-4 ч, потеря ≤ 5 мин |
| Cloudflare упал | недоступность | status-page вне CF; ждём CF | по CF |
| Rail-партнёр (Papaya) упал | «платёж в обработке» | очередь/ретраи, алерт | авто |
| NS Cards упал | «операция ожидает» | reconcile-джоба | авто |
| SumSub упал | заявка сохранена | ретраи вебхуков | авто |
| Resend упал | письмо позже | email-очередь | авто |
| ops-сервер умер | ничего (prod живёт) | пересоздать по ранбуку | ≤ 1 день |
🔐 Если секрет/токен утёк
По правилу группы secrets-never-through-chat:
1. Оценить радиус - что токен реально может (часто отзыв не срочен).
2. Отозвать/удалить у провайдера (не «прислать новый в чат»).
3. Новый секрет доставить на сервер мимо чата (оператор read -s server-side).
4. Claude ссылается только на ИМЯ переменной, значение не печатает/не логирует.
🚨 Урок: забытый сервис в интернете (messenger-подобные инциденты)
15.09.2026 при hardening-аудите team-nextcloud найден забытый lumera-stage
(6 контейнеров, 2 мес в интернете на 18000/18001/18080 в обход ufw - Docker
публикует порты минуя ufw). Погашен docker compose stop (данные целы), ufw-правила
18xxx-Anywhere удалены.
Выводы (в чеклист аудита):
- Docker публикует порты в обход ufw - проверять реально открытое: ss -tlnp +
docker ps --format '{{.Ports}}', а не только ufw status.
- Полная инвентаризация серверов - через API каждого провайдера, не по
~/.ssh/config (неполный список = слепые зоны = незахарденённый прод).
- Любой app-порт наружу - только через 127.0.0.1 + Cloudflare tunnel, никогда 0.0.0.0.
Мониторинг = раннее обнаружение
- uptime-check (capital-ops, cron */5): 3 домена → Telegram «Neo Infra Alerts», анти-спам 30 мин + recovery-нотис.
- Uptime Kuma (capital-ops, tailnet-only
http://100.93.23.99:3001) - UI для CEO. - File-integrity cron */10 - алерт при изменении ключевых файлов.
- Целевое: Netdata + Sentry + Healthchecks.io (бэкап-джобы: отсутствие сигнала = тревога).
Что где
| Нужно | Куда |
|---|---|
| Откатить релиз/данные | runbooks/rollback.md |
| Восстановить БД | runbooks/backup-restore.md, deploy/pgbackrest/README.md |
| Захарденить/проверить сервер | runbooks/hardening-server.md |
| Записать инцидент | репозиторий capital-support |