encryption
Serverseitige Verschluesselung fuer owncloud.online. Die App registriert das
Verschluesselungsmodul OC_DEFAULT_MODULE ("Default encryption module") und
verschluesselt die Inhalte der Dateien, die ueber owncloud.online geschrieben
werden. Sie ist ein PHP-8.4-Fork des urspruenglich von der ownCloud GmbH
entwickelten Moduls; die Krypto-Logik ist unveraendert, geaendert wurden
Plattformanforderungen, Bezeichnungen und Code-Idiome.
Was die App tut
- Verschluesselt beim Schreiben den Inhalt jeder Datei. Dateinamen, Ordnerstruktur, Freigaben und Datenbankinhalte bleiben unverschluesselt.
- Verwendet je Datei einen eigenen Dateischluessel. Voreingestellter Cipher
ist
AES-256-CTR(Crypt::DEFAULT_CIPHER). - Versiegelt den Dateischluessel mit den oeffentlichen Schluesseln aller
Berechtigten (
openssl_seal,AES-256-CBC) und legt fuer jeden Berechtigten einenshareKeyab. Aeltere, mit RC4 versiegelte Schluessel werden beim Lesen weiterhin akzeptiert. - Kennt zwei Betriebsarten: Hauptschluessel und Benutzerschluessel (siehe unten).
- Bringt fuenf
occ-Befehle mit, unter anderem zum Neuerzeugen des Hauptschluessels und zum Reparieren der Versionsangabe verschluesselter Dateien.
Die App verschluesselt nur, was nach dem Einschalten geschrieben wird.
Bestehende Dateien werden erst durch einen ausdruecklichen Lauf
(occ encryption:encrypt-all) verschluesselt.
Voraussetzungen
| Komponente | Anforderung |
|---|---|
| owncloud.online | 10.12 bis 11 (appinfo/info.xml) |
| PHP | 8.4 oder neuer |
| PHP-Erweiterung | openssl |
secret |
muss in config/config.php gesetzt sein |
Der Wert secret aus config.php ist im Hauptschluesselbetrieb das Passwort,
mit dem der private Hauptschluessel verschluesselt wird
(KeyManager::getMasterKeyPassword()). Geht dieser Wert verloren, sind die
Daten nicht mehr zu entschluesseln. Sichern Sie config.php und die
Schluesselablage gemeinsam.
Installation
Der einfachere Weg ist die Installation ueber den Markt in der Administrationsoberflaeche. Manuell:
cd /var/www/owncloud.online/apps
git clone https://github.com/BWTECH-github/encryption.git
cd encryption
composer install --no-dev
chown -R www-data:www-data .
sudo -u www-data php8.4 ../../occ app:enable encryption
Betriebsarten
Hauptschluessel
Ein einziges Schluesselpaar fuer die gesamte Instanz. Der private
Hauptschluessel wird mit dem secret aus config.php verschluesselt
abgelegt. Benutzerpasswoerter spielen fuer den Zugriff keine Rolle; ein
Passwortwechsel oder ein Zuruecksetzen des Passworts beruehrt die
Verschluesselung nicht. Die App registriert in dieser Betriebsart die
Passwort-Hooks gar nicht erst (UserHooks::addHooks()).
Aktiv, wenn der App-Wert useMasterKey auf 1 steht. Ist die
Verschluesselung eingeschaltet und weder useMasterKey noch
userSpecificKey gesetzt, setzt die App beim Start selbst useMasterKey=1.
Benutzerschluessel
Je Benutzer ein Schluesselpaar; der private Schluessel ist mit dem
Anmeldepasswort verschluesselt. Diese Betriebsart wird nur noch fuer
bestehende Installationen unterstuetzt: Die Auswahlliste im Administrations-
panel bietet ausschliesslich "Hauptschluessel" an, und bei gesetztem App-Wert
userSpecificKey blendet das Panel einen Hinweis ein, dass diese Betriebsart
veraltet ist. Nur in dieser Betriebsart gibt es den
Wiederherstellungsschluessel und die persoenlichen Verschluesselungs-
einstellungen.
Verschluesselung einschalten
Die drei Schritte sind: App aktivieren, Verschluesselung im Kern einschalten, Modul als Standardmodul setzen.
sudo -u www-data php8.4 occ app:enable encryption
sudo -u www-data php8.4 occ encryption:enable
sudo -u www-data php8.4 occ encryption:list-modules
sudo -u www-data php8.4 occ encryption:set-default-module OC_DEFAULT_MODULE
sudo -u www-data php8.4 occ encryption:status
encryption:enable, encryption:list-modules, encryption:set-default-module
und encryption:status stammen aus dem Kern von owncloud.online, nicht aus
dieser App.
Die Betriebsart waehlen Sie unter Einstellungen > Administrator >
Verschluesselung im Abschnitt "Standard-Verschluesselungs-Modul": Eintrag
"Hauptschluessel" auswaehlen und "Diesen Modus immer verwenden" bestaetigen.
Die Schaltflaeche setzt den App-Wert useMasterKey auf 1. Auf der
Kommandozeile entspricht das:
sudo -u www-data php8.4 occ config:app:set encryption useMasterKey --value 1
Nach dem Umschalten muessen sich alle Benutzer neu anmelden, damit ihre Schluessel in der Sitzung initialisiert werden.
Alle Dateien verschluesseln und wieder entschluesseln
Beide Befehle gehoeren zum Kern; die Arbeit erledigen die Klassen
EncryptAll und DecryptAll dieser App.
sudo -u www-data php8.4 occ encryption:encrypt-all -y
Im Hauptschluesselbetrieb wird der Hauptschluessel geprueft und, falls er noch
fehlt, erzeugt (KeyManager::validateMasterKey()); anschliessend werden die
Dateien aller Benutzer verschluesselt. Im
Benutzerschluesselbetrieb erzeugt der Lauf zuvor fuer jeden Benutzer ein
Schluesselpaar mit einem generierten Passwort und gibt die Passwortliste aus
oder versendet sie per E-Mail; bestehende Versionen und Dateien im Papierkorb
werden dabei nicht verschluesselt.
sudo -u www-data php8.4 occ encryption:decrypt-all
sudo -u www-data php8.4 occ encryption:decrypt-all alice -m password
| Argument / Option | Bedeutung |
|---|---|
user (Argument) |
nur diesen Benutzer entschluesseln, optional |
-m, --method |
recovery oder password |
-c, --continue |
yes oder no, Vorgabe no |
Im Hauptschluesselbetrieb wird kein Passwort benoetigt, der Lauf verwendet den
Hauptschluessel. Im Benutzerschluesselbetrieb gilt: password funktioniert nur
fuer einen einzelnen Benutzer; fuer alle Benutzer ist ausschliesslich
--method recovery moeglich, und das Passwort des Wiederherstellungs-
schluessels wird aus der Umgebungsvariablen OC_RECOVERY_PASSWORD gelesen.
Schluesselablage
Die Schluessel liegen im Datenverzeichnis. Wurzel ist standardmaessig das
Datenverzeichnis selbst; sie laesst sich mit den Kernbefehlen
encryption:show-key-storage-root und encryption:change-key-storage-root
verschieben und steht im App-Wert encryption_key_storage_root der App
core.
| Schluessel | Ablage |
|---|---|
| Hauptschluessel | <daten>/files_encryption/OC_DEFAULT_MODULE/master_xxxxxxxx.publicKey bzw. .privateKey |
| Schluessel fuer oeffentliche Links | <daten>/files_encryption/OC_DEFAULT_MODULE/pubShare_xxxxxxxx.* |
| Wiederherstellungsschluessel | <daten>/files_encryption/OC_DEFAULT_MODULE/recoveryKey_xxxxxxxx.* |
| Benutzerschluessel | <daten>/<uid>/files_encryption/OC_DEFAULT_MODULE/<uid>.publicKey bzw. .privateKey |
| Datei- und Freigabeschluessel | <daten>/<uid>/files_encryption/keys/<pfad>/OC_DEFAULT_MODULE/fileKey und <empfaenger>.shareKey |
Bei systemweiten Einhaengepunkten liegen die Datei- und Freigabeschluessel
nicht unter dem Benutzerverzeichnis, sondern direkt unter
<daten>/files_encryption/keys/....
Die Kennungen mit Zufallssuffix stehen in den App-Werten masterKeyId,
publicShareKeyId und recoveryKeyId; sie werden beim ersten Bedarf erzeugt.
Passwortwechsel und Zuruecksetzen
Im Hauptschluesselbetrieb passiert nichts: Die zustaendigen Hooks werden nur registriert, wenn der Hauptschluessel nicht aktiv ist.
Im Benutzerschluesselbetrieb gilt:
- Benutzer aendert das eigene Passwort waehrend einer Sitzung. Der private Schluessel bleibt derselbe und wird lediglich mit dem neuen Passwort neu verschluesselt.
- Administrator setzt ein fremdes Passwort. Ein neues Schluesselpaar wird nur erzeugt, wenn der Benutzer die Wiederherstellung aktiviert hat und ein Wiederherstellungspasswort mitgegeben wurde, oder wenn der Benutzer noch keine Schluessel oder noch keine Dateien besitzt. Mit Wiederherstellungspasswort werden die Dateischluessel des Benutzers dabei neu verschluesselt.
- Ohne Wiederherstellungspasswort bleibt der private Schluessel mit dem alten Passwort verschluesselt. Der Benutzer sieht dann unter Einstellungen > Persoenlich > Verschluesselung im Abschnitt "owncloud.online-Basisverschluesselungsmodul" den Hinweis "Dein Passwort fuer Deinen privaten Schluessel stimmt nicht mehr mit Deinem Loginpasswort ueberein." und traegt dort unter "Altes Login Passwort" und "Aktuelles Passwort" die beiden Passwoerter ein ("Passwort fuer den privaten Schluessel aktualisieren").
- Benutzer wird geloescht. Der oeffentliche Schluessel des Benutzers und seine Schluessel in alternativen Ablagen werden entfernt.
Den Wiederherstellungsschluessel legt der Administrator im Abschnitt
"Standard-Verschluesselungs-Modul" an; jeder Benutzer entscheidet unter
Einstellungen > Persoenlich > Verschluesselung mit
"Passwortwiederherstellung aktivieren:" ("Aktiviert" / "Deaktiviert") selbst
darueber. Der Zustand steht im App-Wert
recoveryAdminEnabled und im Benutzerwert recoveryEnabled der App
encryption.
Einstellungen
App-Werte der App encryption, les- und schreibbar mit
occ config:app:get encryption <schluessel> und
occ config:app:set encryption <schluessel> --value <wert>. Die meisten Werte
setzt die App selbst; aendern Sie sie nur, wenn Sie die Folgen kennen.
| Schluessel | Werte / Vorgabe | Bedeutung |
|---|---|---|
useMasterKey |
0 / 1 |
Hauptschluesselbetrieb aktiv |
userSpecificKey |
leer / 1 |
veralteter Benutzerschluesselbetrieb |
masterKeyId |
master_xxxxxxxx |
Kennung des Hauptschluessels |
publicShareKeyId |
pubShare_xxxxxxxx |
Kennung des Schluessels fuer oeffentliche Links |
recoveryKeyId |
recoveryKey_xxxxxxxx |
Kennung des Wiederherstellungsschluessels |
recoveryAdminEnabled |
0 / 1 |
Wiederherstellungsschluessel eingerichtet |
encryptHomeStorage |
0 / 1, Vorgabe 1 |
Hauptspeicher mitverschluesseln; bei 0 nur externe Speicher |
crypto.engine |
internal / hsm |
Krypto-Backend, Vorgabe internal |
hsm.url |
URL | Adresse des HSM-Dienstes |
hsm.jwt.secret |
Zeichenkette | gemeinsames Geheimnis fuer den HSM-Dienst, Vorgabe secret |
hsm.jwt.clockskew |
Sekunden, Vorgabe 120 |
zulaessige Uhrzeitabweichung beim JWT |
Zusaetzlich beruehrt die App zwei Werte der App core: encryption_enabled
(yes / no) setzt sie selbst (Util::removeEncryptionAppSettings(),
encryption:recreate-master-key); encryption_key_storage_root wird vom Kern
verwaltet und von der App nur ueber dessen Util::getKeyStorageRoot() gelesen.
Werte aus config/config.php, die dieses Modul auswertet:
'secret' => '...', // Passwort des Hauptschluessels
'cipher' => 'AES-256-CTR', // Vorgabe, siehe unten
'openssl' => [
'private_key_bits' => 4096, // Vorgabe der App
],
'encryption.use_legacy_encoding' => false, // true = base64 statt binaer schreiben
Als cipher werden AES-256-CTR, AES-128-CTR, AES-256-CFB und
AES-128-CFB unterstuetzt; bei einem anderen Wert protokolliert die App eine
Warnung und faellt auf AES-256-CTR zurueck. Der Wert instanceid wird
zusaetzlich als Aussteller der JWT an den HSM-Dienst verwendet.
HSM-Betrieb
Der HSM-Dienst ist ein eigenstaendiger Dienst und nicht Teil dieser App. Die
App spricht ihn per HTTP an, sobald hsm.url gesetzt ist; sie setzt dann beim
Start selbst crypto.engine auf hsm.
sudo -u www-data php8.4 occ config:app:set encryption hsm.url \
--value https://hsm.example.net
sudo -u www-data php8.4 occ config:app:set encryption hsm.jwt.secret \
--value <gemeinsames-geheimnis>
Kommandozeile
Fuenf Befehle stammen aus dieser App. Fuehren Sie sie als Web-Server-Benutzer aus.
encryption:recreate-master-key
Entschluesselt das gesamte Dateisystem, erzeugt einen neuen Hauptschluessel und verschluesselt anschliessend wieder alles damit. Bricht mit einem Hinweis ab, wenn der Hauptschluesselbetrieb nicht aktiv ist. Alle Benutzer muessen sich danach neu anmelden.
| Option | Bedeutung |
|---|---|
-y, --yes |
Rueckfrage ueberspringen |
sudo -u www-data php8.4 occ encryption:recreate-master-key -y
encryption:migrate [user_id...]
Einmalige Umstellung der Schluesselablage auf das Layout von Verschluesselung 2.0. Ohne Argument werden die systemweiten Schluessel und die Schluessel aller Benutzer aller Backends umgestellt, mit Argumenten nur die genannten Benutzer.
sudo -u www-data php8.4 occ encryption:migrate
sudo -u www-data php8.4 occ encryption:migrate alice bob
encryption:fix-encrypted-version <user>
Prueft die Dateien eines Benutzers und korrigiert die gespeicherte Versions- angabe, wenn sich eine Datei wegen einer Signaturpruefung nicht mehr lesen laesst. Der Befehl zaehlt die Version zunaechst herunter, danach bis zur angegebenen Obergrenze hinauf, und stellt den Ausgangswert wieder her, wenn keine Version passt. Freigegebene Dateien muessen beim Eigentuemer repariert werden.
| Argument / Option | Vorgabe | Bedeutung |
|---|---|---|
user (Argument) |
– | Benutzerkennung, erforderlich |
-p, --path |
alle Dateien | Einschraenken, z. B. --path="/Musik" |
-i, --increment-range |
5 |
wie weit die Version erhoeht wird |
sudo -u www-data php8.4 occ encryption:fix-encrypted-version alice \
-p "/Dokumente" -i 10
encryption:hsmdaemon
Gibt den privaten Hauptschluessel base64-kodiert aus. Erfordert einen
gesetzten App-Wert hsm.url, sonst bricht der Befehl mit hsm.url not set
ab.
| Option | Bedeutung |
|---|---|
--export-masterkey |
privaten Hauptschluessel base64-kodiert ausgeben |
Der Befehl deklariert zusaetzlich die Option --import-masterkey; sie wird im
aktuellen Code nicht ausgewertet und bewirkt nichts.
encryption:hsmdaemon:decrypt <ciphertext>
Entschluesselt eine base64-kodierte Zeichenkette ueber den HSM-Dienst, zur
Fehlersuche. Erfordert ebenfalls hsm.url.
| Argument / Option | Bedeutung |
|---|---|
decrypt (Argument) |
base64-kodierter Geheimtext, erforderlich |
--username |
Benutzer, dessen Schluessel gilt; fragt das Passwort ab |
--keyId |
Kennung des zu verwendenden Schluessels |
Fehlersuche
| Symptom | Ursache | Abhilfe |
|---|---|---|
| Panel meldet "Die Verschluesselung-App ist aktiviert, aber Deine Schluessel sind nicht initialisiert." | Die Schluessel wurden in dieser Sitzung nicht initialisiert | Abmelden und neu anmelden |
| Nutzer meldet "Dein Passwort fuer Deinen privaten Schluessel stimmt nicht mehr mit Deinem Loginpasswort ueberein." | Passwort wurde ohne Wiederherstellungsschluessel fremd gesetzt | Unter Persoenlich > Verschluesselung "Altes Login Passwort" und "Aktuelles Passwort" eintragen |
| Download bricht mit Signaturfehler ab | Versionsangabe der Datei passt nicht zum Inhalt, etwa nach einer Ruecksicherung | occ encryption:fix-encrypted-version <benutzer> |
MultiKeyDecryptException: multikeydecrypt with share key failed |
Der Schluessel wurde mit RC4 versiegelt, OpenSSL 3 fuehrt RC4 nur im Legacy-Provider | Legacy-Provider in der OpenSSL-Konfiguration bereitstellen oder die Dateien mit encryption:recreate-master-key neu verschluesseln |
Can not get secret from ownCloud instance |
secret fehlt in config/config.php |
Wert wiederherstellen; ohne ihn ist der Hauptschluessel nicht zu oeffnen |
Master key is not enabled. bei recreate-master-key |
App-Wert useMasterKey steht nicht auf 1 |
Betriebsart im Panel waehlen oder config:app:set encryption useMasterKey --value 1 |
hsm.url not set |
HSM-Befehl ohne konfigurierten Dienst aufgerufen | hsm.url setzen oder den Befehl nicht verwenden |
| Log: "Unsupported cipher (…) defined in config.php supported. Falling back to AES-256-CTR" | cipher in config.php wird nicht unterstuetzt |
einen der vier unterstuetzten Cipher eintragen |
| Schluesselpaar laesst sich nicht erzeugen, OpenSSL-Fehler im Log | OpenSSL akzeptiert die 4096 Bit oder den Konfigurationspfad nicht | openssl in config.php anpassen |
| Dateien im Hauptspeicher bleiben unverschluesselt | encryptHomeStorage steht auf 0 |
Wert auf 1 setzen, danach occ encryption:encrypt-all |
Herkunft
Der urspruengliche Code stammt von der ownCloud GmbH und steht unter der
AGPL-3.0 (siehe LICENSE). Dieser Fork wird von der BW-Tech GmbH fuer
owncloud.online gepflegt und steht unter derselben Lizenz.
- Anwendungsseite: https://owncloud.online
- Dokumentation: https://docs.owncloud.online
- Quellcode und Fehlermeldungen: https://github.com/BWTECH-github/encryption