docs(security): периметр 80/443→HAProxy, 25→KSMG; UFW на .117
Переписаны docs/security под текущий этап: SSH/stats из SSH_ALLOWED, 80/443 для всех. Скрипт UFW дополнен правилом 8404.
This commit is contained in:
@@ -1,100 +1,61 @@
|
||||
# План развёртывания защиты
|
||||
# План внедрения
|
||||
|
||||
Оценка: **2–4 рабочих дня** с окнами обслуживания на бэкендах (по одному хосту).
|
||||
**Текущая остановка:** UFW на HAProxy (фаза 2). Бэкенды и KSMG — позже.
|
||||
|
||||
## Фаза 0 — Подготовка (без изменений на проде)
|
||||
## Фаза 0 — Подготовка
|
||||
|
||||
- [ ] Зафиксировать **публичный IP** HAProxy и правила DNAT на MikroTik (**только 80/443**).
|
||||
- [ ] Убедиться, что **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.
|
||||
- [ ] Зафиксировать DNAT на MikroTik:
|
||||
- `80`, `443` → `192.168.160.117`
|
||||
- `25` → `192.168.160.57` (KSMG)
|
||||
- [ ] SSH на `.117` работает с `5.100.81.121` или `192.168.128.0/17`
|
||||
- [ ] Backup: `haproxy.cfg`, allowlist, `sshd_config`
|
||||
- [ ] `git pull` на HAProxy
|
||||
- [ ] Консоль/IPMI на случай lockout SSH
|
||||
|
||||
---
|
||||
|
||||
## Фаза 1 — HAProxy: базовый hardening (без UFW enable)
|
||||
## Фаза 1 — Подготовка хоста (без UFW)
|
||||
|
||||
На **haproxy.kalinamall.ru**:
|
||||
- [ ] `apt update && apt upgrade`
|
||||
- [ ] SSH: ключи, без root/password ([haproxy-host.md](haproxy-host.md))
|
||||
- [ ] `haproxy -c -f /etc/haproxy/haproxy.cfg` — OK
|
||||
- [ ] `fe_stats` (:8404) — закомментирован или будет под UFW
|
||||
- [ ] Решить судьбу `fe_smtp` (:25): нужен из LAN или отключить
|
||||
|
||||
- [ ] `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 если локально).
|
||||
**Проверка:** `ss -tlnp` — ожидаемо 22, 80, 443; возможно 25.
|
||||
|
||||
---
|
||||
|
||||
## Фаза 2 — UFW на HAProxy
|
||||
## Фаза 2 — UFW на HAProxy ← **СТОП ЗДЕСЬ**
|
||||
|
||||
- [ ] `cp scripts/security/haproxy-ufw.env.example /etc/haproxy/security/haproxy-ufw.env`
|
||||
- [ ] Заполнить **`SSH_ALLOWED`** (офис, VPN, admin; минимум ваш текущий IP + LAN).
|
||||
- [ ] Проверить `SSH_ALLOWED="5.100.81.121 192.168.128.0/17"`
|
||||
- [ ] 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.
|
||||
- [ ] Убедиться, что **25** с интернета на HAProxy **не** доступен (ожидаемо: DNAT не настроен).
|
||||
- [ ] **Вторая SSH-сессия:** `bash scripts/security/haproxy-ufw-apply.sh --apply`
|
||||
- [ ] [checklist.md](checklist.md) — HAProxy
|
||||
|
||||
**Откат:** `ufw disable` (временно) или `ufw delete` по номерам правил; env-файл сохранить.
|
||||
**Откат:** `ufw disable`
|
||||
|
||||
---
|
||||
|
||||
## Фаза 3 — UFW на бэкендах (по одному хосту)
|
||||
## Фаза 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 — работает.
|
||||
По одному хосту, см. [backend-hosts.md](backend-hosts.md): Zabbix → Git → SAC → Synology → ERP → RDS → Exchange.
|
||||
|
||||
---
|
||||
|
||||
## Фаза 4 — MikroTik и мониторинг
|
||||
## Фаза 4 — KSMG (позже)
|
||||
|
||||
- [ ] На MikroTik: с интернета на HAProxy только **80, 443** (не пробрасывать 25, 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`.
|
||||
Периметровый **25** на `.57` — отдельный UFW и политика relay. HAProxy к inbound-почте не привязан.
|
||||
|
||||
---
|
||||
|
||||
## Фаза 5 — Усиление (по приоритету)
|
||||
## Фаза 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 | Учётные записи |
|
||||
Allowlist Exchange/sac-api, TLS verify на бэкендах, мониторинг UFW/fail2ban в Zabbix.
|
||||
|
||||
---
|
||||
|
||||
## Окна и коммуникация
|
||||
|
||||
| Фаза | Риск | Окно |
|
||||
|------|------|------|
|
||||
| 1 | Низкий | любое |
|
||||
| 2 | **SSH lockout** | рабочее время + console |
|
||||
| 3 | Обрыв сервиса при ошибке порта | вечер / по сервису |
|
||||
| 4 | Ошибка NAT | согласование с сетью |
|
||||
|
||||
После каждой фазы — отметки в [checklist.md](checklist.md).
|
||||
| Фаза | Риск |
|
||||
|------|------|
|
||||
| 1 | низкий |
|
||||
| 2 | **SSH lockout** — вторая сессия + console |
|
||||
| 3+ | обрыв сервиса при ошибке порта |
|
||||
|
||||
Reference in New Issue
Block a user