Gegenbuch als Docker-Setup, lokales Buch auf eigener Maschine

Betreiber-Entscheidung: Das Gegenbuch laeuft auf einer eigenen Maschine fuer
Prod und Staging; ein externes Git-Repository entfaellt, das Buch liegt lokal.
Die Trennung, auf die es ankommt, ist damit gegeben - wer OpenCRM uebernimmt,
kommt nicht ans Buch.

Richtung bewusst so herum: Das Gegenbuch holt ueber HTTPS mit einem Token, das
nur audit:read kann. OpenCRM kennt weder Adresse noch Schluessel des
Gegenbuchs. Kein SSH-Zugang zum CRM noetig.

tools/audit-notary/ enthaelt jetzt Dockerfile, entrypoint.sh,
docker-compose.yml und .env.example. Zwei Dienste (prod, staging) mit
getrennten Verzeichnissen und Schluesseln, gesteuert ueber COMPOSE_PROFILES -
dasselbe Muster wie beim Caddy-Profil im Hauptstack. Der Signaturschluessel
wird beim ersten Start auf der Gegenbuch-Maschine erzeugt.

Lokaler Betrieb ist jetzt ein vollwertiger Modus statt eines Testschalters. Die
Erfolgsmeldung benennt bei jedem Lauf, was abgedeckt ist und was nicht - statt
der frueheren pauschalen Formulierung "kein Manipulationsschutz", die im
Einsatz auf eigener Maschine schlicht falsch war.

Verifiziert mit echtem Docker-Build gegen eine CRM-Attrappe: Genesis ohne
Bestaetigung -> Code 4; mit Bestaetigung Normalbetrieb exit 0; Eintrag
veraendert -> Alarm exit 2; Eintraege geloescht -> Alarm exit 2; Siegel
verschwunden -> Alarm.

Behoben beim Bauen: useradd -u 1000 || true verschluckte, dass UID 1000 im
Node-Image vergeben ist - der Container startete gar nicht.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-22 18:51:45 +02:00
co-authored by Claude Opus 5
parent 773033936d
commit a62c51b7c7
7 changed files with 316 additions and 5 deletions
+32
View File
@@ -97,6 +97,38 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [x] **🐳 Gegenbuch als Docker-Setup, lokales Buch auf eigener Maschine** (2026-08-22)
- Betreiber-Entscheidung: Das Gegenbuch laeuft auf einer **eigenen Maschine**
fuer Prod und Staging; ein externes Git-Repository entfaellt, das Buch
liegt lokal auf dieser Maschine. Die Trennung, auf die es ankommt, ist
damit gegeben wer OpenCRM uebernimmt, kommt nicht ans Buch.
- Richtung bewusst so herum: Das Gegenbuch **holt** ueber HTTPS mit einem
Token, das nur `audit:read` kann. OpenCRM kennt weder Adresse noch
Schluessel des Gegenbuchs. Kein SSH-Zugang zum CRM noetig das Token kann
ausschliesslich Pruefwerte lesen.
- Unterverzeichnis `tools/audit-notary/`: `Dockerfile`, `entrypoint.sh`,
`docker-compose.yml`, `.env.example`. Zwei Dienste (`prod`, `staging`) mit
getrennten Verzeichnissen und Schluesseln, gesteuert ueber
`COMPOSE_PROFILES` dasselbe Muster wie beim Caddy-Profil im Hauptstack.
Der Signaturschluessel wird beim ersten Start auf der Gegenbuch-Maschine
erzeugt und verlaesst sie nie.
- **Lokaler Betrieb ist jetzt ein vollwertiger Modus**, kein Testschalter
mehr. Die Erfolgsmeldung benennt bei jedem Lauf, was abgedeckt ist
(„jemand veraendert Daten im CRM“) und was nicht („jemand uebernimmt diesen
Rechner hier“) statt der frueheren pauschalen Formulierung „kein
Manipulationsschutz“, die im Einsatz auf eigener Maschine schlicht falsch
war.
- Jeder Durchlauf schreibt `status.txt` fuer die Ueberwachung; alles ausser
`exit=0` gehoert angesehen.
- Verifiziert mit echtem Docker-Build gegen eine CRM-Attrappe: Genesis ohne
Bestaetigung → Code 4; mit Bestaetigung → Buch angelegt, Normalbetrieb
exit 0; **Eintrag nachtraeglich veraendert → Alarm exit 2**; **Eintraege
geloescht (maxId geschrumpft) → Alarm exit 2**; Siegel verschwunden →
Alarm. Testartefakte und Image geloescht.
- Behoben beim Bauen: `useradd -u 1000 || true` verschluckte, dass UID 1000
im Node-Image bereits vergeben ist der Container startete gar nicht.
Jetzt laeuft er als der vorhandene Benutzer `node`.
- [x] **🧮 Gegenbuch: Pruefmodus schreibt nicht mehr, Widerspruch aufgeloest (Pentest R181)** (2026-08-18)
- **R181-01 (LOW→MED)** Der Pruefmodus sagte zu, nichts zu veraendern und
kein Schreibrecht zu brauchen und pushte trotzdem: `ankerNachziehen()`