# Hardening хоста HAProxy Хост: **haproxy.kalinamall.ru**, **192.168.160.117**, Ubuntu 24.04, HAProxy 2.8.x. ## Слушающие порты (prod) | Порт | Frontend | Назначение | |------|----------|------------| | 22 | sshd | Администрирование (не в haproxy.cfg) | | 25 | fe_smtp | SMTP → KSMG (**LAN**; с интернета не проброшен) | | 80 | fe_http_zabbix | HTTP Zabbix | | 443 | fe_https_sni | TLS passthrough по SNI | Не включать **8404/stats** на `0.0.0.0` без VPN и пароля. ## Периметр (MikroTik) С **интернета** на публичный IP HAProxy проброшены только **TCP 80** и **443**. Остальные порты HAProxy (в т.ч. **25**) снаружи **недоступны** — DNAT не настроен. ## UFW Скрипт: [haproxy-ufw-apply.sh](../../scripts/security/haproxy-ufw-apply.sh). Политика: ``` default incoming: deny default outgoing: allow allow 22/tcp from SSH_ALLOWED allow 80, 443/tcp from anywhere # сервисы периметра (MikroTik DNAT) # allow 25/tcp from LAN_CIDR # только если нужен SMTP через HAProxy изнутри сети ``` **SSH_ALLOWED** — несколько CIDR/ IP через пробел в env. Минимум: - подсеть админов / VPN; - LAN `192.168.160.0/24` (если SSH только изнутри); - **не** `0.0.0.0/0` без крайней необходимости. Перед `--apply` обязательно dry-run и **вторая SSH-сессия**. ## SSH Пример drop-in `/etc/ssh/sshd_config.d/99-hardening.conf`: ``` PermitRootLogin no PasswordAuthentication no KbdInteractiveAuthentication no PubkeyAuthentication yes MaxAuthTries 3 AllowUsers papatramp ``` После правок: `sshd -t && systemctl reload sshd`. ## fail2ban ```bash sudo apt install -y fail2ban ``` `/etc/fail2ban/jail.d/sshd.local`: ```ini [sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 5 findtime = 600 bantime = 3600 ``` `systemctl enable --now fail2ban`, проверка: `fail2ban-client status sshd`. ## HAProxy ### Уже в конфиге - Reject неизвестного SNI. - Allowlist по сервисам. - Длинные timeout для RDP/Exchange — осознанно; не занижать без теста. ### Рекомендуется добавить (отдельный PR / окно) 1. **Лимит соединений** (global уже `maxconn 50000`; при атаке снизить или ограничить на frontend): ``` # frontend fe_https_sni # maxconn 10000 ``` 2. **Exchange / sac-api без allowlist** — рассмотреть: - отдельный allowlist; - или `tcp-request content reject` при превышении conn rate (HAProxy 2.8+: stick-table / sc1 — сложнее в TCP+SNI). 3. **Логирование отказов** — grep `SC` / `` / короткие сессии в SIEM. 4. **`ssl verify required`** на бэкендах после выпуска внутренней CA. ### systemd ```bash systemctl enable haproxy # после reload: systemctl status haproxy ``` ## sysctl (опционально) `/etc/sysctl.d/99-haproxy-security.conf`: ``` net.ipv4.tcp_syncookies = 1 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.icmp_echo_ignore_broadcasts = 1 ``` `sysctl --system` ## Обновления ```bash sudo apt install -y unattended-upgrades sudo dpkg-reconfigure -plow unattended-upgrades ``` Исключить автоперезапуск HAProxy в неудобное окно — настроить `Unattended-Upgrade::Automatic-Reboot` по политике. ## Права и секреты - Allowlist и `haproxy.cfg` — root, без world-readable секретов (в репо секретов нет). - `/etc/haproxy/security/` — `0750 root:root`. - Не коммитить `haproxy-ufw.env` с реальными IP в публичный GitHub (в kalinamall — по политике repo). ## Мониторинг - HAProxy backend **DOWN** / **L4CON**. - Рост отклонённых TCP (`SC`, reject по ACL). - `ufw status numbered`, диск под логами. - fail2ban bans.