KeyHelp – Umzug auf neuen Server

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. 🙂

Abonnieren
Benachrichtige mich bei
0 Comments
neueste
älteste
Inline Feedbacks
View all comments