Уточнено: порт 25 с интернета не проброшен; inbound-почта не через HAProxy.
4.3 KiB
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.
Политика:
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
sudo apt install -y fail2ban
/etc/fail2ban/jail.d/sshd.local:
[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 / окно)
-
Лимит соединений (global уже
maxconn 50000; при атаке снизить или ограничить на frontend):# frontend fe_https_sni # maxconn 10000 -
Exchange / sac-api без allowlist — рассмотреть:
- отдельный allowlist;
- или
tcp-request content rejectпри превышении conn rate (HAProxy 2.8+: stick-table / sc1 — сложнее в TCP+SNI).
-
Логирование отказов — grep
SC/<NOSRV>/ короткие сессии в SIEM. -
ssl verify requiredна бэкендах после выпуска внутренней CA.
systemd
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
Обновления
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.