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:
@@ -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()`
|
||||
|
||||
Reference in New Issue
Block a user