101 lines
5.0 KiB
Markdown
101 lines
5.0 KiB
Markdown
# План развёртывания защиты
|
||
|
||
Оценка: **2–4 рабочих дня** с окнами обслуживания на бэкендах (по одному хосту).
|
||
|
||
## Фаза 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).
|