From b1e02b737cfe6b4c70c247632f914d34281a3c21 Mon Sep 17 00:00:00 2001 From: Christoph Date: Tue, 15 Sep 2026 00:27:01 +0200 Subject: [PATCH] Add sone documentation and README's. --- , | 226 ++++++++++++++++ README.md | 246 ++++++++++++++++++ README_Bad-Signature-Toolkit.docx | Bin 0 -> 14560 bytes ...fassung_Bad-Signature-Toolkit-Scripte.docx | Bin 0 -> 13186 bytes ...enfassung_Bad-Signature-Toolkit-Scripte.md | 134 ++++++++++ 5 files changed, 606 insertions(+) create mode 100644 , create mode 100644 README.md create mode 100644 README_Bad-Signature-Toolkit.docx create mode 100644 Zusammenfassung_Bad-Signature-Toolkit-Scripte.docx create mode 100644 Zusammenfassung_Bad-Signature-Toolkit-Scripte.md 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 0000000000000000000000000000000000000000..a9a16ce461611e5b8ee451c31fd6c8bdd21c3d68 GIT binary patch literal 14560 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 KfBFId0R9Jf9o9Jj literal 0 HcmV?d00001 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.