Howto restore encrypted file into NextCloud

Hello,
I am (very) new to NextCloud, but so far I really like the solution…

my current issue:
I activated “encryption” and everything seems to work fine.
I am backing up the complete DATA directory to another location, and the directory structure and files do arrive there as expected (and of course encrypted), even including those private keys!

However I seem to be unable to figure how to decrypt a single file from that backup, even though I actually have those private keys.

How could I “restore” such a file into the nextCloud, and where do I find any respective documentation?

To restore a file into nextcloud basically you need to copy the file and the private keys back to your instance.

Make sure that you are using server-side encryption only on external storage (check out yellow box: https://docs.nextcloud.org/server/9/admin_manual/configuration_files/encryption_configuration.html).

Won’t be enough. Also the correct database entry is required as other information is stored in the DB.

@tflidd:
I am aware of these warnings - and we have respective messures in place to deal with these “shortcommings” of the server side encryption.

@LukasReschke:
thanks for clarifying this…
I now uploaded a previously saved file and the respective “OC_DEFAULT_MODULE” directory for that file in “/DATA/user/file_encryption”

When I login back to the website I do see the file now (after a number of minutes however), but I cannot open it, as I receive a “invalid signature” message (and the filedate seems to be reset to 01.01.1970)

So what database records do need to be “restored” as well ?

In the oc_filecache table in the database you need to restore the entry belonging to the file in question. Note that the restored entry in the database needs to be the same as the version of the file you restore. Otherwise you get invalid metadata and the file won’t decrypt.

is there somewhere a manual, how to do that?

Not really all details I think. There is one issue on the bugtracker related to the restore:

Hi,
since I am testing running nextcloud on an own server, knowing how to handle backups was very important to me.

There is a description how to do a full backupd and restore in the official dokumentation (Maintenance).
And a Website about Encryption: Encryption Configuration

ok, but when enabled …

There was no description I found how to do this for a single file or folder with activated encryption for local and external storage and without “breaking” the encryption / disabling signature check, … .

Besides others I found your post here and a comment Change since Nextcloud 9 and some others to start with.

So I looked into the file- and database structure and testet around while doing a documentation for myself, which I would like to share here.
Perhaps it will help others.

Sorry, It’s in German. Use DeepL Translator, Google Translate, … for translation.

1 Like

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.

Wiederherstellen von Ordnern ohne “Brechen” der Verschlüsselung

(Restoring folders without breaking encryption)

Alles wird auf der Konsole mit Root-Zugriff durchgeführt (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 ein Daten-Backup und Datenbank-Backup vorhanden ist.

Bekannte / ermittelte Daten

  • Datenbank: nextcloudb

  • User-ID: user1

  • Storage-ID: 3

  • wiederherzustellender Ordner: user1-ordner1

  • Datenverzeichnis der Nextcloud-Installation: /mnt/nextcloud_data/

  • Backup-Verzeichnis: /mnt/nc_bkp/

  • Daten-Backup Verzeichnis: /mnt/nc_bkp/nc-databkp_20190618/
    user1/files/user1-ordner1/
    user1/files_encryption/keys/files/user1-ordner1/
    user1/files_versions/user1-ordner1/

  • Datenbank-Backup Datei: /mnt/nc_bkp/sqlbkp_20190618.bak

  • Webverzeichnis: /srv/www/htdocs/nextcloud/

Maintenance Mode anschalten

root # cd /srv/www/htdocs/nextcloud/
root # sudo -u wwwrun php occ maintenance:mode --on

Dateien aus Backup ins Datenverzeichnis kopieren

files

root # rsync -AavxP --stats /mnt/nc_bkp/nc-databkp_20190618/user1/files/user1-ordner1/ /mnt/nextcloud_data/user1/files/user1-ordner1/

files_encryption

root # rsync -AavxP --stats /mnt/nc_bkp/nc-databkp_20190618/user1/files_encryption/keys/files/user1-ordner1/ /mnt/nextcloud_data/user1/files_encryption/keys/files/user1-ordner1/

files_versions

root # rsync -AavxP --stats /mnt/nc_bkp/nc-databkp_20190618/user1/files_versions/user1-ordner1/ /mnt/nextcloud_data/user1/files_versions/user1-ordner1/

Neue temporäre Datenbank erstellen und entsprechendes Datenbank-Backup einspielen

root # mysql -h localhost -u root -p -e “CREATE DATABASE ncbkp CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci”
root # mysql -h localhost -u root -p ncbkp < /mnt/nc_bkp/sqlbkp_20190618.bak

benötigte Datensätze rausfiltern und exportieren

root # mysql -u root -p
mysql> use ncbkp
mysql> SELECT *
INTO OUTFILE ‘/var/lib/mysql-files/folder_user1-ordner1.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-ordner1%”)
ORDER BY fileid;

Hinweis: Über die Bedingung (WHERE) muss eindeutig der wiederherzustellende Ordner (inkl. Unterordner und Dateien) gefiltert sein, ansonsten ist die Bedingung (WHERE) zu präzisieren!

Datensätze des gelöschten Ordners wieder in die Live-Datenbank importieren

mysql> use nextcloudb
mysql> LOAD DATA LOCAL INFILE ‘/var/lib/mysql-files/folder_user1-ordner1.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