Files
reverse-proxy/docs/security/haproxy-host.md
T
Andrey Lutsenko 8e2a4ac1b9 docs(security): периметр 80/443→HAProxy, 25→KSMG; UFW на .117
Переписаны docs/security под текущий этап: SSH/stats из SSH_ALLOWED,
80/443 для всех. Скрипт UFW дополнен правилом 8404.
2026-06-13 22:34:57 +10:00

94 lines
3.2 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.
# HAProxy: UFW и hardening
Хост: **haproxy.kalinamall.ru**, **192.168.160.117**, Ubuntu 24.04, HAProxy 2.8.x.
## Порты на хосте
| Порт | Служба | С интернета (MikroTik) | UFW (текущий план) |
|------|--------|------------------------|---------------------|
| 22 | sshd | нет DNAT | только `SSH_ALLOWED` |
| 25 | fe_smtp → KSMG | **нет** (25 → `.57`) | **закрыт** |
| 80 | fe_http_zabbix | да | все |
| 443 | fe_https_sni | да | все |
| 8404 | stats (закомментирован) | нет | только `SSH_ALLOWED` |
## UFW — правила
Скрипт: [haproxy-ufw-apply.sh](../../scripts/security/haproxy-ufw-apply.sh).
```
default incoming: deny
default outgoing: allow
22/tcp from 5.100.81.121, 192.168.128.0/17
8404/tcp from 5.100.81.121, 192.168.128.0/17 # если включите fe_stats
80/tcp from anywhere
443/tcp from anywhere
```
`192.168.128.0/17` покрывает офисную/VPN-подсеть (в т.ч. `192.168.160.0/24`).
### Env
`/etc/haproxy/security/haproxy-ufw.env` (из [haproxy-ufw.env.example](../../scripts/security/haproxy-ufw.env.example)):
```bash
SSH_ALLOWED="5.100.81.121 192.168.128.0/17"
INBOUND_TCP="80 443"
STATS_TCP="8404"
UFW_IPV6=no
```
### Внедрение
```bash
sudo mkdir -p /etc/haproxy/security
sudo cp ~/reverse-proxy/scripts/security/haproxy-ufw.env.example /etc/haproxy/security/haproxy-ufw.env
sudo bash ~/reverse-proxy/scripts/security/haproxy-ufw-apply.sh
# вторая SSH-сессия:
sudo bash ~/reverse-proxy/scripts/security/haproxy-ufw-apply.sh --apply
sudo ufw status numbered
```
**Откат:** `sudo ufw disable` (временно).
### Проверка
- SSH с `5.100.81.121` или из `192.168.128.0/17` — OK.
- SSH с другого IP — timeout/refused.
- `curl -I http://zabbix.kalinamall.ru` / HTTPS на allowlist-сервис — OK.
- `ss -tlnp | grep :25` — слушает HAProxy, но UFW + MikroTik не пускают с периметра.
## fe_smtp (:25)
Inbound-почта с интернета идёт на **KSMG `.57`**, не на HAProxy. `fe_smtp` в `haproxy.cfg` можно оставить для LAN или **отключить**, если не используется — UFW его не открывает.
## stats (:8404)
В `haproxy.cfg` закомментирован. Если включите — UFW уже ограничит доступ списком `SSH_ALLOWED`; обязательно `stats auth` и не `0.0.0.0` без нужды.
## Рекомендуется дополнительно (не блокирует UFW)
| Мера | Зачем |
|------|--------|
| SSH: ключи, `PermitRootLogin no`, `PasswordAuthentication no` | до/вместе с UFW |
| fail2ban на sshd | подстраховка SSH |
| `unattended-upgrades` | патчи |
| Не открывать лишние listen | `ss -tlnp` |
Опционально позже: sysctl syncookies, rate-limit на frontend, allowlist для Exchange/sac-api.
### SSH (пример)
`/etc/ssh/sshd_config.d/99-hardening.conf`:
```
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
AllowUsers papatramp
```
`sshd -t && systemctl reload sshd`