# VPS Hosting — Security Audit & Hardening

> **Узел:** `31.58.134.118` (server-FS5Zbf) · **Аудит:** 2026-06-26 → hardening применён

---

## 🚨 Audit findings (было → стало)

| # | Угроза | До | После |
|---|--------|----|----|
| 1 | SSH brute-force | **16843 failed/24ч**, password-auth ON | fail2ban active, 4 бана, password-auth OFF |
| 2 | Root по паролю | `PermitRootLogin yes` | `prohibit-password` (ключ-only) |
| 3 | Авто-патчи | unattended-upgrades inactive | active (security auto) |
| 4 | Файрвол | все порты открыты | UFW: 22/80/443 + VPN |
| 5 | SOCKS5 пароль | `OmniRoute2026!` скомпрометирован (в логах) | ротирован → `ELqpOHd25VkkkrGgpdUDYMr` |
| 6 | SOCKS5 user typo | `proxy-omi` (неверно) | `proxy-omni` (верно) |
| 7 | HTTP plaintext | только :80 | HTTPS + HSTS, редирект 80→443 |
| 8 | Security headers | отсутствовали | nosniff / X-Frame / Referrer-Policy |

---

## 🔬 Attack surface (открытые порты)

| Порт | Назначение | Риск | Митигация |
|------|-----------|------|-----------|
| 22 | SSH | brute-force | 🔑 ключ-only + fail2ban |
| 80 | HTTP | redirect-only | → 443 |
| 443 | HTTPS | public web | Caddy + Let's Encrypt + headers |
| 1080 | SOCKS5 (danted) | open proxy abuse | creds required; в OmniRoute OFF |
| 51820/51821 | Amnezia WG | VPN users | не трогать |
| 46673 | Amnezia AWG | VPN users | не трогать |

**Loopback-only (не публичные):** Caddy admin `:2019`, goida-vpn `:5001`, Docker `:172.x`.

---

## 🔑 Credential management

| Секрет | Хранилище | Доступ |
|--------|-----------|--------|
| VPS root-pass (исторический) | `/home/samurai/.secrets_dir/vps-proxy-31.58.134.118.env` (600) | только samurai |
| SOCKS5 proxy pass | там же | только samurai |
| OmniRoute proxy_registry | `~/.omniroute/storage.sqlite` (600) | только samurai |
| SSH private key | `~/.ssh/id_ed25519_vps_6627` (600) | только samurai |

**⚠️ Известные утечки (исправлены):**
- Пароль SOCKS5 `OmniRoute2026!` был в `call_logs` plaintext → sanitized (5 файлов), пароль ротирован и убит.
- Пароль в канон/memory → замаскирован как `***REDACTED-ROTATE-PENDING***`.
- Остаток: только `.jsonl` транскрипт сессии (chmod 600, ephemeral).

---

## 🛡️ Defense layers

```
Internet
   │
   ├─ UFW (port whitelist: 22/80/443/1080/VPN)
   │
   ├─ fail2ban (SSH: 4 retry → ban 1h, systemd backend)
   │
   ├─ SSH (pubkey-only, root prohibit-password)
   │
   ├─ Caddy (TLS 1.3, HSTS, security headers, reverse-proxy)
   │
   ├─ Docker (127.0.0.1-only ports, no host exposure)
   │
   └─ unattended-upgrades (daily security patches)
```

---

## 🔍 Мониторинг (что проверять)

```bash
# 1. fail2ban активность (атаки)
ssh vps-proxy 'fail2ban-client status sshd'

# 2. Новые failed SSH
ssh vps-proxy 'journalctl -u ssh --since "1 hour ago" | grep -ciE "failed|invalid"'

# 3. Публичные порты (на случай regress)
ssh vps-proxy 'ss -tlnp | grep 0.0.0.0'

# 4. Caddy/Ssl health
curl -sI https://31.58.134.118.nip.io/ | grep -i strict-transport

# 5. Docker exposure (все порты должны быть 127.0.0.1)
ssh vps-proxy 'docker ps --format "{{.Ports}}"'
```

---

## ⚠️ TODO / рекомендованные улучшения

| Приоритет | Что | Когда |
|-----------|-----|-------|
| P1 | Зарегистрировать `samurai.ai` → подключить домен (SSL auto) | после покупки |
| P2 | Rate-limiting на SOCKS5 :1080 (fail2ban-recidive или UFW limit) | при росте атак |
| P3 | Шифрование пароля SOCKS5 в proxy_registry (нужен patch OmniRoute proxyEgress.ts:299 → добавить decrypt()) | при возможности |
| P3 | Wireguard/SSH-порт change (22 → нестандартный) снизит лог-шум | опционально |
| P4 | Backup-стратегия `/opt/stack`, `/var/www` → llmserver/offsite | при росте |

---

*SECURITY v1.0 · 2026-06-27. Re-audit рекомендуется после подключения доменов или при подозрении на компрометацию.*
