docs(security): план UFW, hardening HAProxy и бэкендов, скрипты deploy.

This commit is contained in:
PTah
2026-06-13 21:27:49 +10:00
parent f26d52b3b4
commit 787671f9ca
13 changed files with 679 additions and 0 deletions
+100
View File
@@ -0,0 +1,100 @@
# План развёртывания защиты
Оценка: **24 рабочих дня** с окнами обслуживания на бэкендах (по одному хосту).
## Фаза 0 — Подготовка (без изменений на проде)
- [ ] Зафиксировать **публичный IP** HAProxy и правила DNAT на MikroTik.
- [ ] Убедиться, что **SSH** на `192.168.160.117` доступен с admin-IP (не только с одного ноутбука).
- [ ] Снимок/backup: `haproxy.cfg`, allowlist, `/etc/ssh/sshd_config`.
- [ ] Клонировать репозиторий на HAProxy: `git pull kalinamall main`.
- [ ] Прочитать [checklist.md](checklist.md).
**Критерий готовности:** есть консоль или второй admin-IP для отката UFW.
---
## Фаза 1 — HAProxy: базовый hardening (без UFW enable)
На **haproxy.kalinamall.ru**:
- [ ] `apt update && apt upgrade` (или unattended-upgrades).
- [ ] SSH: `PasswordAuthentication no`, `PermitRootLogin no`, только ключи (`/etc/ssh/sshd_config.d/`).
- [ ] Установить **fail2ban** (`sshd` jail), см. [haproxy-host.md](haproxy-host.md).
- [ ] Убедиться, что **stats :8404** не включены в prod (закомментированы в `haproxy.cfg`).
- [ ] Права: `/etc/haproxy/*-allowed``0644 root:root`; скрипты в `/usr/local/bin``0755`.
- [ ] `sysctl`: syncookies, rp_filter (см. [haproxy-host.md](haproxy-host.md)).
**Проверка:** `ss -tlnp` — только 22, 25, 80, 443 (+ systemd-resolved если локально).
---
## Фаза 2 — UFW на HAProxy
- [ ] `cp scripts/security/haproxy-ufw.env.example /etc/haproxy/security/haproxy-ufw.env`
- [ ] Заполнить **`SSH_ALLOWED`** (офис, VPN, admin; минимум ваш текущий IP + LAN).
- [ ] Dry-run: `bash scripts/security/haproxy-ufw-apply.sh`
- [ ] **Не закрывая SSH-сессию**, в second tab: `bash scripts/security/haproxy-ufw-apply.sh --apply`
- [ ] Проверить с admin-IP: `ssh haproxy.kalinamall.ru`, `curl` на 80/443 с allowlist.
- [ ] Проверить SMTP 25 с внешнего MTA (если используется).
**Откат:** `ufw disable` (временно) или `ufw delete` по номерам правил; env-файл сохранить.
---
## Фаза 3 — UFW на бэкендах (по одному хосту)
Порядок рекомендуемый (от менее критичных к более):
1. Zabbix `.53:80`
2. Git `.129:443`
3. SAC `.145:443`
4. Synology `.185:5001`, `.35:5001`
5. ERP `.150:443`
6. RDS `.40:4430`
7. Exchange `.42:443`
8. KSMG `.57:25`**особый случай** (почта может идти не только с HAProxy); см. [backend-hosts.md](backend-hosts.md)
На каждом хосте:
- [ ] `cp backend-ufw.env.example``/etc/haproxy/security/backend-ufw.env` (или `/etc/security/`)
- [ ] Задать `BACKEND_PORT`, при необходимости `ADMIN_ALLOWED`, `EXTRA_ALLOWED`
- [ ] Dry-run → `--apply`
- [ ] Проверить сервис через HAProxy снаружи и health-check в логе HAProxy
**Критерий:** с другого LAN-хоста (не `.117`) `curl https://<backend-ip>:<port>` **не** отвечает; с HAProxy — работает.
---
## Фаза 4 — MikroTik и мониторинг
- [ ] На MikroTik: с интернета на HAProxy только **25, 80, 443** (не пробрасывать 3389, 5001, 4430 на внутренние IP).
- [ ] Raw/firewall: опционально drop obvious scanners (согласовать с `rds-allowed` / RU geo).
- [ ] Zabbix: триггеры на `ufw status`, `fail2ban`, рост `fe_https_sni` reject, backend DOWN.
- [ ] Ротация логов `/var/log/haproxy.log`.
---
## Фаза 5 — Усиление (по приоритету)
| Задача | Зачем |
|--------|--------|
| Allowlist или rate-limit для **Exchange** | Сейчас 443 без IP-фильтра |
| Ограничить **sac-api** (если бизнес позволяет) | Сейчас без allowlist |
| TLS verify на бэкендах HAProxy | Вместо `verify none` — внутренняя CA |
| Отдельный VLAN для DMZ / HAProxy | Сегментация |
| WAF / reverse proxy HTTP для Zabbix → HTTPS | Порт 80 только HTTP |
| 2FA на Git, OWA, RD Gateway | Учётные записи |
---
## Окна и коммуникация
| Фаза | Риск | Окно |
|------|------|------|
| 1 | Низкий | любое |
| 2 | **SSH lockout** | рабочее время + console |
| 3 | Обрыв сервиса при ошибке порта | вечер / по сервису |
| 4 | Ошибка NAT | согласование с сетью |
После каждой фазы — отметки в [checklist.md](checklist.md).