From 8a8b860c61df2415f7c080fa824cb9601ec0d4a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Fri, 22 May 2026 08:15:20 +0300 Subject: [PATCH] =?UTF-8?q?docs(pilot):=20=D0=9F=D0=98=D0=9B=D0=9E=D0=A2.m?= =?UTF-8?q?d=20=C2=A74=20=E2=80=94=20WAF=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B2?= =?UTF-8?q?=D0=B5=D0=B4=D1=91=D0=BD=20=D0=B2=20=D0=B1=D0=BE=D0=B5=D0=B2?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=20(=D0=B1=D0=BB?= =?UTF-8?q?=D0=BE=D0=BA=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0)=20+=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2?= =?UTF-8?q?=D0=B5=D0=B1=D1=85=D1=83=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- ПИЛОТ.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/ПИЛОТ.md b/ПИЛОТ.md index ccffbb43..3d4cc599 100644 --- a/ПИЛОТ.md +++ b/ПИЛОТ.md @@ -8,7 +8,7 @@ - Волатильную часть (доступ, версии, что развёрнуто) перед рискованными действиями **перепроверять реальной командой по SSH**, не доверять снимку вслепую. - Обновляется по команде заказчика **«обнови пилот»**. -**Снимок снят:** 22.05.2026 — развёрнут серверный слой безопасности (HTTPS, fail2ban, бэкапы, мониторинг, WAF) + расширения БД pg_audit/pg_anonymizer + Lockbox-хранилище секретов; **APP_URL переведён на `https://liderra.ru`** + SANCTUM-домены; **настроена фирменная исходящая почта `verify@liderra.ru`** (Яндекс 360 — §7). +**Снимок снят:** 22.05.2026 — развёрнут серверный слой безопасности (HTTPS, fail2ban, бэкапы, мониторинг, **WAF в режиме блокировки**) + расширения БД pg_audit/pg_anonymizer + Lockbox-хранилище секретов; **APP_URL переведён на `https://liderra.ru`** + SANCTUM-домены; **настроена фирменная исходящая почта `verify@liderra.ru`** (Яндекс 360 — §7). --- @@ -39,7 +39,7 @@ - **SEC-6 HTTPS** ✅ — Let's Encrypt `liderra.ru`+`www` (истекает 2026-08-20, авто-обновление certbot). nginx 2 блока: :80 редиректит на https **кроме** `/.well-known/acme-challenge/` и `/api/webhook/`; :443 — приложение. Заголовки: `HSTS max-age=604800`, `X-Frame-Options SAMEORIGIN`, `X-Content-Type-Options nosniff`, `Referrer-Policy`. **CSP — не задан** (отложен, рискован для Vue; делать в Report-Only). - **SEC-2 анти-перебор** ✅ — прикладной throttle логина (5 попыток, лок по email+IP) + **fail2ban** (`/etc/fail2ban/jail.local`: jails `sshd` + `nginx-http-auth`, bantime 1h). NB: ~1400 неудачных SSH-попыток/сутки — fail2ban банит. - **SEC-4 мониторинг** ✅ (лёгкий) — `/usr/local/bin/liderra-security-report.sh` cron ежедневно 07:00 → `/var/log/liderra-security-report.log` (диск/память/срок сертификата/баны/неудачные входы/5xx/401/БД). **Sentry — отложен** (2 ГБ RAM мало). Email-алертинг теперь возможен (исходящая почта появилась — §7); Telegram — нет. -- **SEC-1 WAF** ✅ (наблюдение) — ModSecurity + OWASP CRS 3.3.5 (**1828 правил**), режим **DetectionOnly** (логирует, не блокирует). Конфиг `/etc/modsecurity/modsecurity.conf` + `/etc/nginx/modsec/main.conf` (не `owasp-crs.load` — Apache-`IncludeOptional` несовместим с nginx-коннектором). Audit-лог `/var/log/modsec_audit.log`. **Перевод в блокировку** (`SecRuleEngine On`) — после анализа false-positive (особенно webhook-payload). +- **SEC-1 WAF** ✅ **боевой режим** (`SecRuleEngine On`, с 22.05) — ModSecurity + OWASP CRS 3.3.5 (**1830 правил**), **блокирует атаки** (HTTP 403). Конфиг `/etc/modsecurity/modsecurity.conf` + `/etc/nginx/modsec/main.conf` (не `owasp-crs.load` — Apache-`IncludeOptional` несовместим с nginx-коннектором). Audit-лог `/var/log/modsec_audit.log`. **Приём лидов защищён от ложных блокировок:** вебхук `/api/webhook/` выведен в наблюдение отдельным правилом `id:1900100` в `/etc/nginx/modsec/liderra-exclusions.conf` (вне пакета CRS → переживает обновления) — endpoint и так под HMAC+rate-limit+SSRF-guard, ложное срабатывание ≠ потерянный лид. Проверено: обычная страница → 401 (не WAF), сканер `/.env` и XSS → 403 (блок), атака на пути вебхука → не блокируется. Бэкапы конфигов `*.bak-20260522-044130`, reload без простоя. **Контроль FP:** периодически `sudo grep "Access denied" /var/log/modsec_audit.log`. - **SEC-5 Lockbox** ✅ (хранилище заведено) — см. §5. **App-интеграция не сделана** (приложение читает секреты из файла + `.env`; реальная польза — после доработки). - **SEC-3 DDoS** ⏸ отложен — базовая сетевая защита YC бесплатна и активна; продвинутая платная (подписка + 976 ₽/Мбит/с + смена IP/DNS) — избыточна. Альтернатива: бесплатный Cloudflare перед сайтом. - **SEC-7 бэкапы + IR** — бэкапы есть (§3); регламент реагирования на инцидент (IR-runbook) — позже. @@ -55,13 +55,12 @@ ## 6. Отложено / следующие шаги 1. **Lockbox app-интеграция:** приложение читает секреты из Lockbox → убрать `/home/ubuntu/liderra-secrets.txt` + секреты из `.env`. Сейчас секреты в двух местах. — приоритет. -2. **WAF → блокировка** (`SecRuleEngine On`) после анализа false-positive по `/var/log/modsec_audit.log`. -3. **CSP-заголовок** (в Report-Only сначала, чтобы не сломать Vue). -4. **Off-site бэкапы** (YC Object Storage) + **email/Telegram-алертинг** мониторинга. -5. **DDoS** — только если появится реальная угроза (Cloudflare free предпочтительнее платного YC). -6. **Sentry** — при апгрейде RAM или отдельным инстансом (Б-1). -7. **`SESSION_SECURE_COOKIE=true`** (опционально — куки только по HTTPS; разлогинит текущие сессии). -8. Sync runbook `docs/deploy/test-server-runbook.md` (ветка feat/test-deploy) с этим состоянием. +2. **CSP-заголовок** (в Report-Only сначала, чтобы не сломать Vue). +3. **Off-site бэкапы** (YC Object Storage) + **email/Telegram-алертинг** мониторинга. +4. **DDoS** — только если появится реальная угроза (Cloudflare free предпочтительнее платного YC). +5. **Sentry** — при апгрейде RAM или отдельным инстансом (Б-1). +6. **`SESSION_SECURE_COOKIE=true`** (опционально — куки только по HTTPS; разлогинит текущие сессии). +7. Sync runbook `docs/deploy/test-server-runbook.md` (ветка feat/test-deploy) с этим состоянием. ## 7. Почта (исходящая, фирменная) @@ -72,6 +71,6 @@ - **Конфиг:** `MAIL_*` в `.env` (host/port/scheme/username/password/`from=verify@liderra.ru`/`from_name=Лидерра`). На боевом сервере при деплое прописать те же `MAIL_*` (пароль ящика — секрет, в git нет; кандидат в Lockbox). - ⚠️ **Фича «регистрация по коду + обязательный телефон»** — в ветке `feat/test-deploy` (`0e31783`), на боевой сервер **кодом ещё НЕ выкачена** (деплой копированием, §2). Письма-коды на проде заработают после деплоя этой версии. -> ✅ Закрыто 22.05: APP_URL → https://liderra.ru + SANCTUM-домены (см. §2); фирменная исходящая почта (см. §7). +> ✅ Закрыто 22.05: APP_URL → https://liderra.ru + SANCTUM-домены (см. §2); фирменная исходящая почта (см. §7); WAF переведён в боевой режим блокировки (см. §4). > > ⚠️ Снимок волатилен. Истина — реальные команды по SSH (`systemctl is-active …`, `nginx -T`, `yc …` при наличии доступа).