diff --git a/, b/, new file mode 100644 index 0000000..ec46eb1 --- /dev/null +++ b/, @@ -0,0 +1,226 @@ +# Bad-Signature-Toolkit + +Werkzeuge zum Aufspüren und Beheben von **"Bad Signature"-Fehlern** der +Nextcloud Server-Side-Encryption (Dateien, die sich wegen einer +fehlerhaften Verschlüsselungs-Signatur nicht mehr öffnen lassen). + +Alle Scripte laufen als **root** auf dem jeweiligen Nextcloud-Server und +fragen die Website interaktiv ab, falls `-s ` nicht angegeben +wird (Voraussetzung: eine passende `.conf`-Datei liegt im `conf/`- +Verzeichnis neben den Scripten). + +## Der Ablauf auf einen Blick + +``` +1. scan_bad_signature.sh Betroffene Dateien FINDEN (read-only) +2. recover_bad_signature.sh Dateien probeweise ENTSCHLÜSSELN (read-only, + schreibt nur außerhalb von Nextcloud) +3. restore_bad_signature.sh Geprüfte Dateien ZURÜCKSCHREIBEN (live-Schreibzugriff) +4. recreate_bad_signature.sh Fallback für die Fälle, die (3) (live-Schreibzugriff, + nicht reparieren kann bricht Freigaben!) + delete_files.sh Explizite Dateiliste LÖSCHEN (live-Schreibzugriff, + (unabhängig vom obigen Ablauf) -> Papierkorb) +``` + +Jeder Schritt liest den Report des vorherigen Schritts. Reports landen +alle unter `reports/` (Dateiname verrät den Schritt: `bad_signature_…`, +`recovery_…`, `restore_…`, `recreate_…`, `delete_…`). + +--- + +## 1. `scan_bad_signature.sh` – Betroffene Dateien finden + +Liest einmal jede verschlüsselte Datei eines/mehrerer/aller Accounts und +protokolliert, welche dabei mit einem Signaturfehler scheitert. **Rein +lesend** – verändert, verschiebt oder löscht nichts. + +```bash +./scan_bad_signature.sh -s +``` + +→ Ergebnis: `reports/bad_signature__.tsv` + +--- + +## 2. `recover_bad_signature.sh` – Versuchsweise entschlüsseln + +Schaltet die Signaturprüfung *instanzweit, nur für die Laufzeit des +Scripts* ab (`encryption_skip_signature_check`) und versucht, die +betroffenen Dateien trotzdem zu entschlüsseln. Funktioniert nur, wenn +die Signaturprüfung selbst das Problem ist – nicht bei tatsächlich +beschädigtem Chiffretext. Jede gewonnene Datei wird automatisch geprüft +(Dateityp-Signatur, PDF-/ZIP-Integrität, Plausibilität der Dateigröße +o. Ä.) und als `VALID`, `UNVERIFIED` ("Nicht prüfbar") oder `INVALID` +("Datenmüll") eingestuft. + +**Wichtig:** Original-Dateien in Nextcloud werden nie angefasst. Alles +landet in einem separaten Verzeichnis außerhalb von Nextclouds eigener +Ablage (`/var/nc-recovery//…`) – dort liegen danach +**unverschlüsselte** Daten, also nach Gebrauch aufräumen. + +```bash +./recover_bad_signature.sh -s + +# Nur erneut validieren (z. B. nach einem Script-Update mit neuen +# Prüfregeln), ohne nochmal zu entschlüsseln: +./recover_bad_signature.sh -V -s +``` + +→ Ergebnis: `reports/recovery__.tsv` + +--- + +## 3. `restore_bad_signature.sh` – Zurückschreiben (Regelfall) + +Schreibt die in Schritt 2 gewonnenen Dateien über die **normale +Nextcloud-Files-API** an ihren ursprünglichen Pfad zurück – der einzige +Weg, der Datei-ID und bestehende Freigaben erhält. Danach ist die Datei +wieder ganz normal verschlüsselt, mit frischer, korrekter Signatur. + +**Seit dem letzten Update werden standardmäßig zwei Kategorien +zurückgeschrieben**, klar unterscheidbar im Report (Spalte `origin`): + +| validation im Recovery-Report | Bedeutung | wird restauriert | +|---|---|---| +| `VALID` | dedizierte Strukturprüfung hat den Inhalt bestätigt | ja | +| `UNVERIFIED`, Größe plausibel | kein dedizierter Check, aber nichts sieht falsch aus | ja | +| `UNVERIFIED`, Größe "LOOKS OFF" | Größenverhältnis auffällig – echtes Warnsignal | **nein** | +| `INVALID` ("Datenmüll") | Strukturprüfung fehlgeschlagen | **nein** | + +```bash +./restore_bad_signature.sh -s +# nur Dry-Run (nichts wird geschrieben): +./restore_bad_signature.sh -n -s +``` + +Fragt danach interaktiv: welcher Recovery-Report, welche(r) Account(s). + +**Sicherheit:** Neuvalidierung direkt vor jedem Schreiben · aktueller +(noch kaputter) Chiffretext wird vorher byte-genau gesichert +(`/var/nc-restore-backup/`) · jede Datei wird nach dem +Schreiben normal zurückgelesen und per SHA-256 verglichen · Dry-Run ist +Default, echter Lauf braucht eine ausdrückliche `YES`-Bestätigung. + +⚠️ **Ein erneuter Lauf wählt wieder *alle* passenden Einträge des +gewählten Accounts aus dem Report** – auch bereits erfolgreich +restaurierte, nicht nur neue. Für ein gezieltes Nachziehen einzelner, +noch offener Dateien lieber einen auf diese Dateien reduzierten +Mini-Report verwenden, statt den ganzen Account-Bestand erneut zu +überschreiben. + +→ Ergebnis: `reports/restore__.tsv` + +--- + +## 4. `recreate_bad_signature.sh` – Fallback für Schlüsselmaterial-Fehler + +Nur nötig, wenn `restore_bad_signature.sh` bei einer Datei mit einem +**Schlüsselmaterial-Fehler** scheitert (`MultiKeyDecryptException` / +"probably this is a shared file…") statt mit "Bad Signature". Löscht +die kaputte Datei auf reiner Dateisystem-Ebene (inkl. altem +Schlüssel-Verzeichnis) und legt sie komplett neu an, mit frischem +Schlüssel. + +⚠️ **Invasiver als restore:** Die Datei bekommt eine **neue Datei-ID** +– bestehende Freigaben, Kommentare, Tags und Versionshistorie dieser +Datei gehen dabei verloren und müssten danach manuell neu eingerichtet +werden. Nur verwenden, wenn Schritt 3 tatsächlich mit diesem +spezifischen Fehler gescheitert ist. + +```bash +./recreate_bad_signature.sh -s +# Dateien mit aktiven Freigaben standardmäßig übersprungen, +# nur mit Bedacht einschließen: +./recreate_bad_signature.sh -f -s +``` + +**Sicherheit:** Nur Dateien mit passendem Fehler aus dem +restore-Report werden angefasst · Chiffretext UND Schlüssel-Verzeichnis +werden vorher gesichert und die Sicherung vor dem Löschen verifiziert +(`/var/nc-recreate-backup/`) · Dateien mit aktiven Freigaben +werden standardmäßig übersprungen · Verifikation nach dem Schreiben wie +bei restore. + +→ Ergebnis: `reports/recreate__.tsv` + +--- + +## `delete_files.sh` – Gezielt nicht benötigte Dateien löschen + +Generisches, von Account und Site unabhängiges Script für den zweiten +Teil des Aufräum-Workflows: eine **von Hand geprüfte** Liste an +Dateien entfernen, die nicht erhaltenswert sind (z. B. macOS-Spotlight- +Indexdateien, Fragmente aus "Webseite speichern"). Kein Scannen, kein +automatisches Erraten – jede Zeile in der Liste ist eine bewusste +Entscheidung. + +Pfadliste: einfache Textdatei, ein Pfad pro Zeile (`#`-Kommentare und +Leerzeilen erlaubt), Account wird automatisch aus dem Pfad erkannt: + +``` +/inge/files/Ordner/Datei.ext +/anderer-account/files/Anderer/Pfad/datei2.ext +``` + +```bash +./delete_files.sh -s -f +# nur Dry-Run: +./delete_files.sh -n -s -f +``` + +Löscht über die normale Files-API (→ **Papierkorb**, sofern +`files_trashbin` aktiv ist) und sichert den Chiffretext zusätzlich +byte-genau vorher (`/var/nc-delete-backup/`). Ein bereits +nicht mehr existierender Pfad wird als `NOT_FOUND` gemeldet, nicht als +Fehler. + +→ Ergebnis: `reports/delete__.tsv` + +--- + +## Typischer Ablauf + +```bash +./scan_bad_signature.sh -s cloud-01.oopen.de # betroffene Dateien finden +./recover_bad_signature.sh -s cloud-01.oopen.de # entschlüsseln + prüfen +./restore_bad_signature.sh -s cloud-01.oopen.de # VALID + plausible zurückschreiben + +# nur bei einzelnen WRITE_ERROR mit Schlüsselmaterial-Fehler nötig: +./recreate_bad_signature.sh -s cloud-01.oopen.de + +# optional: von Hand geprüfte, nicht erhaltenswerte Dateien entfernen +./delete_files.sh -s cloud-01.oopen.de -f nicht_benoetigt.txt + +# zur Kontrolle: sollte jetzt (für erledigte Accounts) 0 melden +./scan_bad_signature.sh -s cloud-01.oopen.de +``` + +## Verzeichnisse + +| Zweck | Standardpfad | Override (conf-Datei) | +|---|---|---| +| Recovery-Kopien (unverschlüsselt!) | `/var/nc-recovery/` | `RECOVERY_BASE_DIR` | +| Backup vor restore-Überschreiben | `/var/nc-restore-backup/` | `RESTORE_BACKUP_BASE_DIR` | +| Backup vor recreate-Löschen | `/var/nc-recreate-backup/` | `RECREATE_BACKUP_BASE_DIR` | +| Backup vor delete_files-Löschen | `/var/nc-delete-backup/` | `DELETE_BACKUP_BASE_DIR` | +| Reports aller Scripte | `reports/` (neben den Scripten) | – | + +## Sicherheitsprinzipien (gelten für alle schreibenden Scripte) + +- **Dry-Run ist Standard** – ein echter Lauf braucht eine ausdrückliche `YES`-Bestätigung. +- **Immer zuerst sichern**, dann erst schreiben/löschen – byte-genaue Kopie, unabhängig von Nextcloud. +- **Immer neu validieren** unmittelbar vor dem Zugriff, nicht blind aus einem alten Report übernehmen. +- **Immer verifizieren** nach dem Schreiben (Rücklesen + SHA-256-Vergleich). +- Jedes Script kann per `Strg-C` sicher unterbrochen werden – kein halb geschriebener Report. + +## Kurzreferenz aller Flags + +| Script | `-s` | weitere Optionen | +|---|---|---| +| `scan_bad_signature.sh` | Website | – | +| `recover_bad_signature.sh` | Website | `-V` nur revalidieren | +| `restore_bad_signature.sh` | Website | `-n` Dry-Run erzwingen | +| `recreate_bad_signature.sh` | Website | `-n` Dry-Run erzwingen · `-f` Dateien mit aktiven Freigaben einschließen | +| `delete_files.sh` | Website | `-n` Dry-Run erzwingen · `-f ` Pfadliste (**Pflicht**) | + +`-h` zeigt bei jedem Script die ausführliche Hilfe. diff --git a/README.md b/README.md new file mode 100644 index 0000000..cbcbcb3 --- /dev/null +++ b/README.md @@ -0,0 +1,246 @@ +# Bad-Signature-Toolkit + +Werkzeuge zum Aufspüren und Beheben von **"Bad Signature"-Fehlern** der +Nextcloud Server-Side-Encryption (Dateien, die sich wegen einer +fehlerhaften Verschlüsselungs-Signatur nicht mehr öffnen lassen). + +Alle Scripte laufen als **root** auf dem jeweiligen Nextcloud-Server und +können auch **ganz ohne Parameter** aufgerufen werden – `-s ` +ist optional, nicht Pflicht. Fehlt es, ermittelt das Script alle +konfigurierten Instanzen anhand der `.conf`-Dateien im `conf/`- +Verzeichnis neben den Scripten. Gibt es davon **mehrere** (mehrere +Nextcloud-Instanzen auf demselben Server), wird interaktiv eine +Auswahlliste angezeigt, aus der die gewünschte Website ausgewählt wird. +Das gilt für alle fünf Scripte gleichermaßen. + +## Der Ablauf auf einen Blick + +``` +1. scan_bad_signature.sh Betroffene Dateien FINDEN (read-only) +2. recover_bad_signature.sh Dateien probeweise ENTSCHLÜSSELN (read-only, + schreibt nur außerhalb von Nextcloud) +3. restore_bad_signature.sh Geprüfte Dateien ZURÜCKSCHREIBEN (live-Schreibzugriff) +4. recreate_bad_signature.sh Fallback für die Fälle, die (3) (live-Schreibzugriff, + nicht reparieren kann bricht Freigaben!) + delete_files.sh Explizite Dateiliste LÖSCHEN (live-Schreibzugriff, + (unabhängig vom obigen Ablauf) -> Papierkorb) +``` + +Jeder Schritt liest den Report des vorherigen Schritts. Reports landen +alle unter `reports/` (Dateiname verrät den Schritt: `bad_signature_…`, +`recovery_…`, `restore_…`, `recreate_…`, `delete_…`). + +--- + +## 1. `scan_bad_signature.sh` – Betroffene Dateien finden + +Liest einmal jede verschlüsselte Datei eines/mehrerer/aller Accounts und +protokolliert, welche dabei mit einem Signaturfehler scheitert. **Rein +lesend** – verändert, verschiebt oder löscht nichts. + +```bash +./scan_bad_signature.sh -s +# oder ganz ohne Parameter - Website wird interaktiv abgefragt +# (bei mehreren konfigurierten Instanzen als Auswahlliste): +./scan_bad_signature.sh +``` + +→ Ergebnis: `reports/bad_signature__.tsv` + +--- + +## 2. `recover_bad_signature.sh` – Versuchsweise entschlüsseln + +Schaltet die Signaturprüfung *instanzweit, nur für die Laufzeit des +Scripts* ab (`encryption_skip_signature_check`) und versucht, die +betroffenen Dateien trotzdem zu entschlüsseln. Funktioniert nur, wenn +die Signaturprüfung selbst das Problem ist – nicht bei tatsächlich +beschädigtem Chiffretext. Jede gewonnene Datei wird automatisch geprüft +(Dateityp-Signatur, PDF-/ZIP-Integrität, Plausibilität der Dateigröße +o. Ä.) und als `VALID`, `UNVERIFIED` ("Nicht prüfbar") oder `INVALID` +("Datenmüll") eingestuft. + +**Wichtig:** Original-Dateien in Nextcloud werden nie angefasst. Alles +landet in einem separaten Verzeichnis außerhalb von Nextclouds eigener +Ablage (`/var/nc-recovery//…`) – dort liegen danach +**unverschlüsselte** Daten, also nach Gebrauch aufräumen. + +```bash +./recover_bad_signature.sh -s +# oder ganz ohne Parameter - Website wird interaktiv abgefragt: +./recover_bad_signature.sh + +# Nur erneut validieren (z. B. nach einem Script-Update mit neuen +# Prüfregeln), ohne nochmal zu entschlüsseln: +./recover_bad_signature.sh -V -s +``` + +→ Ergebnis: `reports/recovery__.tsv` + +--- + +## 3. `restore_bad_signature.sh` – Zurückschreiben (Regelfall) + +Schreibt die in Schritt 2 gewonnenen Dateien über die **normale +Nextcloud-Files-API** an ihren ursprünglichen Pfad zurück – der einzige +Weg, der Datei-ID und bestehende Freigaben erhält. Danach ist die Datei +wieder ganz normal verschlüsselt, mit frischer, korrekter Signatur. + +**Seit dem letzten Update werden standardmäßig zwei Kategorien +zurückgeschrieben**, klar unterscheidbar im Report (Spalte `origin`): + +| validation im Recovery-Report | Bedeutung | wird restauriert | +|---|---|---| +| `VALID` | dedizierte Strukturprüfung hat den Inhalt bestätigt | ja | +| `UNVERIFIED`, Größe plausibel | kein dedizierter Check, aber nichts sieht falsch aus | ja | +| `UNVERIFIED`, Größe "LOOKS OFF" | Größenverhältnis auffällig – echtes Warnsignal | **nein** | +| `INVALID` ("Datenmüll") | Strukturprüfung fehlgeschlagen | **nein** | + +```bash +./restore_bad_signature.sh -s +# oder ganz ohne Parameter - Website wird interaktiv abgefragt: +./restore_bad_signature.sh +# nur Dry-Run (nichts wird geschrieben): +./restore_bad_signature.sh -n -s +``` + +Fragt danach interaktiv: welcher Recovery-Report, welche(r) Account(s). + +**Sicherheit:** Neuvalidierung direkt vor jedem Schreiben · aktueller +(noch kaputter) Chiffretext wird vorher byte-genau gesichert +(`/var/nc-restore-backup/`) · jede Datei wird nach dem +Schreiben normal zurückgelesen und per SHA-256 verglichen · Dry-Run ist +Default, echter Lauf braucht eine ausdrückliche `YES`-Bestätigung. + +⚠️ **Ein erneuter Lauf wählt wieder *alle* passenden Einträge des +gewählten Accounts aus dem Report** – auch bereits erfolgreich +restaurierte, nicht nur neue. Für ein gezieltes Nachziehen einzelner, +noch offener Dateien lieber einen auf diese Dateien reduzierten +Mini-Report verwenden, statt den ganzen Account-Bestand erneut zu +überschreiben. + +→ Ergebnis: `reports/restore__.tsv` + +--- + +## 4. `recreate_bad_signature.sh` – Fallback für Schlüsselmaterial-Fehler + +Nur nötig, wenn `restore_bad_signature.sh` bei einer Datei mit einem +**Schlüsselmaterial-Fehler** scheitert (`MultiKeyDecryptException` / +"probably this is a shared file…") statt mit "Bad Signature". Löscht +die kaputte Datei auf reiner Dateisystem-Ebene (inkl. altem +Schlüssel-Verzeichnis) und legt sie komplett neu an, mit frischem +Schlüssel. + +⚠️ **Invasiver als restore:** Die Datei bekommt eine **neue Datei-ID** +– bestehende Freigaben, Kommentare, Tags und Versionshistorie dieser +Datei gehen dabei verloren und müssten danach manuell neu eingerichtet +werden. Nur verwenden, wenn Schritt 3 tatsächlich mit diesem +spezifischen Fehler gescheitert ist. + +```bash +./recreate_bad_signature.sh -s +# oder ganz ohne Parameter - Website wird interaktiv abgefragt: +./recreate_bad_signature.sh +# Dateien mit aktiven Freigaben standardmäßig übersprungen, +# nur mit Bedacht einschließen: +./recreate_bad_signature.sh -f -s +``` + +**Sicherheit:** Nur Dateien mit passendem Fehler aus dem +restore-Report werden angefasst · Chiffretext UND Schlüssel-Verzeichnis +werden vorher gesichert und die Sicherung vor dem Löschen verifiziert +(`/var/nc-recreate-backup/`) · Dateien mit aktiven Freigaben +werden standardmäßig übersprungen · Verifikation nach dem Schreiben wie +bei restore. + +→ Ergebnis: `reports/recreate__.tsv` + +--- + +## `delete_files.sh` – Gezielt nicht benötigte Dateien löschen + +Generisches, von Account und Site unabhängiges Script für den zweiten +Teil des Aufräum-Workflows: eine **von Hand geprüfte** Liste an +Dateien entfernen, die nicht erhaltenswert sind (z. B. macOS-Spotlight- +Indexdateien, Fragmente aus "Webseite speichern"). Kein Scannen, kein +automatisches Erraten – jede Zeile in der Liste ist eine bewusste +Entscheidung. + +Pfadliste: einfache Textdatei, ein Pfad pro Zeile (`#`-Kommentare und +Leerzeilen erlaubt), Account wird automatisch aus dem Pfad erkannt: + +``` +/inge/files/Ordner/Datei.ext +/anderer-account/files/Anderer/Pfad/datei2.ext +``` + +```bash +./delete_files.sh -s -f +# oder ganz ohne Parameter - Website UND Pfad zur Liste werden +# interaktiv abgefragt: +./delete_files.sh +# nur Dry-Run: +./delete_files.sh -n -s -f +``` + +Löscht über die normale Files-API (→ **Papierkorb**, sofern +`files_trashbin` aktiv ist) und sichert den Chiffretext zusätzlich +byte-genau vorher (`/var/nc-delete-backup/`). Ein bereits +nicht mehr existierender Pfad wird als `NOT_FOUND` gemeldet, nicht als +Fehler. + +→ Ergebnis: `reports/delete__.tsv` + +--- + +## Typischer Ablauf + +```bash +./scan_bad_signature.sh -s cloud-01.oopen.de # betroffene Dateien finden +./recover_bad_signature.sh -s cloud-01.oopen.de # entschlüsseln + prüfen +./restore_bad_signature.sh -s cloud-01.oopen.de # VALID + plausible zurückschreiben + +# nur bei einzelnen WRITE_ERROR mit Schlüsselmaterial-Fehler nötig: +./recreate_bad_signature.sh -s cloud-01.oopen.de + +# optional: von Hand geprüfte, nicht erhaltenswerte Dateien entfernen +./delete_files.sh -s cloud-01.oopen.de -f nicht_benoetigt.txt + +# zur Kontrolle: sollte jetzt (für erledigte Accounts) 0 melden +./scan_bad_signature.sh -s cloud-01.oopen.de +``` + +## Verzeichnisse + +| Zweck | Standardpfad | Override (conf-Datei) | +|---|---|---| +| Recovery-Kopien (unverschlüsselt!) | `/var/nc-recovery/` | `RECOVERY_BASE_DIR` | +| Backup vor restore-Überschreiben | `/var/nc-restore-backup/` | `RESTORE_BACKUP_BASE_DIR` | +| Backup vor recreate-Löschen | `/var/nc-recreate-backup/` | `RECREATE_BACKUP_BASE_DIR` | +| Backup vor delete_files-Löschen | `/var/nc-delete-backup/` | `DELETE_BACKUP_BASE_DIR` | +| Reports aller Scripte | `reports/` (neben den Scripten) | – | + +## Sicherheitsprinzipien (gelten für alle schreibenden Scripte) + +- **Dry-Run ist Standard** – ein echter Lauf braucht eine ausdrückliche `YES`-Bestätigung. +- **Immer zuerst sichern**, dann erst schreiben/löschen – byte-genaue Kopie, unabhängig von Nextcloud. +- **Immer neu validieren** unmittelbar vor dem Zugriff, nicht blind aus einem alten Report übernehmen. +- **Immer verifizieren** nach dem Schreiben (Rücklesen + SHA-256-Vergleich). +- Jedes Script kann per `Strg-C` sicher unterbrochen werden – kein halb geschriebener Report. + +## Kurzreferenz aller Flags + +`-s ` ist bei **allen** Scripten optional – fehlt es, wird die +Website interaktiv abgefragt (Auswahlliste bei mehreren konfigurierten +Instanzen). + +| Script | `-s` (optional) | weitere Optionen | +|---|---|---| +| `scan_bad_signature.sh` | Website | – | +| `recover_bad_signature.sh` | Website | `-V` nur revalidieren | +| `restore_bad_signature.sh` | Website | `-n` Dry-Run erzwingen | +| `recreate_bad_signature.sh` | Website | `-n` Dry-Run erzwingen · `-f` Dateien mit aktiven Freigaben einschließen | +| `delete_files.sh` | Website | `-n` Dry-Run erzwingen · `-f ` Pfadliste (ohne Angabe interaktiv abgefragt) | + +`-h` zeigt bei jedem Script die ausführliche Hilfe. diff --git a/README_Bad-Signature-Toolkit.docx b/README_Bad-Signature-Toolkit.docx new file mode 100644 index 0000000..a9a16ce Binary files /dev/null and b/README_Bad-Signature-Toolkit.docx differ diff --git a/Zusammenfassung_Bad-Signature-Toolkit-Scripte.docx b/Zusammenfassung_Bad-Signature-Toolkit-Scripte.docx new file mode 100644 index 0000000..5065a39 Binary files /dev/null and b/Zusammenfassung_Bad-Signature-Toolkit-Scripte.docx differ diff --git a/Zusammenfassung_Bad-Signature-Toolkit-Scripte.md b/Zusammenfassung_Bad-Signature-Toolkit-Scripte.md new file mode 100644 index 0000000..8a99528 --- /dev/null +++ b/Zusammenfassung_Bad-Signature-Toolkit-Scripte.md @@ -0,0 +1,134 @@ +# Bad-Signature-Toolkit: Zusammenfassung der neuen/aktualisierten Scripte + +Stand: 14.09.2026 + +## Ausgangslage + +Im Rahmen der Bereinigung von "Bad Signature"-Fehlern (fehlerhafte Server-Side-Encryption-Signaturen) auf mehreren Nextcloud-Instanzen wurde das bestehende Toolkit um zwei Punkte erweitert: + +1. **`restore_bad_signature.sh`** schreibt jetzt standardmäßig nicht nur streng geprüfte ("VALID"), sondern auch plausible, aber nicht abschließend prüfbare Dateien zurück ("Nicht prüfbar"/UNVERIFIED). +2. **`delete_files.sh`** ist ein neues, generisches Script, um eine explizite Liste nicht benötigter Dateien zu löschen – unabhängig von Account oder Site, ohne Sonder-/Einmal-Scripte pro Vorfall. + +Damit lässt sich der komplette Workflow konsequent nach einem einfachen Prinzip abbilden: + +> **Unauffällige Dateien schreiben wir zurück. Dateien, die es nicht braucht, löschen wir.** + +Beide Scripte reihen sich in das bestehende Toolkit ein: + +``` +scan_bad_signature.sh -> findet betroffene Dateien (read-only) +recover_bad_signature.sh -> entschlüsselt/prüft sie in ein separates Verzeichnis (read-only) +restore_bad_signature.sh -> schreibt geprüfte Dateien an ihren Originalort zurück +recreate_bad_signature.sh -> Fallback: löscht+erstellt neu (bricht Freigaben, nur für die schwierigere Fehlerklasse) +delete_files.sh -> NEU: löscht eine explizite Liste nicht benötigter Dateien +``` + +--- + +## 1. `restore_bad_signature.sh` (aktualisiert) + +### Zweck (unverändert) + +Schreibt bereits wiederhergestellte und geprüfte Dateien (Ergebnis eines vorherigen `recover_bad_signature.sh`-Laufs) über die normale Nextcloud-Files-API an ihren **ursprünglichen Pfad** zurück. Das ist der einzige Schreibweg, der Datei-ID und Freigaben erhält (im Gegensatz zu `recreate_bad_signature.sh`). + +### Was sich geändert hat + +Bisher wurden nur Dateien zurückgeschrieben, deren Recovery-Report-Eintrag `validation=VALID` trug – also Dateien, bei denen eine dedizierte Strukturprüfung (PDF-Header, ZIP-Integrität, Bildsignatur usw.) den Inhalt tatsächlich bestätigen konnte. + +**Jetzt werden standardmäßig zwei Kategorien zurückgeschrieben:** + +| Kategorie | Bedeutung | Wird restauriert? | +|---|---|---| +| `VALID` | Dedizierte Strukturprüfung hat den Inhalt bestätigt | Ja (wie bisher) | +| `UNVERIFIED` ("Nicht prüfbar"), Größenverhältnis plausibel | Kein dedizierter Check für diesen Dateityp vorhanden, aber nichts sieht falsch aus | **Ja, neu** | +| `UNVERIFIED`, Größenverhältnis "LOOKS OFF" | Wie oben, aber das Größenverhältnis der Datei ist auffällig | Nein – wie `INVALID`/"Datenmüll" ausgeschlossen | +| `INVALID` ("Datenmüll") | Strukturprüfung ist fehlgeschlagen | Nein (unverändert) | + +Der einzige Fall, der tatsächlich ein Warnsignal ist (auffälliges Größenverhältnis), bleibt also weiterhin ausgeschlossen – kein Override möglich. Alles andere, das lediglich "nicht abschließend prüfbar, aber unauffällig" ist, wird ab sofort mit restauriert, ohne dass dafür ein Sonder-Script pro Account nötig wäre. + +### Transparenz + +Damit eine zurückgeschriebene UNVERIFIED-Datei nie mit einer echten VALID-Verifikation verwechselt wird: + +- Der Restore-Report bekommt eine eigene Spalte `origin` (`VALID` oder `UNVERIFIED`). +- Eigene Zähler pro Account und in der Gesamtsumme ("davon 'Nicht prüfbar'/UNVERIFIED: N"). +- Ausdrücklicher Hinweis im Report und am Ende des Laufs, diese Dateien stichprobenartig zu prüfen. + +### Sicherheitsmechanismen (unverändert) + +- Jede Datei wird unmittelbar vor dem Schreiben mit den *aktuellen* Prüfregeln erneut validiert (nicht blind aus dem alten Report übernommen). +- Der aktuell noch kaputte Chiffretext wird vor dem Überschreiben byte-genau gesichert (`/var/nc-restore-backup/`). +- Nach jedem Schreiben wird die Datei über den normalen Lesepfad zurückgelesen und per SHA-256 mit der Quelle verglichen. +- Dry-Run ist Standard, ohne `-n` wird interaktiv gefragt; eine ausdrückliche `YES`-Bestätigung ist für den echten Lauf nötig. + +### Aufruf + +```bash +./restore_bad_signature.sh -s +# oder, nur Dry-Run: +./restore_bad_signature.sh -n -s +``` + +Danach interaktiv: Auswahl des Recovery-Reports, Auswahl der Accounts ("VALID + plausibel UNVERIFIED"-Einträge). + +> **Hinweis:** Ein erneuter Lauf über denselben Report wählt wieder *alle* passenden Einträge des jeweiligen Accounts aus – auch bereits erfolgreich restaurierte. Um gezielt nur einzelne, noch offene Dateien nachzuziehen (z. B. nachträglich als "unauffällig" eingestufte Dateien), empfiehlt es sich, einen auf diese Dateien reduzierten Mini-Report zu verwenden, statt den kompletten Account-Bestand erneut zu überschreiben. + +--- + +## 2. `delete_files.sh` (neu) + +### Zweck + +Generischer, wiederverwendbarer Begleiter zu `restore_bad_signature.sh` für die andere Hälfte des Workflows: eine explizite, von Hand geprüfte Liste von Dateien aus der Nextcloud-Live-Ablage entfernen – z. B. Systemdateien (macOS-Spotlight-Index), Fragmente aus "Webseite speichern"-Aktionen oder andere Dateien, die nach Durchsicht als nicht erhaltenswert eingestuft wurden. + +**Nicht** account- oder site-spezifisch – ein einziges Script für alle Fälle, kein Einmal-Script pro Vorfall mehr nötig. + +### Eingabeformat + +Einfache Textdatei, ein Nextcloud-Pfad pro Zeile, im selben Format wie die `path`-Spalte der Toolkit-Reports: + +``` +/inge/files/Ordner/Datei.ext +# Kommentarzeilen mit '#' und Leerzeilen werden ignoriert +/anderer-account/files/Anderer/Pfad/datei2.ext +``` + +Der jeweilige Account wird automatisch aus dem ersten Pfadsegment erkannt – eine Liste kann also Dateien mehrerer Accounts derselben Site mischen. + +### Was passiert beim Löschen + +- Löschen erfolgt über die normale Nextcloud-Files-API (`$node->delete()`) – **derselbe Weg wie im Webinterface**. Ist die App `files_trashbin` aktiv (Standard), landet die Datei im Papierkorb des jeweiligen Accounts und ist von dort wiederherstellbar. +- Vor dem Löschen wird der aktuelle Chiffretext zusätzlich byte-genau in ein eigenes Backup-Verzeichnis gesichert (`/var/nc-delete-backup/`) – unabhängig von Nextcloud/Papierkorb. +- Ein Pfad, der gar nicht mehr existiert, wird als `NOT_FOUND` gemeldet, nicht als Fehler. +- Dry-Run ist Standard, ohne `-n` wird interaktiv gefragt; eine ausdrückliche `YES`-Bestätigung ist für den echten Lauf nötig. + +### Aufruf + +```bash +./delete_files.sh -s -f +# oder, nur Dry-Run: +./delete_files.sh -n -s -f +``` + +--- + +## Zusammenspiel der beiden Scripte + +Für einen typischen "Nicht prüfbar"-Restbestand nach einem `recover_bad_signature.sh`-Lauf: + +1. `restore_bad_signature.sh` läuft ganz normal für den Account – nimmt automatisch alle VALID- und plausiblen UNVERIFIED-Dateien mit. +2. Was danach als nicht erhaltenswert erkannt wird (z. B. Systemdateien), wandert in eine einfache Pfadliste. +3. `delete_files.sh` räumt diese Liste ab – unabhängig davon, ob die Dateien vorher restauriert wurden oder nicht. + +Kein Account und kein Vorfall braucht dafür mehr ein eigenes Script – beide Werkzeuge sind allgemein einsetzbar und für jede Site/jeden Account nutzbar. + +--- + +## Beispiel aus der aktuellen Bereinigung (cloud-01.oopen.de) + +Beim Recovery-Lauf für `cloud-01.oopen.de` (Accounts `chris` + `inge`) blieben 11 von 6249 Dateien als "Nicht prüfbar" übrig: + +- **2 Dateien** (Ressourcen eines Lernspiels, `.ctf`/`.md8`) wurden als plausibel eingestuft und werden per `restore_bad_signature.sh` zurückgeschrieben. +- **9 Dateien** (7 macOS-Spotlight-Indexdateien, 2 Fragmente aus "Webseite speichern") wurden als nicht erhaltenswert eingestuft und werden per `delete_files.sh` entfernt. + +Beide Scripte behandeln diesen Fall jetzt mit ihrer regulären, generischen Logik – ohne das ursprünglich dafür gebaute Einmal-Script `cleanup_11_misc_files_cloud01.sh`, das damit hinfällig ist.