From 39e5f2913d575d3871f5dd9a97f7d077ef57860a 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:48:34 +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=20CSP=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(enforcing)=20+?= =?UTF-8?q?=20Google=20Fonts=20allowed,=20verified=20=D0=B2=20=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D1=83=D0=B7=D0=B5=D1=80=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- ПИЛОТ.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ПИЛОТ.md b/ПИЛОТ.md index 2e7bceb1..70e42d95 100644 --- a/ПИЛОТ.md +++ b/ПИЛОТ.md @@ -37,7 +37,7 @@ ## 4. Безопасность (серверный слой, SEC-1..SEC-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** ✅ — `Content-Security-Policy-Report-Only` (режим наблюдения, **не блокирует**; `style-src` +`unsafe-inline` для Vuetify, `object-src 'none'`, `frame-ancestors 'self'`). Боевой CSP позже: собрать violations из консоли браузера → сменить заголовок на `Content-Security-Policy`. +- **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** ✅ **боевой режим** — `Content-Security-Policy` (блокирует внедрение чужого кода: `script-src 'self'`, `object-src 'none'`; `style-src +'unsafe-inline'` для Vuetify + `https://fonts.googleapis.com`; `font-src` + `https://fonts.gstatic.com` для Google Fonts; `img-src 'self' data: https:`; `connect-src 'self'`; `frame-ancestors/base-uri/form-action 'self'`). Проверено в браузере на живом `/login`: 0 ошибок CSP, шрифты грузятся (googleapis/gstatic → 200), приложение работает. Бэкап `liderra.bak-20260522-054524`, reload без простоя. - **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/блокировки WAF/БД). **Email-алертинг** ✅ — отчёт ежедневно шлётся на `kdv1@bk.ru` (`/usr/local/bin/liderra-mail.py`, SMTP из §7, пароль не печатается; при первой доставке возможно «Спам»). **Sentry — отложен** (2 ГБ RAM мало); Telegram — нет. - **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`. @@ -59,7 +59,7 @@ 2. **DDoS** — только если появится реальная угроза (Cloudflare free предпочтительнее платного YC). 3. **Sentry** — при апгрейде RAM или отдельным инстансом (Б-1). 4. **`SESSION_SECURE_COOKIE=true`** (опционально — куки только по HTTPS; разлогинит текущие сессии). -5. **Боевой CSP** — после анализа violations Report-Only сменить заголовок на `Content-Security-Policy` (опц. report-uri в Laravel). +5. **Усилить CSP** — убрать `'unsafe-inline'` из `style-src` (нужны nonce для Vuetify; нетривиально) + сузить `img-src` после аудита authed-страниц. 6. **Off-site → YC Object Storage** — заменить промежуточный email-бэкап на бакет (после сервис-аккаунта). 7. Sync runbook `docs/deploy/test-server-runbook.md` (ветка feat/test-deploy) с этим состоянием. @@ -72,6 +72,6 @@ - **Конфиг:** ✅ `MAIL_*` прописаны на боевом сервере 22.05 (`MAIL_MAILER=smtp`, host/port `465`/scheme `smtps`/username/password/`from=verify@liderra.ru`/`from_name=Лидерра`); было `MAIL_MAILER=log` (письма не уходили). Бэкап `.env.bak-*`. Применено через `config:cache`. **Подтверждено живой отправкой** (`SENT_OK` + E2E register/start → 200). Пароль ящика — секрет, в git нет; кандидат в Lockbox. - ✅ **Фича «регистрация по коду + обязательный телефон»** — **выкачена на боевой сервер 22.05** (backend 9 файлов + фронт пересобран `public/build` + `MAIL_*` + config/route cache + queue restart). E2E live: `POST /api/auth/register/start` → 200, код реально уходит на email. Код в ветке `feat/test-deploy` (`0e31783`). -> ✅ Закрыто 22.05: APP_URL → https://liderra.ru + SANCTUM-домены (см. §2); фирменная исходящая почта (см. §7); WAF переведён в боевой режим блокировки (см. §4); CSP Report-Only + email-алертинг отчёта + off-site зашифрованный бэкап на почту (см. §4); **выкачен прикладной код — регистрация по коду+телефон, денежный фикс лимита B1/B2/B3, RLS-фикс admin-impersonation (см. §2)**. +> ✅ Закрыто 22.05: APP_URL → https://liderra.ru + SANCTUM-домены (см. §2); фирменная исходящая почта (см. §7); WAF переведён в боевой режим блокировки (см. §4); CSP в боевом режиме (блокировка) + email-алертинг отчёта + off-site зашифрованный бэкап на почту (см. §4); **выкачен прикладной код — регистрация по коду+телефон, денежный фикс лимита B1/B2/B3, RLS-фикс admin-impersonation (см. §2)**. > > ⚠️ Снимок волатилен. Истина — реальные команды по SSH (`systemctl is-active …`, `nginx -T`, `yc …` при наличии доступа).