Files
reverse-proxy/docs/security/haproxy-host.md
T

3.8 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
80 fe_http_zabbix HTTP Zabbix
443 fe_https_sni TLS passthrough по SNI

Не включать 8404/stats на 0.0.0.0 без VPN и пароля.

UFW

Скрипт: haproxy-ufw-apply.sh.

Политика:

default incoming: deny
default outgoing: allow
allow 22/tcp from SSH_ALLOWED
allow 25, 80, 443/tcp from anywhere   # сервисы периметра

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 / окно)

  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 / <NOSRV> / короткие сессии в SIEM.

  4. 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.