Inhaltsverzeichnis
Letzte Aktualisierung am 22.10.2023, 20:10:06 Uhr
Ich betreibe seit einigen Jahren einen Server mit dem Control Panel KeyHelp. Langsam aber sicher neigen sich die Hardware Ressourcen dem Ende zu. Daher soll nun ein Umzug auf einen neuen Server erfolgen, damit auch zukünftig genügen Ressourcen für neue Herausforderungen zur Verfügung stehen.
In diesem Beitrag beschreibe ich die notwendigen Schritte. Sowohl auf dem bisherigen als auch neuen Server wird als Betriebssystem Ubuntu Server 22.04.3 LTS eingesetzt. Zu diesem Zeitpunkt ist KeyHelp 23.2 (Build 3096) die neuste Version. Grundlage für den Beitrag ist die Anleitung aus dem Community Forum von KeyHelp.
Vorbereitungen
Ich übernehme keine Gewährleistung, keine Verantwortung oder Haftung für etwaige Schäden, Folgeschäden, die dadurch entstehen können.
Aktueller Server
Wartungsmodus für KeyHelp aktivieren (KeyHelp UI -> Einstellungen -> Control Panel -> Wartungsmodus). Ggf auch für die verschiedenen Webseiten, welche auf der KeyHelp Instanz bereitgestellt werden.
Linux Dienste „Postfix“, „Dovecot“, „proFTPD“ stoppen/beenden.
systemctl stop postfix.service systemctl stop dovecot.service systemctl stop proftpd.service
Finale Sicherung über die KeyHelp UI (Einstellungen -> Backup) auf einem entfernen Repository erstellen lassen. Ich habe mir dafür einen Storage Box bei Hetzner gemietet. Die Daten werden über SFTP dort hin übertragen.
Benutzerkonten von MariaDB Server über phpMyAdmin auslesen und exportieren. Wichtig hierbei ist, dass für die Anmeldung das Konto „mysqladmin“ verwendet wird.
Es erscheint danach ein neues Dialogfenster. Dort sind die notwendigen SQL Befehle enthalten. Den Inhalt am Besten in einen Texteditor 1:1 kopieren.
Neue Server
Neuen (virtuellen) Server mit Ubuntu Server 22.04.3 LTS aufsetzen/installieren.
SSH Sitzung aufbauen und die Konfiguration des Zeit Dienstes ausgeben.
timedatectl
Zeitzone auf Europe/Berlin konfigurieren.
timedatectl set-timezone Europe/Berlin
Konfiguration des Zeit Dienstes prüfen.
timedatectl
KeyHelp über das Skript des Herstellers installieren (Quelle: https://www.keyhelp.de/).
wget https://install.keyhelp.de/get_keyhelp.php -O install_keyhelp.sh ; bash install_keyhelp.sh ;
Über die KeyHelp UI alle notwendigen PHP Interpreter über Konfiguration -> Funktionseinstellungen -> PHP-Interpreter installieren. Wenn natürlich auf den bisherigen KeyHelp Server keine Interpreter installiert sind, kann der Punkt übersprungen werden.
We die Möglichkeit hat, erstellt vom jetzigen Zustand noch einen Snapshot des ganzen Servers. Kann sicherlich nicht schaden. 😉
Wiederherstellung
Nachstehende Schritte werden alle auf den neuen Server durchgeführt!
Einen neues Verzeichnis mit dem Namen „restore“ erzeugen.
mkdir /restore
Backup Repository hinzufügen
Da sich diese Arbeitsschritte wiederkehrend in verschiedenen Punkten wiederholen wird, habe ich mich entschieden dies in einer extra Aufzählungspunkt zu beschreiben. Um so immer wieder darauf verweisen zu können.
KeyHelp UI aufrufen und in Einstellungen -> Backup wechseln. Dort in die Repository-Verwaltung aufrufen um das bestehende Repository hinzufügen zu können.
Parameter für das Hinzufügen des Repository eintragen und abschließend auf Speichern klicken. Im Grund sind hier die selben Daten einzutragen wie auf bestehenden KeyHelp Server!
Wenn alles geklappt hat wieder zurück auf die Übersicht wechseln. Dort gibt es automatisch ein Ereignis „Integritätsprüfung / Statistiken aktualisieren“ mit dem Status „wird in Kürze ausgeführt“.
Diese Operation sorgt dafür, dass die Snapshots des Backup Repositories eingelesen und damit später verwendet werden können. Dieser Vorgang kann einige Minuten in Anspruch nehmen. Daher nicht ungeduldig werden.
Wiederherstellung der Benutzer und Gruppen
Dazu in der KeyHelp UI das Menü Einstellungen -> Backup -> Backup wiederherstellen auswählen.
Das Verzeichnis „/etc“ aus dem neusten Snapshot wiederherstellen. Dazu ganz nach unten zum Bereich „Dateien und Verzeichnissen“ scrollen.
Danach taucht im Hauptmenü „Backup“ ein neue Operation auf. Diese wird im Rahmen des Wartungsintervall dann ausgeführt. Ist der Auftrag erfolgreich abgeschlossen gibt es im Verzeichnis „/restore“ das Verzeichnis „etc“.
Kopie der Systemdateien erstellen
cp /etc/passwd /etc/passwd.$(date '+%Y-%m-%d_%H-%M-%S') cp /etc/shadow /etc/shadow.$(date '+%Y-%m-%d_%H-%M-%S') cp /etc/group /etc/group.$(date '+%Y-%m-%d_%H-%M-%S') cp /etc/gshadow /etc/gshadow.$(date '+%Y-%m-%d_%H-%M-%S')
Benutzerkonten
Alle Benutzerkonten aus der Datei „/restore/etc/passwd“ auslesen. In der Regel beginnen alle Einträge, welche durch KeyHelp erzeugt wurden mit der ID 5xxx.
egrep "[^:]:x:5[0-9]{3}:" /restore/etc/passwd | tail -n +2 > /restore/keyhelp_passwd
Inhalt der Datei „/restore/keyhelp_passwd“ auf Vollständigkeit prüfen.
cat /restore/keyhelp_passwd xdzs:x:5001:5001::/home/users/xdzs/:/bin/bash djth:x:5002:5002::/home/users/djth/:/bin/false zaco:x:5003:5003::/home/users/zaco/:/bin/bash epvm:x:5004:5004::/home/users/epvm/:/bin/false vaon:x:5005:5005::/home/users/vaon/:/bin/false apnk:x:5006:5006::/home/users/apnk/:/bin/false ahlm:x:5007:5007::/home/users/ahlm/:/bin/false idkc:x:5008:5008::/home/users/idkc/:/bin/bash ccvv:x:5009:5009::/home/users/ccvv/:/bin/bash wihn:x:5010:5010::/home/users/wihn/:/bin/bash kxmf:x:5011:5011::/home/users/kxmf/:/bin/bash vcfa:x:5012:5012::/home/users/vcfa/:/bin/bash
Leere Datei „/restore/keyhelp_shadow“ erstellen.
cp /dev/null /restore/keyhelp_shadow
Alle Einträge der gefundenen Benutzerkonten aus „/restore/etc/shadow“ auslesen und in die Datei „/restore/keyhelp_shadow“ schreiben.
input="/restore/keyhelp_passwd" while read -r line do echo "$line" username=$(echo $line | awk -F: '{print $1}') egrep "^$username:" /restore/etc/shadow >> /restore/keyhelp_shadow done < "$input"
Inhalt der Datei „/restore/keyhelp_shadow“ auf Vollständigkeit prüfen.
cat /restore/keyhelp_shadow xdzs:$6$rounds=5000$LdJQeN8ZTwsqBW.H$h8vKtCnI6UMrkTuPCn.NDEA/vCzcq1:18520:0:99999:7::: djth:$6$rounds=5000$wX1ESet8/p4AUVhg$JbsTZDBzGR/44WgdjOBI855Z/d6PA/:18520:0:99999:7::: zaco:$6$rounds=5000$f1mnQAvtYEu6ahyK$PW7kbqYpni8XgFRVkRePDexsrFeSn1:18520:0:99999:7::: epvm:$6$rounds=5000$y5GTIB7UC6esW9mp$eax7emTvzLNm.XQIF9/yyu.Vvry.g0:18521:0:99999:7::: vaon:$6$rounds=5000$zs4cCb9YGU0nvdjS$R48nn9lrWgtyNssgDPg9j.IZeAFc91:18521:0:99999:7::: apnk:$6$rounds=5000$v0EmaKVCOytS/NQk$.vVwQ8wEX0.Znq39idXkRdwE3JX5h/:18521:0:99999:7::: ahlm:$6$rounds=5000$0LGvw2BNtzYmnDTM$GbBRQdq/Frr1B/sEQcOXRgQuZHT4E0:18521:0:99999:7::: idkc:$6$rounds=5000$7Yq.MOs6NaiT1GkE$1cEIKrPb.3DGjR8AjEk3lYhmQTwM//:18521:0:99999:7::: ccvv:$6$rounds=5000$oHWXvYa9ZBwbKmh0$gyo.oDRNxG2aKxcfJVYDF7Vao0Hi51:18521:0:99999:7::: wihn:$6$rounds=5000$OtLSYsof8XjA53Ja$oOx0O3GUPrPFs8niJbZwL.kmLVJ6N0:18521:0:99999:7::: kxmf:$6$rounds=100000$wXYtsvJUH0OAQLlm$Tb8SQawNm2OuQow8jmkr4235do/0:19029:0:99999:7::: vcfa:$6$rounds=5000$P5m0vpMcUoFk1IGJ$uqxSM/8hMlcId5afixyJtZVITak1o0:18522:0:99999:7:::
Gruppenkonten
Alle Gruppen aus der Datei „/restore/etc/group“ auslesen. Auch hier beginnen alle Einträge, welche durch KeyHelp erzeugt wurden mit der ID 5xxx.
egrep "[^:]:x:5[0-9]{3}:" /restore/etc/group | tail -n +2 > /restore/keyhelp_group
Inhalt der Datei „/restore/keyhelp_group“ auf Vollständigkeit prüfen.
cat /restore/keyhelp_group xdzs:x:5001: djth:x:5002: zaco:x:5003: epvm:x:5004: vaon:x:5005: apnk:x:5006: ahlm:x:5007: idkc:x:5008: ccvv:x:5009: wihn:x:5010: kxmf:x:5011: vcfa:x:5012:
Leere Datei „/restore/keyhelp_gshadow“ erstellen.
cp /dev/null /restore/keyhelp_gshadow
Alle Einträge der gefundenen Gruppen aus „/restore/etc/gshadow“ auslesen und in die Datei „/restore/keyhelp_gshadow“ schreiben.
input="/restore/keyhelp_group" while read -r line do echo "$line" groupname=$(echo $line | awk -F: '{print $1}') egrep "^$groupname:" /restore/etc/gshadow >> /restore/keyhelp_gshadow done < "$input"
Inhalt der Datei „/restore/keyhelp_gshadow“ auf Vollständigkeit prüfen.
cat /restore/keyhelp_gshadow xdzs:!:: djth:!:: zaco:!:: epvm:!:: vaon:!:: apnk:!:: ahlm:!:: idkc:!:: ccvv:!:: wihn:!:: kxmf:!:: vcfa:!::
Alle KeyHelp Gruppen aus der Datei „/restore/etc/group“ auslesen und in die Datei „/restore/keyhelp_tmp_group“ schreiben.
egrep "^keyhelp_" /restore/etc/group > /restore/keyhelp_tmp_group
Inhalt der Datei „/restore/keyhelp_tmp_group“ auf Vollständigkeit prüfen.
cat /restore/keyhelp_tmp_group keyhelp_file_manager:x:1001:xdzs,djth,zaco,epvm,vaon,apnk,ahlm,idkc,ccvv,wihn,kxmf,vcfa keyhelp_nossh:x:1002:djth,epvm,vaon,apnk,ahlm keyhelp_noftp:x:1003:xdzs,djth,zaco,epvm,ahlm,vaon,vcfa keyhelp_suspended:x:1004: keyhelp_chroot:x:1005:
Lese die Datei „/restore/keyhelp_tmp_group“ ein. Lese aus jeder Zeile am Anfang den Gruppennamen aus. Suche den Gruppenamen in der Datei „/etc/group “ und gebe die Zeilennummer zurück. Ersetze die Zeile Nummer X mit dem Wert aus der Datei „/restore/keyhelp_tmp_group“.
input="/restore/keyhelp_tmp_group" while read -r line do echo "$line" # groupname=$(echo $line | awk -F: '{print $1}') echo $groupname # zeilnr=$(awk '/'"$groupname"'/ { print NR; Exit }' /etc/group) echo $zeilnr # sed -i "$zeilnr"'s/.*/'"$line/" /etc/group done < "$input"
Inhalt der Datei „/etc/group“ auf Vollständigkeit prüfen.
egrep "^keyhelp_" /etc/group keyhelp_file_manager:x:1001:xdzs,djth,zaco,epvm,vaon,apnk,ahlm,idkc,ccvv,wihn,kxmf,vcfa keyhelp_nossh:x:1002:djth,epvm,vaon,apnk,ahlm keyhelp_noftp:x:1003:xdzs,djth,zaco,epvm,ahlm,vaon,vcfa keyhelp_suspended:x:1004: keyhelp_chroot:x:1005:
Alle KeyHelp Gruppen aus der Datei „/restore/etc/gshadow“ auslesen und in die Datei „/restore/keyhelp_tmp_gshadow“ schreiben.
egrep "^keyhelp_" /restore/etc/gshadow > /restore/keyhelp_tmp_gshadow
Inhalt der Datei „/restore/keyhelp_tmp_gshadow“ auf Vollständigkeit prüfen.
cat /restore/keyhelp_tmp_gshadow keyhelp_file_manager:!::xdzs,djth,zaco,epvm,vaon,apnk,ahlm,idkc,ccvv,wihn,kxmf,vcfa keyhelp_nossh:!::djth,epvm,vaon,apnk,ahlm keyhelp_noftp:!::xdzs,djth,zaco,epvm,ahlm,vaon,vcfa keyhelp_suspended:!:: keyhelp_chroot:!::
Lese die Datei „/restore/keyhelp_tmp_gshadow“ ein. Lese aus jeder Zeile am Anfang den Gruppennamen aus. Suche den Gruppenamen in der Datei „/etc/gshadow“ und gebe die Zeilennummer zurück. Ersetze die Zeile Nummer X mit dem Wert aus der Datei „/restore/keyhelp_tmp_gshadow“.
input="/restore/keyhelp_tmp_gshadow" while read -r line do echo "$line" # groupname=$(echo $line | awk -F: '{print $1}') echo $groupname # zeilnr=$(awk '/'"$groupname"'/ { print NR; Exit }' /etc/gshadow) echo $zeilnr # sed -i "$zeilnr"'s/.*/'"$line/" /etc/gshadow done < "$input"
Inhalt der Datei „/etc/gshadow“ auf Vollständigkeit prüfen.
egrep "^keyhelp_" /etc/gshadow keyhelp_file_manager:!::xdzs,djth,zaco,epvm,vaon,apnk,ahlm,idkc,ccvv,wihn,kxmf,vcfa keyhelp_nossh:!::djth,epvm,vaon,apnk,ahlm keyhelp_noftp:!::xdzs,djth,zaco,epvm,ahlm,vaon,vcfa keyhelp_suspended:!:: keyhelp_chroot:!::
Benutzer und Gruppen in das System übernehmen
Ausgelesene Benutzer und Gruppen in die entsprechenden Systemdateien übernehmen.
cat /restore/keyhelp_passwd >> /etc/passwd cat /restore/keyhelp_shadow >> /etc/shadow cat /restore/keyhelp_group >> /etc/group cat /restore/keyhelp_gshadow >> /etc/gshadow
Abschließend prüfen, ob die Dateien /etc/passwd, /etc/shadow, /etc/group und /etc/gshadow korrekt und vollständig sind. Schlussendlich muss sichergestellt werden, dass in keiner der geänderten Dateien eine Gruppe mehrfach vorhanden ist.
Wiederherstellung der KeyHelp Verschlüsselung
Die KeyHelp Verschlüsselung kommt u.a. bei Verwendung der 2-Faktor-Authentifizierung. Aber auch an anderen Stellen, so dass sich die Durchführung dieses Schritts auf jeden Fall empfohlen ist.
Die notwendige Voraussetzung installieren.
apt install jq
Value des Keys aus der Datei „/restore/etc/keyhelp/config/config.json “ auslesen, in einer Variable speichern und ausgeben.
KeyHelpEncrypKey=$(cat /restore/etc/keyhelp/config/config.json | jq .encryption.base | tr -d '"') echo $KeyHelpEncrypKey
Eine Kopie der Datei „/etc/keyhelp/config/config.json“ anlegen.
cp /etc/keyhelp/config/config.json /etc/keyhelp/config/config.json.$(date '+%Y-%m-%d_%H-%M-%S')
Den ausgelesen Wert aus der Variable „KeyHelpEncrypKey “ in der Datei „/etc/keyhelp/config/config.json“ ersetzen.
jq --arg KeyHelpEncrypKey $KeyHelpEncrypKey '.encryption.base = $KeyHelpEncrypKey' /etc/keyhelp/config/config.json > /etc/keyhelp/config/tmp.$$.json && mv /etc/keyhelp/config/tmp.$$.json /etc/keyhelp/config/config.json
Sobald der neue Wert hinterlegt ist, muss das bestehende Backup Repository gelöscht und neu eingebunden werden (siehe Kapitel Backup Repository hinzufügen).
Das Tool jq wieder deinstallieren.
apt purge jq apt autoremove
Wiederherstellen der Standarddatenbanken
Dazu in der KeyHelp UI das Menü Einstellungen -> Backup -> „Backup wiederherstellen“ auswählen. Dieses Mal nun die Datenbanken, die für den Betrieb von KeyHelp unabdingbar sind. Aktuell sind dies keyhelp, mysql, phpmyadmin, rainloop, roundcube and snappymail. Mit „Speichern“ wird wieder eine neue Operation angelegt.
Sobald die Operation gestartete wurde, wird auf der neuen KeyHelp UI wieder der Anmeldebildschirm angezeigt. Das ist dem geschuldet, dass durch die Wiederherstellung der KeyHelp Datenbank natürlich auch die bestehende Session verloren gegangen ist. Ab sofort gelten nun die Anmeldedaten der bisherigen KeyHelp Instanz.
MariaDB Datenbank Server neu starten.
systemctl restart mariadb.service
Status des Datenbank Servers prüfen.
systemctl status mariadb.service ● mariadb.service - MariaDB 10.6.12 database server Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2023-09-26 17:06:04 CEST; 21s ago Docs: man:mariadbd(8) https://mariadb.com/kb/en/library/systemd/ Process: 17077 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS) Process: 17078 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
Zu diesem Zeitpunkt erhält man bei der KeyHelp UI im Browser einen Fehler/Error 500. Das liegt daran, dass natürlich zum Einen die Passwörter für die SQL Benutzer gesetzt werden müssen und KeyHelp natürlich auch die vorherigen Passwörter kennen muss.
Eine SQL Sitzung über SSH starten.
mysql
Die von Kapitel 1.0.1 (Aktueller Server) gespeicherten SQL Befehle kopieren und in der Sitzung vollständig einfügen und ausführen.
Die Änderungen für die Benutzerkonten anwenden.
flush privileges;
Sitzung/Verbindung zum SQL Server beenden.
exit;
KeyHelp Konfigurationsdatei kopieren und vorhandene überschreiben.
cp /restore/etc/keyhelp/config/config.json /etc/keyhelp/config/config.json
Abschließend funktioniert nun auch wieder der Aufruf der KeyHelp UI. Als Anmeldedaten können die Daten der bisherigen Instanz genutzt werden.
Durch das Zurückspielen der Datenbanken sind unter Konfiguration -> Backup die Operationen nicht mehr aktuell. Daher die Repository Verwaltung aufrufen, das vorhandene Repository editieren. In diesen Fall an den Einstellungen nichts ändern und auf „Speichern“ klicken. Damit verbunden wird erneut ein Integritätsprüfung vorgenommen. So dass die Daten für den Bereich „Backup“ auch in der Datenbank auf Stand gebracht wird.
Wiederherstellen von Benutzerdaten
Dazu in der KeyHelp UI das Menü Einstellungen -> Backup -> „Backup wiederherstellen“ auswählen. Es können nun beliebige Elemente (E-Mail Konten, Datenbanken, Benutzerverzeichnisse, etc.) ausgewählt werden.
Auf keinen Fall dürfen Standard Datenbanken (keyhelp, mysql, phpmyadmin, rainloop, roundcube and snappymail) und die Verzeichnisse /etc/ und /root/ ausgewählt werden – unter keinen Umständen.
Im Normalfall wird das Verzeichnis „/home/keyhelp“ nicht benötigt. Anders sieht es bei der Nutzung von „Whitelabel“ aus. Ist das der Fall muss noch zusätzlich das Verzeichnis “ /home/keyhelp/www/keyhelp.white_label“ wiederhergestellt werden.
Mit „Speichern“ wird wieder eine neue Operation angelegt. Je nach Anzahl von Elementen und dessen Größe kann die Wiederherstellung etwas Zeit in Anspruch nehmen.
Bestehende SSL Zertifikate übernehmen
Eine Sicherung des Verzeichnisses „/etc/ssl/keyhelp“ anlegen.
mv /etc/ssl/keyhelp /etc/ssl/keyhelp.$(date '+%Y-%m-%d_%H-%M-%S')
Das Verzeichnis „/restore/etc/ssl/keyhelp/“ nach „/etc/ssl/ “ kopieren.
cp -av /restore/etc/ssl/keyhelp/ /etc/ssl/
Abschließende Arbeiten
KeyHelp Konfiguration neu schreiben
In der SSH Sitzung den Befehl „keyhelp-toolbox“ eingeben und aufrufen. Den ersten Eintrag im Menü durch das Drücken der Taste „1“ eingeben und bestätigen.
Die Sicherheitsabfrage mit den Buchstaben „C“ bestätigen.
Das kann wie die Wiederherstellung der Daten auch ein wenig Zeit in Anspruch nehmen. Wenn die Aufgabe am Ende angekommen ist, sollte eine grüne Abschlussmeldung zu sehen sein.
Perfekt. Die Toolbox beenden und abschließend den Server neu starten.
reboot
Löschen aller Sicherungsdateien
Wenn der Umzug abgeschlossen ist, alles läuft wie es soll und die Kinderkrankheiten behoben sind, darf man nicht vergessen die erstellen Sicherungen der verschiedenen Verzeichnisse und Dateien zu löschen.
ll /etc/ssl/ | grep "keyhelp." drwxr-xr-x 5 root root 4096 Feb 18 2023 keyhelp.2023-09-26_21-05-48/
ll / | grep "restore" drwxr-xr-x 3 root root 4096 Sep 26 20:17 restore/
ll /etc/ | grep "passwd\|shadow\|group.\|gshadow." -rw-r--r-- 1 root root 1379 Sep 26 20:06 group.2023-09-26_20-06-11 -rw-r--r-- 1 root root 1262 Sep 26 20:06 group.2023-09-26_20-06-55 -rw-r--r-- 1 root root 1379 Sep 26 21:17 group.2023-09-26_21-17-08 -rw-r----- 1 root root 1141 Sep 26 21:17 gshadow.2023-09-26_21-17-12 -rw-r--r-- 1 root root 3042 Sep 26 21:17 passwd.2023-09-26_21-17-01 -rw-r----- 1 root root 3123 Sep 26 21:17 shadow.2023-09-26_21-17-05
ll /etc/keyhelp/config/ | grep "config" -rw-r--r-- 1 root root 420 Sep 26 17:23 config.json.2023-09-26_17-23-51 -rw-r--r-- 1 root root 350 Sep 26 17:08 config.json.bak2
Viel Spaß beim Ausprobieren. 🙂