Add sone documentation and README's.
This commit is contained in:
@@ -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 <website>` 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 <website>
|
||||||
|
```
|
||||||
|
|
||||||
|
→ Ergebnis: `reports/bad_signature_<website>_<datum>.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/<website>/…`) – dort liegen danach
|
||||||
|
**unverschlüsselte** Daten, also nach Gebrauch aufräumen.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./recover_bad_signature.sh -s <website>
|
||||||
|
|
||||||
|
# Nur erneut validieren (z. B. nach einem Script-Update mit neuen
|
||||||
|
# Prüfregeln), ohne nochmal zu entschlüsseln:
|
||||||
|
./recover_bad_signature.sh -V -s <website>
|
||||||
|
```
|
||||||
|
|
||||||
|
→ Ergebnis: `reports/recovery_<website>_<datum>.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 <website>
|
||||||
|
# nur Dry-Run (nichts wird geschrieben):
|
||||||
|
./restore_bad_signature.sh -n -s <website>
|
||||||
|
```
|
||||||
|
|
||||||
|
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/<website>`) · 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_<website>_<datum>.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 <website>
|
||||||
|
# Dateien mit aktiven Freigaben standardmäßig übersprungen,
|
||||||
|
# nur mit Bedacht einschließen:
|
||||||
|
./recreate_bad_signature.sh -f -s <website>
|
||||||
|
```
|
||||||
|
|
||||||
|
**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/<website>`) · Dateien mit aktiven Freigaben
|
||||||
|
werden standardmäßig übersprungen · Verifikation nach dem Schreiben wie
|
||||||
|
bei restore.
|
||||||
|
|
||||||
|
→ Ergebnis: `reports/recreate_<website>_<datum>.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 <website> -f <pfadliste.txt>
|
||||||
|
# nur Dry-Run:
|
||||||
|
./delete_files.sh -n -s <website> -f <pfadliste.txt>
|
||||||
|
```
|
||||||
|
|
||||||
|
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/<website>`). Ein bereits
|
||||||
|
nicht mehr existierender Pfad wird als `NOT_FOUND` gemeldet, nicht als
|
||||||
|
Fehler.
|
||||||
|
|
||||||
|
→ Ergebnis: `reports/delete_<website>_<datum>.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/<website>` | `RECOVERY_BASE_DIR` |
|
||||||
|
| Backup vor restore-Überschreiben | `/var/nc-restore-backup/<website>` | `RESTORE_BACKUP_BASE_DIR` |
|
||||||
|
| Backup vor recreate-Löschen | `/var/nc-recreate-backup/<website>` | `RECREATE_BACKUP_BASE_DIR` |
|
||||||
|
| Backup vor delete_files-Löschen | `/var/nc-delete-backup/<website>` | `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 <datei>` Pfadliste (**Pflicht**) |
|
||||||
|
|
||||||
|
`-h` zeigt bei jedem Script die ausführliche Hilfe.
|
||||||
@@ -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 <website>`
|
||||||
|
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 <website>
|
||||||
|
# oder ganz ohne Parameter - Website wird interaktiv abgefragt
|
||||||
|
# (bei mehreren konfigurierten Instanzen als Auswahlliste):
|
||||||
|
./scan_bad_signature.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
→ Ergebnis: `reports/bad_signature_<website>_<datum>.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/<website>/…`) – dort liegen danach
|
||||||
|
**unverschlüsselte** Daten, also nach Gebrauch aufräumen.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./recover_bad_signature.sh -s <website>
|
||||||
|
# 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 <website>
|
||||||
|
```
|
||||||
|
|
||||||
|
→ Ergebnis: `reports/recovery_<website>_<datum>.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 <website>
|
||||||
|
# oder ganz ohne Parameter - Website wird interaktiv abgefragt:
|
||||||
|
./restore_bad_signature.sh
|
||||||
|
# nur Dry-Run (nichts wird geschrieben):
|
||||||
|
./restore_bad_signature.sh -n -s <website>
|
||||||
|
```
|
||||||
|
|
||||||
|
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/<website>`) · 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_<website>_<datum>.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 <website>
|
||||||
|
# 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 <website>
|
||||||
|
```
|
||||||
|
|
||||||
|
**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/<website>`) · Dateien mit aktiven Freigaben
|
||||||
|
werden standardmäßig übersprungen · Verifikation nach dem Schreiben wie
|
||||||
|
bei restore.
|
||||||
|
|
||||||
|
→ Ergebnis: `reports/recreate_<website>_<datum>.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 <website> -f <pfadliste.txt>
|
||||||
|
# oder ganz ohne Parameter - Website UND Pfad zur Liste werden
|
||||||
|
# interaktiv abgefragt:
|
||||||
|
./delete_files.sh
|
||||||
|
# nur Dry-Run:
|
||||||
|
./delete_files.sh -n -s <website> -f <pfadliste.txt>
|
||||||
|
```
|
||||||
|
|
||||||
|
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/<website>`). Ein bereits
|
||||||
|
nicht mehr existierender Pfad wird als `NOT_FOUND` gemeldet, nicht als
|
||||||
|
Fehler.
|
||||||
|
|
||||||
|
→ Ergebnis: `reports/delete_<website>_<datum>.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/<website>` | `RECOVERY_BASE_DIR` |
|
||||||
|
| Backup vor restore-Überschreiben | `/var/nc-restore-backup/<website>` | `RESTORE_BACKUP_BASE_DIR` |
|
||||||
|
| Backup vor recreate-Löschen | `/var/nc-recreate-backup/<website>` | `RECREATE_BACKUP_BASE_DIR` |
|
||||||
|
| Backup vor delete_files-Löschen | `/var/nc-delete-backup/<website>` | `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 <website>` 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 <datei>` Pfadliste (ohne Angabe interaktiv abgefragt) |
|
||||||
|
|
||||||
|
`-h` zeigt bei jedem Script die ausführliche Hilfe.
|
||||||
Binary file not shown.
Binary file not shown.
@@ -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/<website>`).
|
||||||
|
- 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 <website>
|
||||||
|
# oder, nur Dry-Run:
|
||||||
|
./restore_bad_signature.sh -n -s <website>
|
||||||
|
```
|
||||||
|
|
||||||
|
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/<website>`) – 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 <website> -f <pfadliste.txt>
|
||||||
|
# oder, nur Dry-Run:
|
||||||
|
./delete_files.sh -n -s <website> -f <pfadliste.txt>
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 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.
|
||||||
Reference in New Issue
Block a user