Gegenbuch: nur vertrauenswuerdige Signaturen, fail-closed ohne Remote (R176)
R176-01 (HIGH): Das Signatur-Gate akzeptierte %G? = G ODER U. Bei SSH-Signaturen bedeutet U woertlich "gute Signatur, aber kein passender Principal" - der Schluessel steht also NICHT in allowed_signers. Damit passierte jeder selbst erzeugte Schluessel das Gate und der einzige In-System-Vertrauensanker war wirkungslos. End-to-end reproduziert: Gegenbuch mit fremdem Schluessel re-signiert und force-gepusht -> "OK", exit 0. Vorbedingung war nur Remote-Schreibrecht, kein Host-Zugriff. Fix: nur G an beiden Stellen, dazu optionales Pinnen des erwarteten Signierschluessels ueber NOTARY_SIGNER_FINGERPRINT (%GF). R176-02 (MEDIUM): War der Remote unerreichbar, fiel der Ablauf still auf HEAD zurueck und die "nie gepusht"-Pruefung wurde uebersprungen - ausgerechnet unter der Bedingung, die einen Push-Fehlschlag verursacht. --check meldete waehrend eines Ausfalls gruenes Licht auf nicht notarisiertem Zustand. Fix: fail-closed mit Code 3, ebenso ohne konfigurierten Remote (Testlauf nur mit NOTARY_ALLOW_LOCAL=true). Nebenbei: git-eigene Fehlermeldungen standen vor der eigenen Erklaerung, stderr wird jetzt abgefangen und gezielt weitergereicht. Verifiziert mit zwei SSH-Schluesseln gegen echten Remote: Angriff mit fremdem Key + Force-Push -> Alarm exit 2 (vorher OK); Remote unerreichbar -> exit 3; kein Remote -> exit 3; falscher Fingerabdruck-Pin -> Alarm; saubere Historie ohne Fehlalarm. Rueckgabecodes in der README dokumentiert. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -60,6 +60,33 @@ Deshalb gilt jetzt:
|
||||
- Geschrieben wird erst nach erfolgreichem, signiertem Commit – scheitert er,
|
||||
wird die Datei zurückgerollt
|
||||
|
||||
## Voraussetzungen, die wirklich Voraussetzungen sind
|
||||
|
||||
- **`allowed_signers` muss den Notar-Schlüssel enthalten.** Das Skript
|
||||
akzeptiert ausschließlich Signaturen, die git als `G` bewertet – bei
|
||||
SSH-Signaturen heißt das wörtlich „Schlüssel steht in `allowed_signers`".
|
||||
Ein fremder, selbst erzeugter Schlüssel liefert `U` und wird abgelehnt.
|
||||
*(Bei GPG statt SSH liefert auch ein legitimer Schlüssel ohne Ownertrust ein
|
||||
`U` – dann Ownertrust setzen, nicht `U` wieder zulassen.)*
|
||||
- **Ein Remote muss erreichbar sein.** Ist er es nicht, bricht das Skript mit
|
||||
Code 3 ab, statt dem lokalen Stand zu glauben. Ein Gegenbuch, dessen
|
||||
beglaubigter Stand sich nicht feststellen lässt, gibt kein grünes Licht.
|
||||
- Optional, aber empfohlen: `NOTARY_SIGNER_FINGERPRINT` auf den Fingerabdruck
|
||||
des Notar-Schlüssels setzen (`git log -1 --format=%GF`). Dann muss jeder
|
||||
Commit von genau diesem Schlüssel stammen.
|
||||
|
||||
## Rückgabecodes
|
||||
|
||||
| Code | Bedeutung |
|
||||
|---|---|
|
||||
| 0 | alles in Ordnung, Checkpoint angehängt (bzw. Prüfung bestanden) |
|
||||
| 1 | Betriebsfehler (Konfiguration, Commit oder Push fehlgeschlagen) |
|
||||
| 2 | **Befund** – Widerspruch zwischen CRM und Gegenbuch, oder ungültige Signatur |
|
||||
| 3 | beglaubigter Stand nicht feststellbar (Remote fehlt oder unerreichbar) |
|
||||
|
||||
Für Cron gilt: **jeder** Code außer 0 gehört gemeldet. Code 2 ist der Alarm,
|
||||
Code 3 heißt „ich weiß es nicht" – und das ist ausdrücklich kein Freibrief.
|
||||
|
||||
## Prüfmodus für Auditoren
|
||||
|
||||
```bash
|
||||
|
||||
Reference in New Issue
Block a user