Sicherheit¶
enconf bietet mehrere Sicherheitsschichten zum Schutz des Panels und der gehosteten Websites.
Kunden-Isolation (Defense in Depth)¶
enconf isoliert jeden Kunden auf mehreren unabhängigen Schichten. Wichtig zu wissen: 100% Isolation auf einem Single-Kernel-System ist physikalisch nicht möglich — das geht nur mit Containern oder VMs. Was wir bauen ist Defense in Depth: jede Schicht muss für einen erfolgreichen Cross-Tenant-Angriff einzeln umgangen werden.
Aktiv und automatisch ausgerollt¶
| Schicht | Was sie schützt |
|---|---|
| Eigener Linux-User pro Kunde | Standard-Unix-DAC. Dateien gehören dem Customer, sind nicht für andere lesbar. |
Webroot-Mode 0710 user:www-data |
Owner darf alles, Nginx (www-data) darf traversieren, alle anderen Customer haben kein Zugriff — können nicht mal in das Verzeichnis cd-en. |
| PHP-FPM Pool pro Kunde | Eigener User/Group — PHP läuft mit Customer-Identität, kein shared www-data-Prozess. |
open_basedir |
PHP-Requests können nur in <docroot>:<tmpDir>:/usr/share/php:/var/cache/php lesen/schreiben. |
disable_functions |
exec, passthru, shell_exec, system, popen, proc_open, dl, alle pcntl_* deaktiviert — kein Shell-Zugriff via PHP. |
Per-Customer /tmp/<user> mode 0700 |
Eigener Pfad für session.save_path, upload_tmp_dir, sys_temp_dir. Kein Cross-Tenant Session/Upload-Leak via shared /tmp oder /var/lib/php/sessions/. |
| MariaDB-Grants pro Kunde | GRANT … ON customer_db.* strikt — kein User mit globalen Rechten. Cross-DB-Queries blockiert. |
Panel-Secrets 0600 root:root |
JWT_SECRET, DB_PASSWORD, AGENT_TOKEN sind für Customer-PHP-Pools nicht lesbar. |
ProFTPD DefaultRoot ~ |
FTP/SFTP-User chrooted in eigenes Home — kann nicht zu anderen Customern oder System-Pfaden navigieren. |
| Nginx Upload-Path-Block | .php in Upload-Verzeichnissen wird nicht ausgeführt — schließt das häufigste WordPress-Hack-Pattern. |
| HTTPS-Catch-all (inkl. HTTP/3) | Ein Name, den kein Vhost bedient, bekommt ein neutrales, selbstsigniertes Zertifikat und eine 404-Antwort — nie das Zertifikat eines Kunden. Das gilt auch für HTTP/3 (QUIC); dort lieferte der Server früher das Zertifikat des ersten Kunden in der Konfiguration aus. |
| nftables SMTP-Egress-Block | Customer-PHP kann nicht direkt zu fremden SMTP-Servern verbinden — Spam-Schutz. Nur authentifizierte Submission via 587. |
| FFI deaktiviert | ffi.enable=0 — schließt den FFI::cdef→libc-Umweg um disable_functions. |
| AppArmor-Profil pro Kunde | Eigenes Profil je PHP-FPM; pro Server zwischen Complain- und Enforce-Modus umschaltbar, mit Auto-Rückfall bei False-Positive-Häufung. |
| systemd-Slice pro Kunde | MemoryMax / CPUQuota / TasksMax / IO — greift für neue und bestehende Sites. |
| Kernel-Härtung (sysctl) | kptr_restrict, dmesg_restrict, ptrace_scope, unprivileged_bpf_disabled u. a. |
| fail2ban | Brute-Force-Schutz für SSH, FTP, Mail, Panel-Login. |
| Per-Customer Nginx Logs | Logs unter /var/www/customers/<user>/logs/ getrennt — kein Cross-Tenant Log-Reading. |
| Hardening-Migration beim Agent-Start | Bestehende Sites werden bei Updates automatisch auf den aktuellen Hardening-Stand gebracht (idempotent). |
Nachweisbarkeit (aktiv)¶
| Schicht | Status |
|---|---|
| Pro-Kunde-Sicherheits-Score | Jeder Kunde sieht im Dashboard live, welche Isolationsschichten je Website wirklich aktiv sind. |
| Security Advisor | Serverweite Audit-Checkliste, SBOM, Live-CVE-Feed, Nachweise & Export. |
| SIEM-Log-Forwarding | Sicherheits-Logs flottenweit über TLS an einen Collector. |
Ausführlich: siehe Sicherheitsarchitektur-Whitepaper.
Geplant (Phase 2)¶
| Schicht | Status |
|---|---|
| AppArmor Enforce flottenweit | Enforce-Toggle pro Server ist gebaut; der breite Rollout wartet auf ausreichend Complain-Beobachtungsdaten. |
| Echte Kernel-Isolation als Default | Rootless Container (gVisor) opt-in verfügbar; als Standard für untrusted Workloads noch nicht gesetzt. |
Was grundsätzlich nicht isoliert ist¶
Diese Punkte betreffen jedes Single-Kernel-Single-MariaDB-System (auch Plesk, cPanel, CyberPanel) und sind nicht durch Panel-Layer behebbar:
- Linux-Kernel — alle Customer teilen einen Kernel. Mitigation: Kernel-Updates zeitnah einspielen.
- MariaDB-Prozess — eine Instanz für alle. Mitigation: Updates.
- PHP-Binary — alle Pools mit derselben PHP-Version teilen den Binary-Code.
- Postfix/Dovecot/PowerDNS — eine Instanz für alle Domains.
Zwei-Faktor-Authentifizierung (2FA)¶
2FA schützt den Panel-Zugang durch einen zusätzlichen Authentifizierungsfaktor neben dem Passwort.
2FA aktivieren¶
- Navigieren Sie zu Einstellungen > Sicherheit (oder Einstellungen > Passwort)
- Klicken Sie auf 2FA einrichten
- Scannen Sie den QR-Code mit einer Authenticator-App:
- Google Authenticator
- Authy
- Microsoft Authenticator
- FreeOTP
- Geben Sie den angezeigten 6-stelligen Code ein
- Klicken Sie auf Bestätigen
Backup-Codes
Notieren Sie sich den geheimen Schlüssel (Secret), der unter dem QR-Code angezeigt wird. Damit können Sie den Zugang wiederherstellen, falls Sie das Gerät verlieren.
2FA deaktivieren¶
- Navigieren Sie zu Einstellungen > Sicherheit
- Klicken Sie auf 2FA deaktivieren
- Geben Sie Ihr aktuelles Passwort zur Bestätigung ein
- Klicken Sie auf Deaktivieren
Login mit 2FA¶
- Geben Sie E-Mail und Passwort ein
- Geben Sie den 6-stelligen Code aus Ihrer Authenticator-App ein
- Klicken Sie auf Anmelden
TOTP-Protokoll
WebPanel verwendet das TOTP-Protokoll (Time-based One-Time Password), das von allen gängigen Authenticator-Apps unterstützt wird.
2FA-Richtlinie erzwingen¶
Als Administrator können Sie festlegen, dass bestimmte Benutzergruppen zwingend 2FA einrichten müssen.
Konfiguration¶
- Navigieren Sie zu Einstellungen > Sicherheit
- Wählen Sie unter 2FA erzwingen die gewünschte Richtlinie:
| Option | Beschreibung |
|---|---|
| Deaktiviert | 2FA ist optional für alle Benutzer |
| Admins | Admins müssen 2FA einrichten |
| Admins & Reseller | Admins und Reseller müssen 2FA einrichten |
| Alle Benutzer | Alle Benutzer (inkl. Kunden) müssen 2FA einrichten |
- Klicken Sie auf Speichern
Verhalten für betroffene Benutzer¶
Benutzer, die der Richtlinie unterliegen und noch keine 2FA eingerichtet haben:
- Sehen beim Login einen gelben Warnbanner im Panel
- Können das Panel weiterhin verwenden
- Werden aufgefordert, 2FA unter Einstellungen einzurichten
Empfehlung
Aktivieren Sie die Richtlinie mindestens für Admins, um Panel-Zugänge mit erhöhten Rechten zu schützen.
Brute-Force-Schutz¶
Der integrierte Brute-Force-Schutz sperrt IP-Adressen nach zu vielen fehlgeschlagenen Login-Versuchen.
Konfiguration¶
Navigieren Sie zu Einstellungen > Sicherheit > Login-Schutz:
| Einstellung | Standard | Beschreibung |
|---|---|---|
| Aktiviert | Ja | Brute-Force-Schutz ein/ausschalten |
| Max. Fehlversuche | 5 | Anzahl erlaubter Versuche |
| Sperrzeit (Minuten) | 15 | Dauer der Sperre |
IP-Whitelist des Login-Schutzes¶
IPs, die nie gesperrt werden:
- Navigieren Sie zu Einstellungen > Sicherheit > Login-Schutz
- Tragen Sie vertrauenswürdige IP-Adressen ein
- Diese IPs werden auch nach Fehlversuchen nicht gesperrt
Eigene IP whitelisten
Tragen Sie Ihre eigene statische IP-Adresse in die Whitelist ein, um sich nicht versehentlich auszusperren.
Nicht zu verwechseln mit der IP-Zugriffsbeschränkung
Diese Liste steuert nur, wer nach Fehlversuchen nicht gesperrt wird. Sie öffnet oder schließt keinen Zugang. Die Funktion, die den Panel-Zugang auf bestimmte Adressen beschränkt, ist eine andere — siehe unten. Beide heißen in der deutschen Oberfläche „IP-Whitelist".
IP-Zugriffsbeschränkung (Panel-Zugang)¶
Beschränkt den Zugang zum Admin-Panel auf ausgewählte IP-Adressen. Anders als die Whitelist des Login-Schutzes ist dies eine Zugangssperre: Was nicht auf der Liste steht, kommt nicht herein.
- Navigieren Sie zu Einstellungen > Sicherheit
- Aktivieren Sie IP-Whitelist aktiviert
- Tragen Sie unter Erlaubte IP-Adressen eine Adresse pro Zeile ein
Erlaubt sind einzelne Adressen und Bereiche in CIDR-Schreibweise, IPv4 wie IPv6:
Was die Beschränkung umfasst¶
Sie gilt für alle administrativen Anfragen und wird vor der Anmeldung geprüft. Steht Ihre Adresse nicht auf der Liste, scheitert damit nicht nur das Speichern von Einstellungen, sondern auch das Laden der Seiten: Das Dashboard zeigt überall Null, Einstellungsseiten wirken leer, und die Zugriffsbeschränkung selbst erscheint als deaktiviert. Es sind keine Daten verloren — das Panel lehnt lediglich jede Anfrage ab, auch die, die den Zustand anzeigen würde.
Die richtige Adresse eintragen¶
Das Formular zeigt Ihnen die Adresse an, die der Server bei Ihnen tatsächlich sieht. Nehmen Sie diese, nicht die aus einem Dienst wie „Wie ist meine IP". Beide beantworten unterschiedliche Fragen und weichen regelmäßig voneinander ab — etwa wenn Ihr Browser das Panel über IPv6 erreicht, die Abfrage aber über IPv4 lief, oder wenn ein Router oder Anbieter-Proxy dazwischenliegt.
Speichern wird abgelehnt, wenn Sie sich aussperren würden
Seit Version 2.9.83 prüft das Panel beim Speichern, ob Ihre eigene Adresse in der Liste enthalten ist. Fehlt sie, wird nicht gespeichert und die Meldung nennt die Adresse, die stattdessen einzutragen wäre. Ein versehentliches Aussperren über die Oberfläche ist damit nicht mehr möglich.
Zugriff vom Server selbst bleibt immer offen
Anfragen von 127.0.0.1 und ::1 sind grundsätzlich erlaubt, unabhängig von
der Liste. Das ist der Rettungsweg, falls die Beschränkung doch einmal zu eng
gerät — etwa weil sich Ihre Adresse geändert hat.
Aussperrung rückgängig machen¶
Melden Sie sich per SSH als root auf dem Server an. Welche Adresse das Panel
tatsächlich sieht, steht im Protokoll:
Beschränkung abschalten:
DB=$(grep -oP '^DB_NAME=\K.*' /etc/enconf/api.env | tr -d '"')
sudo -u postgres psql -d "$DB" \
-c "UPDATE panel_settings SET value='false' WHERE key='panel_ip_whitelist_enabled';"
systemctl restart enconf-api
Danach ist das Panel wieder vollständig erreichbar und alle Einstellungen sind unverändert vorhanden.
Änderungen greifen nicht sofort
Die Liste wird bis zu 60 Sekunden zwischengespeichert. Ohne Neustart des Dienstes kann eine Änderung also kurz nachwirken.
Passwort-Richtlinie¶
Die Passwort-Richtlinie gilt für alle Benutzer (Admin, Reseller, Kunden):
| Einstellung | Standard | Beschreibung |
|---|---|---|
| Mindestlänge | 12 | Minimale Zeichenanzahl |
| Großbuchstaben | Nein | Mindestens ein Großbuchstabe |
| Kleinbuchstaben | Nein | Mindestens ein Kleinbuchstabe |
| Ziffern | Nein | Mindestens eine Ziffer |
| Sonderzeichen | Nein | Mindestens ein Sonderzeichen |
Warum keine Zeichenklassen erzwungen werden
Die Voreinstellung folgt NIST 800-63B: Länge schützt besser als erzwungene
Zeichenklassen. Eine lange Passphrase wie korrekt-pferd-batterie-heftklammer
ist stärker als ein kurzes P4ssw!rt — würde aber von einer
Sonderzeichen-Pflicht abgelehnt.
Sie können die Zeichenklassen jederzeit einschalten, wenn eine Vorgabe in Ihrem Haus es verlangt. Bedenken Sie dabei, dass Sie damit auch starke Passphrasen ausschließen.
Konfiguration¶
- Navigieren Sie zu Einstellungen > Sicherheit > Passwort-Richtlinie
- Passen Sie die gewünschten Regeln an
- Klicken Sie auf Speichern
Audit-Log¶
Das Audit-Log protokolliert alle sicherheitsrelevanten Aktionen im Panel.
Protokollierte Ereignisse¶
| Ereignis | Beschreibung |
|---|---|
| Login | Erfolgreiche und fehlgeschlagene Anmeldungen |
| Logout | Abmeldungen |
| Passwort-Änderung | Passwort-Änderungen aller Benutzer |
| 2FA-Änderung | Aktivierung/Deaktivierung von 2FA |
| Impersonation | Admin meldet sich als Kunde/Reseller an |
| Kunde erstellt/gelöscht | Kundenverwaltungs-Aktionen |
| Abonnement erstellt/gelöscht | Abonnement-Aktionen |
| Einstellungen geändert | Änderungen an Panel-Einstellungen |
| API-Schlüssel erstellt/gelöscht | API-Schlüssel-Verwaltung |
| Firewall-Regel geändert | Firewall-Änderungen |
Audit-Log anzeigen¶
- Navigieren Sie zu Audit-Log
- Die Tabelle zeigt alle protokollierten Ereignisse:
| Spalte | Beschreibung |
|---|---|
| Zeitpunkt | Datum und Uhrzeit |
| Benutzer | Ausführender Benutzer |
| Aktion | Art der Aktion |
| Details | Zusätzliche Informationen |
| IP-Adresse | Quell-IP des Benutzers |
Filter¶
- Zeitraum — Filtern nach Datum
- Benutzer — Filtern nach Benutzer
- Aktion — Filtern nach Aktionstyp
Security Advisor¶
Der Security Advisor prüft die Sicherheitskonfiguration und gibt Empfehlungen:
Geprüfte Bereiche¶
| Bereich | Prüfung |
|---|---|
| Firewall | Ist die Firewall aktiv? |
| fail2ban | Ist fail2ban aktiv und konfiguriert? |
| 2FA | Ist 2FA für den Admin aktiviert? |
| SSL | Haben alle Domains gültige SSL-Zertifikate? |
| Passwort-Richtlinie | Ist die Richtlinie ausreichend stark? |
| PHP-Versionen | Werden veraltete PHP-Versionen verwendet? |
| Updates | Sind System-Updates verfügbar? |
| SSH | SSH-Konfiguration sicher? |
| open_basedir | Bei allen Webseiten konfiguriert? |
| disable_functions | Gefährliche Funktionen deaktiviert? |
Bewertungen¶
Jede Prüfung erhält eine Bewertung:
- Bestanden (Grün) — Sicher konfiguriert
- Warnung (Gelb) — Verbesserung empfohlen
- Kritisch (Rot) — Sofortige Maßnahme erforderlich
Kunden-Isolation¶
Jeder Hosting-Account ist vollständig isoliert:
Linux-Ebene¶
- Eigener Linux-Benutzer pro Abonnement
- PHP-FPM-Pool läuft unter dem Benutzer des Kunden
- open_basedir beschränkt PHP auf das Kundenverzeichnis
- disable_functions deaktiviert gefährliche PHP-Funktionen
- Ressourcenbegrenzung für CPU, RAM und Prozesse
Netzwerk-Ebene¶
- nftables blockiert ausgehende SMTP-Verbindungen von Kunden-Prozessen
- Kunden können keine E-Mails direkt senden (nur über den Mailserver)
Webserver-Ebene¶
- Nginx blockiert PHP-Ausführung in Upload-Verzeichnissen
- Jede Webseite hat eine eigene Vhost-Konfiguration
- Zugriffsbeschränkungen pro Verzeichnis möglich
SSH-Härtung¶
Empfohlene SSH-Einstellungen (in /etc/ssh/sshd_config):
| Einstellung | Empfehlung | Beschreibung |
|---|---|---|
| PermitRootLogin | no |
Root-Login deaktivieren |
| PasswordAuthentication | no |
Nur Schlüssel-basierte Anmeldung |
| Port | Nicht-Standard | SSH auf einem anderen Port als 22 |
| MaxAuthTries | 3 |
Max. Anmeldeversuche |
| AllowUsers | Spezifisch | Nur bestimmte Benutzer erlauben |
Zugang sicherstellen
Stellen Sie vor Änderungen an der SSH-Konfiguration sicher, dass Sie alternative Zugangswege haben (z. B. Konsole beim Hosting-Provider).
Anmelde-Anomalie-Erkennung¶
Zusätzlich zur IP-basierten Brute-Force-Sperre (fail2ban + Konto-Lockout nach zu vielen Fehlversuchen) überwacht das Panel Anmeldemuster und warnt bei zwei verdächtigen Signalen:
- Anmeldung aus unbekanntem Netz: Meldet sich ein Admin- oder Reseller-Konto aus einem Netz an (IPv4
/24, IPv6/48), aus dem es noch nie angemeldet war, wird eine Benachrichtigung ausgelöst. Der allererste Login eines Kontos gilt als Referenz und löst bewusst keine Warnung aus. - Verteilter Anmelde-Angriff: Wird ein einzelnes Konto innerhalb von 30 Minuten von mehreren IPs mit vielen Fehlversuchen attackiert, meldet das Panel dies — auch dann, wenn keine einzelne IP die Sperr-Schwelle erreicht (der „low-and-slow"-Angriff, den die per-IP-Sperre nicht fängt).
Beide Signale sind reine Benachrichtigungen (keine automatische Sperre) und ab Werk aktiv. Abschalten über die Panel-Einstellung login_anomaly_enabled=false; die Schwelle für den verteilten Angriff über login_anomaly_account_threshold (Standard 15).
Administrator-Zugang wiederherstellen¶
Wer sich aus dem Panel ausgesperrt hat — Passwort vergessen, die Anmeldeadresse beim Ändern vertippt, oder der Verdacht, dass jemand anderes das Konto übernommen hat —, stellt den Zugang auf dem Server wieder her. Dafür gibt es ein Kommandozeilenwerkzeug, das nur als root läuft (per SSH, mit sudo) und deshalb weder Passwort noch Sitzung braucht:
sudo enconfctl admin list # Admin-Konten, Anmeldeadresse, 2FA
sudo enconfctl admin reset-password <adresse> [-p <passwort>]
sudo enconfctl admin set-email <alte-adresse> <neue-adresse> [--sync-admin-email]
reset-passwordsetzt ein neues Passwort (ohne-pwird eines erzeugt und angezeigt) und beendet alle bestehenden Sitzungen dieses Kontos. Das Werkzeug umgeht bewusst die Passwort-Richtlinie.set-emailändert die Anmeldeadresse. Es prüft wie das Panel, dass keine andere Adresse gleich lautet (Groß-/Kleinschreibung zählt dabei nicht), und lässt 2FA, Passwort und Sitzungen unverändert. Die Kontaktadresse des Betreibers (admin_email, auch Let's-Encrypt- und MTA-STS-Kontakt) folgt der Anmeldeadresse nur, wenn beide vorher übereinstimmten oderadmin_emailleer war; weicht sie ab, bleibt sie unverändert und das Werkzeug nennt den Befehl mit--sync-admin-email, falls sie mitwandern soll.
Verdacht auf Übernahme (z. B. nach der Mitteilung „Ihre Anmeldeadresse wurde geändert", die Sie nicht selbst ausgelöst haben): zuerst set-email auf Ihre Adresse, dann reset-password, danach unter Sicherheit → Sitzungen unbekannte Sitzungen widerrufen und 2FA prüfen. „Passwort vergessen" im Panel hilft in diesem Fall nicht: der Link geht an die gespeicherte Anmeldeadresse, also an die neue.
Wiederholte falsche Passworteingaben beim Ändern von Passwort, Anmeldeadresse oder 2FA sperren die Prüfung für das Konto (Standard: 5 Fehlversuche in 15 Minuten, dieselben Grenzen wie bei der Anmeldung, siehe Brute-Force-Schutz). Die Sperre gilt dann auch für die richtige Eingabe, bis die Zeit abgelaufen ist.