Wiederherstellen von einzelnen Dateien ohne “Brechen” der Verschlüsselung
(Restoring single files without breaking encryption)
Vorbemerkungen
Wenn ein User bei eingeschalteter Verschlüsselung eine Datei gelöscht hat, wäre der einfachste Weg sie aus dem Papierkorb wiederherzustellen.
Sollte dies jedoch nicht möglich sein, muss man das letzte Backup bemühen, in dem der aktuelle / gewünschte Stand der Datei enthalten ist.
Dazu muss man:
- Daten aus dem data-Verzeichnis und
- zugehörige Datenbankeinträge wiederherstellen.
Hier am Beispiel einer Datei auf dem eigenen Server. (Bei externem Speicher sollte es analog funktionieren).
Die Durchführung in diesem Beispiel erfolgt über die Konsole mit Root-Zugriff (su), hier unter openSUSE 15.
Die Pfade, Ordner- und Dateinamen, Befehle… sind an die eigene Installation bzw. Distribution anzupassen.
So heißt z.B. der Webserver-User unter Debian “www-data” und nicht wie hier “wwwrun”.
Es wird weiterhin davon ausgegangen, dass Daten-Backup und Datenbank-Backup vorhanden sind.
Einstellungen / Parameter für das Beispiel
- Web-Verzeichnis: /srv/www/htdocs/nextcloud/
- Datenverzeichnis: /mnt/nextcloud_data/
- Datenbankname: nextcloudb
- Wiederherzustellende Datei: user1-testfile-local.txt
- Nextcloud User (User-ID): user1
- Ermittelte storage_id von user1: 3
** auf diesem Storage ist die weiderherzustellende Datei abgespeichert
** herauszufinden: siehe weiter unten
- Backup-Verzeichnis: /mnt/nc_bkp/
für Webdaten, Datenverzeichnis und Datenbankexport
Maintenance mode einschalten
root # cd /srv/www/htdocs/nextcloud/
root # sudo -u wwwrun php occ maintenance:mode --on
Wiederherstellen der Datei aus dem “data”-Backup-Verzeichnis
root # rsync -Aavx ‘/mnt/nc_bkp/nc-databkp_ 20190505/user1/files/user1-testfile-local.txt’ ‘/mnt/nextcloud_data/user1/files/user1-testfile-local.txt’
root # rsync -Aavx ‘/mnt/nc_bkp/nc-databkp_20190505/user1/files_encryption/keys/files/user1-testfile-local.txt/’ ‘/mnt/nextcloud_data/user1/files_encryption/keys/files/user1-testfile-local.txt/’
Das reicht aber nicht aus:
Also müssen die Datenbankeinträge für die Datei ebenfalls wiederhergestellt werden.
Datenbank
- User-ID (uid): Tabelle “oc_users”
- Storages: Tabelle “oc_storages”
Zuordnung Storage zu User herausfinden
Um herauszufinden welcher Storage dem “user1” zugeordnet ist, kann man in der Datenbanktabelle “oc_mounts” nachsehen.
Der für uns relevante Speicher ist hier im Beispiel “storage_id: 3”.
mysql> USE nextcloudb;
mysql> SELECT * FROM oc_mounts WHERE oc_mounts.user_id = “user1”;
Beim Erstellen einer Datei (und nach Veränderung des Inhalts) werden in der Datenbanktabelle verschiedene Einträge gemacht (für die Datei selbst, sowie zugehöriger Encryption-Eintrag und Versions-Eintrag (Signatur)).
Anzusehen zum Beispiel über:
mysql> SELECT fileid, storage, name
FROM oc_filecache
WHERE (oc_filecache.storage = “3”) AND (oc_filecache.path LIKE “%user1-testfile-local%”)
ORDER BY fileid;
Wiederherstellen der Datenbankeinträge für die Datei
Temporäre Datenbank zur Einspielung eines Datenbank-Backups erstellen
root # mysql -u root -p
mysql> CREATE DATABASE nextcloudb_bkp CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Entsprechendes Datenbank-Backup importieren
root # mysql -u root -p nextcloudb_bkp < ‘/mnt/nc_bkp/sqlbkp_20190505.bak’
Einträge in Datenbank ansehen:
mysql> USE nextcloudb_bkp;
mysql> SELECT fileid, storage, path
FROM oc_filecache
WHERE (oc_filecache.storage = “3”) AND (oc_filecache.path LIKE “%user1-testfile-local%”)
ORDER BY fileid;
Die Ausgabe muss eindeutig die wiederherzustellende Datei betreffen, ansonsten ist die Bedingung (WHERE) zu präzisieren.
Benötigte Datenbankeinträge für die Wiederherstellung exportieren
Vorbemerkung: In den Einstellungen der Datenbank kann der Export auf ein bestimmtes Verzeichnis beschränkt sein. Dies findet man heraus mit:
mysql> show variables like “secure_file_priv”;
Entsprechend ist der folgende Befehl anzupassen.
mysql> SELECT *
INTO OUTFILE ‘/var/lib/mysql-files/filerecords.exp’
FIELDS TERMINATED BY ‘,’
ENCLOSED BY ‘"’
ESCAPED BY ‘"’
LINES TERMINATED BY ‘\r\n’
FROM oc_filecache
WHERE (oc_filecache.storage = “3”) AND (oc_filecache.path LIKE “%user1-testfile-local%”)
ORDER BY fileid;
Datenbankexport von der temporären Datenbank in die Live-Datenbank einspielen
mysql> USE nextcloudb;
mysql> LOAD DATA LOCAL INFILE ‘/var/lib/mysql-files/filerecords.exp’
INTO TABLE oc_filecache
FIELDS TERMINATED BY ‘,’
ENCLOSED BY ‘"’
ESCAPED BY ‘"’
LINES TERMINATED BY ‘\r\n’;
Ensure sync clients can recover from the restored backup
root # cd /srv/www/htdocs/nextcloud/
root # sudo -u wwwrun php occ maintenance:data-fingerprint
Maintenance mode ausschalten
root # cd /srv/www/htdocs/nextcloud/
root # sudo -u wwwrun php occ maintenance:mode --off
Die Datei ist nun für “user1” wiederhergestellt.