Security¶
4-Schichten-Modell¶
Schicht 1: UFW (Host-Firewall)¶
Default-Deny Incoming. Offene Ports:
| Port | Protokoll | Beschreibung |
|---|---|---|
| 22 | TCP | SSH |
| 80, 443 | TCP | HTTP/HTTPS (Traefik) |
| 2222 | TCP | SFTP (Hosting) |
| 5060 | UDP | SIP |
| 5067 | TCP | SIP/TLS |
| 7443 | TCP | WebRTC WSS |
| 16384-32768 | UDP | RTP Media |
Config: /home/admin/scripts/ufw-setup.sh
Schicht 2: CrowdSec (IDS/IPS)¶
- nftables bouncer — IP-Level Blocking
- Traefik Plugin — HTTP-Level Blocking
Custom Scenarios:
| Scenario | Ban-Dauer | Trigger |
|---|---|---|
| SIP-Bruteforce | 24h | 5 Fehlversuche / 5 Min |
| SIP-Scanner | 7d | Scanner-Pattern erkannt |
| WSS-Abuse | 1h | Ueberlast auf WebSocket |
| Mail-Bruteforce | 24h | 5 Fehlversuche / 5 Min |
| Mail-Spam-Sender | 24h | 20 Mails / 10 Min |
Config: /etc/crowdsec/
Schicht 3: fail2ban (Legacy)¶
Wird schrittweise durch CrowdSec ersetzt.
4 Jails: sshd, freeswitch, freeswitch-scanner, wss-proxy
Schicht 4: Traefik Middleware¶
Per-Request Chain:
ForwardAuth (SSO)¶
Der auth-service (auth.xynap.tech) schuetzt Services via ForwardAuth:
Traefik → auth-check middleware → GET http://auth-service:8091/verify
→ 200: Zugriff erlaubt (X-Auth-User, X-Auth-Name, X-Auth-Role Header)
→ 302: Redirect zu Login
Cookie-Domain: .xynap.tech
Ausfuehrliche Dokumentation
Siehe Zugangsportal fuer Benutzeranleitungen, Benutzerverwaltung fuer Admin-Funktionen und Technische Referenz fuer Deployment und Debugging.
Platform API Security¶
- JWT mit konfigurierbarer Expiry
- TOTP 2FA (Authenticator App)
- Telegram 2FA (Code via Bot)
- OAuth2 (GitHub, Google)
- RBAC — 5 Rollen, 30+ Permissions
- Tenant-Isolation — Kunden sehen nur eigene Daten
- Audit-Log — Alle Aenderungen werden protokolliert
- Encrypted Credentials — DNS-Provider/DB-Passwoerter mit Fernet verschluesselt
Security-by-Design (v2.4, 2026-03-11)¶
Architekturprinzip: Alle Datenzugriffe laufen ueber die API, die API erzwingt RBAC basierend auf Rollen/Rechten.
XSS-Schutz (Frontend)¶
Alle v-html-Verwendungen werden mit DOMPurify sanitized:
| Komponente | Risiko | Massnahme |
|---|---|---|
SignatureManager.vue |
E-Mail-Signaturen (HTML) | sanitizeHtml() Wrapper |
TextBlock.vue |
CMS-Benutzercontent | sanitizeHtml() Wrapper |
ClientSetupView.vue |
i18n-Translations | sanitizeHtml() (Defense-in-depth) |
Utility: src/shell/utils/sanitizeHtml.ts — Zentraler DOMPurify-Wrapper.
Webhook-HMAC-Verifikation¶
Payment-Webhooks (Stripe, PayPal) pruefen HMAC-SHA256-Signaturen:
- Header:
X-Webhook-Signature(Hex-Digest) - Secret aus Settings:
payments.stripe_webhook_secret/payments.paypal_webhook_secret - Ohne konfiguriertes Secret: Dummy-Modus (Requests werden akzeptiert)
- Mit Secret: Signatur wird erzwungen, ungueltige Requests → 403
User-Preferences via API¶
Nutzer-Praeferenzen (Mail-Handler, Call-Handler) werden ueber die API verwaltet:
GET /api/v1/settings/preferences— Eigene Praeferenzen lesenPUT /api/v1/settings/preferences— Eigene Praeferenzen setzen- Whitelist-Validierung: Nur erlaubte Keys (
mail_handler,call_handler) und Werte (internal,system,ask) - Scope:
usermitscope_id = user.id— RBAC erzwingt, dass jeder User nur eigene Praeferenzen aendern kann - Frontend:
localStoragenur als Offline-Cache, primaere Quelle ist die API
Kontakt-Link Sanitierung (XContactLink)¶
Alle klickbaren Kontakt-Links werden vor Verwendung sanitized:
| Typ | Sanitierung |
|---|---|
Steuerzeichen entfernt, @ geprueft, javascript: blockiert |
|
| Telefon | Nur +, Ziffern, Leerzeichen, Klammern, Bindestriche |
| Website | Nur http:// / https://, javascript: / data: / vbscript: blockiert |
| Telegram | Handle-Regex ([a-zA-Z0-9_]{3,32}) oder t.me-URL |
Nur Ziffern und +, Mindestlaenge 5 |
|
| Externe Links | noopener,noreferrer bei window.open() |
Compose-Parameter Sanitierung¶
URL-Parameter (?to=, ?cc=, ?subject=, ?body=) im Webmailer werden validiert:
- E-Mail-Adressen: Steuerzeichen entfernt,
@geprueft - Subject: Max 200 Zeichen, Steuerzeichen entfernt
- Body: Max 2000 Zeichen, HTML-escaped (kein
v-html)
Netzwerk-Sicherheit¶
- Hetzner MAC-Filtering auf Bridge-Level
- VM-Routing ohne NAT (transparente IPs)
- IPv6 via ndppd (NDP Proxy)
- Network Watchdog ueberwacht Bridge-Status