Ereignishorizont
CyberPanel

CyberPanel

Cyber Panel

Nach dem ich am 28.10.2024 ein Abuse Meldung vom meinem Hosting-Anbieter bekomme hatte, begannen ein paar aufregende Tage. In der Software meines selbst gehosteten Webhosting Panels CyberPanel (GitHub) fand ein Sicherheitsforscher ein RCE-Sicherheitslücke (Remote Code Execution). Leider veröffentlicht er mit seinem Blog vom 27.10.2024 auch gleich einen Exploit. Es sollte nicht lange dauern, dann waren auch schon tausende von Webhosting Server und noch viel mehr Webseiten infiziert. Crypto-Mining-Malware, Ransomware die Dateien als .psaux, .encryp, .locked, etc. verschlüsseln oder den Server übernommen bzw. unbrauchbar machen.

Bild: Hinweismeldung eines mit Ransomware betroffenen Servers.
Die Lösegeldforderungen wurden übrigens auch in Bitcoin beglichen.

Die Not war groß und die Vorkehrungen für meine Webseite erwiesen sich als doch eher dürftig. Wer rechnet denn schon damit, das ein kleine private Webseite Ziel eines großen Angriffs wird? Tja, wi auch immer, ich hatte Glück im Unglück. Ich hatte verschiedene Backups und wusste wie ich sie wiederherstellen kann, da ich ein paar Wochen vorher von einem Hosting-Anbieter zum anderen migriert war. Trotzdem hat es eine Weile gedauert und viel Nerven gekostet. Dabei habe ich viel gelernt und sehe jetzt, dass man jeden Virtual Private Server maximal absichern muss. In diesen Artikel habe mal lose ein ppar Punkte mal zusammengestellt. Vielleicht nützt es ja dem einen oder anderen.

1. VPS einrichten und härten

Hinweis: Dieses Tutorial verwendet einen Ubuntu 22.04 LTS Server.

ssh root@yourIPaddress

1.1 Grundlagen

Update / Upgrade
apt update && apt upgrade -y

-> Evtl. müsst ihr Enter drücken.

Hinweis: Die ufw (uncomplicated firewall) wird hier nicht installiert, da eine Firewall später mit CyberPanel kommt. Den Status könnt ihr später wenn CyberPanel installiert ist mit systemctl status firewalld prüfen oder im CyberPanel selbst unter SERVER > Security > Firewall. Den SSH Port solltet ihr auch nur in CyberPanel unter SERVER > Security > Secure SSH einstellen und nicht in der sshd_config, sonst sperrt ihr euch ggf. aus.

fail2ban
apt install fail2ban -y 
systemctl enable fail2ban
systemctl start fail2ban
systemctl status fail2ban

-> Zwei mal mit Enter bestätigen.

Hinweis: Swapfile wird hier nicht installiert, da es später automatisch mit CyberPanel kommt.

Hinweis: Vom Anlegen eines dedizierten Benutzers für CyberPanel würde ich vorerst ebenfalls abraten. Den Schutz des Servers stärken wir gleich mit weiteren Maßnahmen, wie SSH-Key und später auch der Individualisierung des SSH-Port.

1.2 SSH-Key Authentifizierung

Ein sehr starker Schutz in Form für einer Authentifizierungsmethode ist die Verwendung der Public-Key-Authentifizierung. Ihr generiert auf eurem lokalen Rechner einen Schlüsselpaar und übergebt den öffentlich Schlüssel (z.B. id_rsa.pub) dem remoten Rechner. Wenn ihr euch beim Host (remote) anmelden wollte, kennt er den öffentlichen Schlüssel und fragt etwas ab das nur der Besitzer des privaten Schlüssels kennen kann. Euer Rechner kann das beantworten, da ihr den privaten Schlüssel habt. Ihr könnt euren privaten Schlüssel auch noch einmal extra mit einem Passwort verschlüsseln, dann werdet ihr bei der Verbindung noch nach dem Passwort zum entschlüsseln gefragt. Damit könnt ihr euch sicher authentifizieren, da der Angreifer den Schlüssel (eine Textdatei) besitzen muss.

Hinweis: Ihr könnte den Private-Key selbst verschlüsseln, falls der Rechner mal kompromittiert wird und jemand Zugang zum Schlüssel bekommt.

nano ~/.ssh/authorized_keys

-> Public-Key (z.B. id_rsa.pub) hinterlegen -> STRG+X -> Y -> Enter -> exit -> ssh root@yourIPaddress

-> Ab jetzt könnt ihr euch schon mal dem SSH-Key authentifizieren! 🦾

Hinweis: Ihr könnt mehrere Public-Key von verschiedenen Rechen hinterlegen, um euch nicht versehentlich auszuschließen, falls ein Rechner mal ausfällt.

1.3 Dedizierten Benutzer anlegen

Für mehr Sicherheit erzeugen wir einen neuen Benutzer, mit dem wir uns zukünftig einloggen. Er bekommt zwar ebenfalls „Root“-Rechte, muss sich aber immer wieder mit seinem Passwort identifizieren. Das bietet mehr Sicherheit, eine bessere Nachvollziehbarkeit und schützt vor menschlichen Fehlern.

adduser cypherpunk

-> Passwort vergeben, die Dateneingabe ist optional.

usermod -aG sudo cypherpunk 

-> Dem Benutzer Root-Rechte geben.

Wichtig: Konfigurationsdatei des OpenSSH Server bearbeiten.

sudo nano /etc/ssh/sshd_config  

Erweitern mit:

AllowUsers cypherpunk

-> STRG+X -> Y -> Enter

Hinweis: Wenn ihr den VPS auch weiterhin mit dem „root“-User erreichen wollt, müsst ihr, falls noch nicht vorhanden, auch die Zeile AllowUsers root in die Konfigurationsdatei hinzufügen. Andernfalls wird euch beim Versuch, euch als „root“-User anzumelden, die Fehlermeldung „Permission denied, please try again.“ angezeigt. Nach fünf fehlgeschlagenen Versuchen wird der Zugriff für 10 Minuten komplett gesperrt, da Fail2ban sämtliche Verbindungen blockiert. Und wenn ihr für den neuen User vergesst euren Public-SSH-Key zu hinterlegen, dann habt ihr euch komplett ausgeschlossen. Deswegen:

Wichtig: Euren öffentlichen SSH-Schlüssel dem neuen User bekannt geben:

mkdir ~/.ssh
nano ~/.ssh/authorized_keys

-> Euren Public-Key hinterlegen -> STRG+X -> Y -> Enter -> exit -> ssh cypherpunk@yourIPaddress

1.4 Passwort-Authentifizierung und root-User deaktivieren

WARNUNG: Wenn ihr hier einen Fehler macht, könnt ihr euch schnell selbst aussperren. Handelt mit Bedacht und macht vorher ein Backup!

Wenn ihr euch mit SSH-Key des neuen Users anmelden könnt, dann besteht jetzt noch die Option den root-User und die Passwort-Authentifizierung zu deaktivieren, um Angriffe über die Passwort-Authentifizierung bzw. dem root-User auszuschließen.

nano /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
# AllowUsers root

-> STRG+X -> Y -> Enter

Hinweis: Mit # AllowUsers root ist auch ausgeschlossen, dass man vom CypberPanel den Schalter Root-User umlegen kann. Wenn ihr das vom CyberPanel bedienen können wollt, müsst ihr die Auskommentierung # vor AllowUsers root wegmachen. Dann gilt nur das yes/no des PermitRootLogin.

Jetzt den VPS herunterfahren, ggf. ein Snapshot zu machen und alles einmal neu durchzustarten.

sudo systemctl poweroff

-> Um ein Backup eures Virtual Private Servers als Snapshot zu erstellen, findet ihr auf der Webseite eures VPS-Hosting-Anbieters sicherlich eine entsprechende Funktion. Dabei wird ein komplettes Abbild (Image) eurer Festplatte bzw. eures VPS erstellt. Dieses könnt ihr jederzeit wiederherstellen, um den Zustand des Servers zu einem früheren Zeitpunkt wiederherzustellen. Anschließend startet ihr den Server über die Webseite neu und meldet euch ab sofort immer mit dem neuen Benutzer an.

ssh cypherpunk@yourIPaddress

2. Cyber Panel installieren und einrichten

2.1 Die Installation von CyberPanel

Hinweis: Um diesen Tutorial zu folgen sollte der Hostname des Server nicht der eurer Domain sein. Also nicht yourdomain.xyz. Nennt den Host zum Beispiel wie hier einfach CyberPanel.

Hinweis: Bei Verwendung des root-User kann nachfolgend `sudo su – -c “ .. “ entfallen.

sudo su - -c "sh <(curl https://cyberpanel.net/install.sh || wget -O - https://cyberpanel.net/install.sh)"

-> Während der Installation: 1+Enter, 1+Enter, 6x Enter

Achtung: Am Ende der Installation wird euch CyberPanel Zugang angezeigt:

   ...
   CyberPanel Successfully Installed
   ...
   Visit: https://yourIPaddress:8090
   Panel username: admin
   Panel password: bAJWFpasswordWEjV6
   ...

-> Nach dem sichern der Daten die Meldung Would you like to restart your server now? [y/N]: mit ENTER bestätigen.
-> sudo systemctl poweroff und ein Snapshot machen.

2.2 Das Einrichten von CyberPanel

Nach dem ihr euch im CyberPanel angemeldet habt sehr ihr oben den „Wet-up wizward“. Der wird euch durch euch helfen die erste Webseite einzurichten. Am besten zeigt schon die die A- und AAAA-Adresse auf die IP-Adresse des CyberPanel Servers. Dann logt euch auf CyberPanel ein und folgt diesen Schritten.

1. Falls verfügbar, nutzt den „Set-up wizward“ der euch oben angezeigt wird. Der erleichtert euch das Einrichten der ersten Webseite.
2. Wir der nicht mehr angezeigt, könnt ihr das auch manuell einrichten unter MAIN > Websites > New Websites erstellen, falls nicht schon eingerichtet.
3. FTP-Account auf dem neuen Server anlegen unter MAIN > FTP mit Benutzername: yourusername => admin_yourusername. Die IP kennt, der Port ist 21 und als FTP-Client könnt ihr FileZilla verwenden.

3. Datensicherung und Migration

Bevor wir Daten wiederherstellen / migrieren können, müssen wir sie erst sichern.

3.1 Datensicherung

Mindestens drei Methoden der Datensicherung würde ich empfehlen:

A. Snapshots des kompletten VPS. Manuell zwischendurch, vor Updates, etc. und zeitgesteuert.
B. Automatische zeitgesteuerte Backups auf externe Cloud-Laufwerke mit Plugin Software wie z.B. UpdraftPlus.
C. Manuelles sichern der Daten, Datenbank und aktuellem Website-Zustands-Bericht.

Zu Punkt A. und B. gibt es ausreichend Information vom Hosting-Anbieter der im Internet. Zu Methode C habe ich hier einen kleiner Leitfaden zusammengestellt:

1. Auf dem lokalen Rechner einen Ordner mit Name YYMMDD anlegen.
2. Im CyberPanel Webserver unter MAIN > Websites > List Websites > yourdomain.xyz > File Manager den Ordner public_html mit .tar.gz komprimieren.
3. Die Datei public_html.tar.gz downloaden und im Verzeichnis ablegen.
4. Die MySQL Datenbank der Webseite mit phpMyAdmin unter MAIN > Database > PHPMYAdmin von der Quelle exportieren. Dazu links dein Datenbankverzeichnis your_databasename markieren, exportieren (Schnell und SQL). Den Download your_databasename.sql ebenfalls in den Ordner ablegen.
5. In WordPress unter Werkzeug > Website Zustand > Bericht den „Website-Zustands-Bericht“ in die Zwischenablage kopieren und im Backup-Ordner eine Textdatei erstellen, in die ihr den Bericht kopiert und speichert. Dort stehen wichtige Informationen, wie z.B. die verwendetet PHP-Version und Plugins.

Hinweis: Die Datenbank ggf. vorher aufräumen, damit es beim Import zu keinen Komplikationen kommt. Sollte die Webseite schon etwas älter sein und zwischen durch viele Updates / Upgrades gemacht worden sein, kann sich Datenmüll, unzählige Revisionen und kaputte Verknüpfungen angesammelt haben, die wiederum zu Konflikte beim importieren führen kann. Deshalb auf der WordPress Admin seine z.B. mit einem Plugin wie WP-Sweep, WP Optimize oder Advanced Database Cleaner die Datenbank vorher bereinigen. Das spart auch viel Speicherplatz. In PHPMYAdmin findet ihr auch noch ein Werkzeug zum bereinigen. Das alleine reicht manchmal aber nicht.

Empfehlung: Wollt ihr tagesaktuelle WordPress Format und Textdaten einer Seite zwischendurch extern sichern, dann schaltet im WordPress Block Editor oben rechts den Editor > Code Editor ein. Jetzt könnt ihr den kompletten Code als Text der Seite markieren und in die Zwischenablage kopieren. Den Inhalt dann einfach in eine Textdatei auf eurem Rechner ablegen.

3.2 Datenwiederherstellung / Datenmigration

3.2.1 Daten übertragen

Die Datenwiederherstellung eines Snapshot auf dem VPS-Hosting Anbieter ist einfach. Das wiederherstellen mithilfe von UpdraftPlus ist auch gut dokumentiert. Das manuelle migrieren der Datensicherung und der Datenbank hingehen, erfordert ein paar Schritte die man wissen muss. Hier also der Hinweis wie man Daten aus dem Backup Ordner nach Sicherungsmethode C auf einem neuen neu eingerichteten Server wieder herstellen.

1. Mit FileZilla die Dateien public_html.tar.gz und your_databasename.sql hochladen ins Verzeichnis
2. In CyberPanel unter Websites > List Websites > File Manager den komprimierten Ordner public_html.tar.gz entpacken und in den Ordner public_html verschieben.

3.2.2 Daten migrieren

1. Eine leer Datenbank mit Database > Create Database erstellen:

Enter -> databasename, username and password
databasename: your_databasename
username your_username
password: …

2. Mit der Befehlszeile (cli) auf dem Server einloggen und die Datenbank importieren:
mysql -u your_username -p your_databasename < /home/yourdomain.xyz/public_html/your_databasename.sql
Hinweis: Das Passwort ist das der neuen leeren Datenbank, die zuvor erstellt wurde, nicht der alten Datenbank.

3.2.3 Datenbank Verknüpfung einstellen

1. Auf dem CyberPanel im File Manager der Seite die Datei public_html/wp-config.php öffnen
2. Unter DatabaseName, UserName und Passwort die neue Werte einstellen und den Host auf localhost prüfen.

Die verwendete PHP-Version aus dem „Website-Zustands-Bericht“ der Datensicherung prüfen und ggf. unter MAIN > Websites > New Websites > Manage > Change PHP einstellen.

3.2.4 Abschließende Schritte

1. Ggf. unter Websites / List Websites / Manage / Rewrite Rules prüfen / einstellen.
2. Nicht vergessen, bei einem neuem Server mit neuer IP, auch die IP-Weiterleitung zu ändern. Beim Domainanbieter unter DNS den A und AAAA Eintrag auf die neu IP der VPS mit Cyber Panel einstellen. Dann prüfen zum Beispiel mit: nslookup.io.
3. Den VPS einmal neu starten systemctl reboot.
4. Zum Test kann man z.B. unter ./public_html/ eine Textdatei mit Name neu.txt anlegen. mit dem Browser sollte man die Datei dann einfach mit yourdomain.xyz/neu.txt aufrufen können.
5. Bekommt ihr noch TLS/SSL Fehlermeldungen, dann einmal in CyberPanel unter MAIN > SSL > Manage SSL > Issue SSL durchführen.

4. Anhang

4.1 Quellen und weiterführenden Informationen

Website : https://www.cyberpanel.net
Forums : https://forums.cyberpanel.net oder https://community.cyberpanel.net/
Wikipage: https://docs.cyberpanel.net
Docs : https://cyberpanel.net/docs/
GitHub: https://github.com/usmannasir/cyberpanel

4.1 Option: CyberPanel Panel vorübergehend deaktivieren

Was nicht da ist, kann auch kein Einfallstor sein. Die Webseiten laufen auch ohne aktiven CyberPanel. Hier ein paar Befehle zum stoppen, deaktivieren des Autostarts, starten und aktiveren des Autostarts und zum Prüfen des Status.

sudo systemctl stop lscpd
sudo systemctl disable lscpd
sudo systemctl start lscpd
sudo systemctl enable lscpd
sudo systemctl status lscpd

4.2 CyberPanel Version anzeigen und Upgrade durchführen

CyberPanel Version und Commit prüfen:

cd /usr/local/CyberCP/
sudo git log -1

Im GitHub Repository könnt ihr auf neuer Versionen und den Commits prüfen: https://github.com/usmannasir/cyberpanel

CyberPanel Upgrade durchführen:

sudo su - -c "sh <(curl https://raw.githubusercontent.com/usmannasir/cyberpanel/stable/preUpgrade.sh || wget -O - https://raw.githubusercontent.com/usmannasir/cyberpanel/stable/preUpgrade.sh)"

Bekommt ihr beim Upgrade die Fehlermeldung:

 TypeError: canonicalize_version() got an unexpected keyword argument 'strip_trailing_zero'

Dann ein Pip Pakete Update durchführen:

sudo pip install packaging==22

Komplette Fehlermeldung siehe pastebin.com.

4.3 fail2ban Logfiles

# Show simple logfiles
sudo cat /var/log/fail2ban.log
# Show sortet logfiles
sudo awk '($(NF-1) == "Ban"){print $NF}' /var/log/fail2ban.log \
  | sort | uniq -c | sort -n

And see here and here.

4.4 CyberPanel Firewall und Sonstiges zum stärken

Den Status der CyberPanel Firewall könnt ihr unter SERVER > Security > Firewall ersehen. Direkt prüfen und die Logs aufrufen könnt ihr sie mit Befehlszeile:

sudo systemctl status firewalld
sudo journalctl -u firewalld

Die SSH Port Einstellung, den Root Login und die selbst hinterlegten SSH Schlüssel könnte ihr unter SERVER > Security > Secure SSH einsehen bzw. verstellen.

Individuellen SSH-Port einstellen

In der Firewall z.B. den Port 1001 freigeben unter SERVER > Security > Firewall

Rule Name = SSHnew / tcp / 0.0.0.0/0 / Port = 1001

Erstellt mit Liebe 🧡 Seit 858407 / 868592

– Lightning ⚡ (er)leben –

Lightning Adresse zur Unterstützung
axelhamburch@ereignishorizont.xyz