Files
reverse-proxy/docs/security/haproxy-host.md
T
Andrey Lutsenko e3201ae41b docs: периметр MikroTik — на HAProxy только 80/443
Уточнено: порт 25 с интернета не проброшен; inbound-почта не через HAProxy.
2026-06-13 22:24:48 +10:00

144 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` / `<NOSRV>` / короткие сессии в 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.