TLS-Gate v2: Passkanten als PrĂŒffall — und Monitoring-Resonanz statt statischer Liste

Von: Branko → OZMAI
Stand: 28. September 2026
Typ: EXTERNAL_SOURCE (Inbox-Regel §3 — keine automatische Geltung, kein Brain-Status)
Charakter: STATUS + realer PrĂŒffall fĂŒr IDENTITAETSBINDUNG_HMAC_NETBOX_TLS_CUSTODY_PRUEFFALL_v0.1.md
+ DESIGN_INTENT (Monitoring → Postgres/Vektor). Kein Auftrag, kein Deploy.
Quelle: Repo TLS-Gate-Mock-Pipeline (git.crumbforest.org), Tags v2.0.0 (9849166) und
v2.1.0 (28f2211), dort CHANGELOG.md, docs/AUDIT.md (BWA-AUD-16
23), docs/STRUKTUR.md, deploy/.
Anschluss an: 2026-09-24_TLS-GATE-MANDANTEN-CORE-UND-LOGIN_BRANKO.md (letzter Stand dort: 911f1e5).

Legende: ✅ real/gebaut · đŸ§Ș gebaut, getestet, nicht live · 🛠 spezifiziert · ⬜ OPEN · ❓ UNKNOWN

Zugangsdaten, Kunden-Domains, Reseller-IDs und Inhalte der vertraulichen Anbieter-Doku stehen bewusst
nicht hier.


Der Bogen in einem Satz

Seit dem 24.9. ist aus dem Mockup mit Login eine v2 geworden. Die Struktur schĂŒtzt jetzt, nicht mehr
eine Deny-Liste, und neue Module kosten keinen Overhead pro Funktion. Dabei ist sichtbar geworden, dass
TLS-Gate schon heute an mehreren Passkanten genau die Trennung hĂ€lt, die der whoami-PrĂŒffall
verlangt: geprĂŒftes PrĂ€dikat ≠ stĂ€rkere Bindung. Heute ist das alles aber statisch. Die nĂ€chste
Frage ist, was passiert, wenn Monitoring und Clients regelmĂ€ĂŸig „funken“.


Was seit dem 24.9. real ist

Stand Was Beleg
đŸ§Ș v1.0.0 getaggt = Werkzeug ohne Login (Stand der Test-VM) Tag auf 3dec8a8
đŸ§Ș v2.0.0: Login/TOTP/Rollen/Audit (M1), Web-Benutzerverwaltung, Audit-Ansicht, Pflicht-„warum“ bei Bestellungen Tag 9849166, tests/test_auth.sh
đŸ§Ș PSR-4-Struktur: nur public/ ist Webroot, Klassen TlsGate\
 unter src/, CLIs unter bin/ docs/STRUKTUR.md; Test mit Gegenprobe: das Alt-Layout liefert die SQLite aus, das neue nicht
đŸ§Ș v2.1.0: SSL-Konsole in Controller + Templates + Assets zerlegt (index.php 1054 → 37 Zeilen), strikte CSP ohne Inline-Skript Tag 28f2211; HTML-Vergleich alt/neu fĂŒr GET + 7 Aktionen identisch; BWA-AUD-23
đŸ§Ș Tests: test_auth.sh 71/71, test_totp_rfc6238.sh 11/11 (RFC-Vektoren), test_smoke.sh 44/44 frischer Klon von 28f2211, lokal PHP 8.5
🛠 Deploy-Vorlagen Apache + nginx, Tabelle je OS (Debian/RHEL/Alpine/FreeBSD), FPM-Pool, SELinux deploy/, nicht gegen echten Webserver geprĂŒft (nginx -t/apachectl -t offen)
⬜ acme.sh-Modul (fĂŒr Wald/Nullfeld spielt Let's Encrypt die erste Rolle) ARCHITEKTUR M6, noch kein Code
⬜ Monitoring-Anbindung, Postgres, Vektor siehe unten, reines DESIGN_INTENT

Zwei Fehler, die unterwegs gefunden wurden. Beide sind fĂŒr andere Repos im Wald lehrreich:

  • .gitignore-Muster SSL/ traf auf macOS auch templates/ssl/ (core.ignorecase=true). 18 Dateien
    wurden still nicht committet, gefunden erst ĂŒber git status und einen frischen Klon. Fix: Muster am Root
    verankern (/SSL/, /state/). Das ist derselbe Fehlertyp wie audit.php ĂŒberschreibt Audit.php vom 26.9.:
    ein Name bindet stÀrker, als er soll.
  • Flackernder Replay-Test seit v2.0.0: Der Test rechnete den „bereits benutzten“ TOTP-Code neu aus, statt
    ihn wiederzuverwenden. Über eine 30-s-Grenze war das ein frischer gĂŒltiger Code, und der Test wurde rot.
    Reproduziert per Start an Sekunde 22 des Fensters: alt 2/2 rot, neu 3/3 grĂŒn. Der Test prĂŒfte also ein
    anderes PrĂ€dikat als das, das er zu prĂŒfen behauptete.

PrĂŒffall: TLS-Gate-Passkanten gegen IDENTITAETSBINDUNG 
 §16

Das ist Angriffsmaterial fĂŒr die Hypothese, keine BestĂ€tigung. Pro Passkante: welches PrĂ€dikat die
Evidenz tatsÀchlich trÀgt und welche stÀrkere Bindung daraus nicht folgt.

Passkante (Code) geprĂŒftes PrĂ€dikat folgt ausdrĂŒcklich nicht
audit_log ssl.orderCert requested Ein Konto mit Rolle ≄ user hat die Aktion ausgelöst, mit Grund. Die CA hat ausgestellt. (Admission ≠ Wirkung, deshalb heißt der Eintrag requested, nicht ok.)
dashboard.sh deploy: keyMatch / chainVerified Cert passt zu Key, die Chain validiert gegen das Bundle. Der Server liefert dieses Cert aus. DafĂŒr gibt es separat cross-check gegen domain:443 (erwartete ≠ beobachtete Wirkung).
TOTP-Login Jemand konnte mit dem Secret den Code erzeugen (≈ KEY_USE_CAPABILITY). Das war die Person hinter dem Konto.
source: mock vs. soap Woher die angezeigten Daten stammen. Mock-Daten wÀren Live-Daten.
ACME DNS-01 (kĂŒnftig) Kontrolle ĂŒber die DNS-Zone zum Zeitpunkt t. IdentitĂ€t der Maschine; Geltung ĂŒber t hinaus.

Zwei Stellen, an denen die Trennung heute nicht hÀlt (Befund, kein Lob):

  1. TOTP-SchlĂŒssel liegt neben der DB (BWA-AUD-22, offen). Die sodium-VerschlĂŒsselung trĂ€gt nur das
    PrĂ€dikat „ein DB-Dump allein gibt die Secrets nicht her“. Wer das Verzeichnis liest, hat beides. Das
    ist wörtlich F5 bzw. KEY_USE_CAPABILITY ≠ KEY_MATERIAL_ACCESS. Erst deploy/ mit getrenntem
    /etc/tlsgate/tlsgate.key löst das, und das ist noch nicht live.
  2. SELinux ohne httpd_can_network_connect (RHEL-Familie): Der SOAP-Aufruf scheitert still, die App
    fĂ€llt auf den Mock zurĂŒck. Nur ein kleines Label „Mock-Fallback“ verhindert, dass man die Daten fĂŒr
    Live-Daten hÀlt. Das ist eine stille Aufwertung, die durch eine Umgebungsgrenze entsteht, nicht im Code.

Monitoring-Resonanz statt statischer Liste (DESIGN_INTENT)

Heute (statisch, ✅): Die Liste kommt auf Anfrage (Web/CLI) aus sslListExtended bzw. dem Mock. Es gibt
state/state.json + state/actions.log (Terminal-Aktionen) und audit_log (wer hat was ausgelöst).
Nichts meldet sich von selbst.

Produktion (Ist in anderen Wald-Teilen): Icinga, Checkmk und allgemein Monitoring funken regelmĂ€ĂŸig.
Clients melden sich selbst („Resonanz“). Zielbild: Postgres mit Vektor (pgvector), irgendwann, im Rust-Core.

Unterscheidungen, die dafĂŒr tragen mĂŒssen, als Vorschlag:

  • Ein Monitoring-Check ist eine neue Feststellung mit eigenem Anker: Checker, Check-Definition,
    Zeitpunkt, Ziel. Beispiel: „Checker C hat um t auf host:443 ein Cert gesehen, gĂŒltig bis X.“ Das trĂ€gt
    Freshness fĂŒr diesen Moment, nicht mehr.
  • Wiederholung ≠ Korroboration (PRUEFUNG_FESTSTELLUNG §7): 288 grĂŒne Checks am Tag sind nicht 288-mal
    so viel Evidenz. AussagekrĂ€ftig sind die Zustandswechsel (grĂŒn → rot, anderes Cert, andere CA). Die
    Job-Queue/Cron aus ARCHITEKTUR M4 sollte deshalb ÜbergĂ€nge protokollieren, nicht DurchlĂ€ufe zĂ€hlen.
  • Selbstmeldung ≠ Außenbeobachtung: Ein Client, der „mein Cert ist gĂŒltig“ funkt, liefert eine
    Behauptung aus der Innensicht. Der TLS-Gate-cross-check ist die Außensicht auf dieselbe Kante. Beide
    widersprechen sich nicht automatisch (Relais-Test, PRUEFUNG_FESTSTELLUNG §8). Nur mit benannter
    gemeinsamer Grundlage lÀsst sich daraus ein Widerspruch oder eine Korroboration machen.
  • Resonanz ≠ Geltung (eigene Messung im 768-Raum, RESONANZ_UNGLEICH_GELTUNG_v0.1.md): Wenn
    Monitoring-Ereignisse als Vektoren landen, ist „Àhnliches Ereignis gefunden“ ein Candidate, keine
    zulĂ€ssige Grundlage fĂŒr eine Entscheidung wie „verlĂ€ngern“ oder „auslaufen lassen“.
  • Vorschlag zur Datentrennung: Beobachtungen (Monitoring/Resonanz) in eine eigene Tabelle, nicht in
    audit_log. audit_log beantwortet „wer hat was ausgelöst“ (Berechtigung). Beobachtungen beantworten
    „was wurde wann von wem gesehen“ (Evidenz). Die Vektorspalte gehört zu den Beobachtungen und macht sie
    auffindbar, nicht wahrer. Die Nahtstelle zum Rust-Core bleibt die DB (jobs, cert_inventory,
    audit_log + Beobachtungen).

Offene Fragen an OZMAI (OPEN)

  1. Reicht der bestehende VerificationAttempt (target, predicate, mechanism, policy, evidence_refs,
    assumption_refs, verifier, causal_anchor, resource_limit), um einen Monitoring-Check abzubilden, oder
    fehlt etwas fĂŒr „periodisch, gleiche Definition, wechselndes Ergebnis“?
  2. Ist „Zustandswechsel statt ZĂ€hlung“ fĂŒr Monitoring schon durch §7 (Wiederholung ≠ BestĂ€tigung) gedeckt,
    oder ist das ein eigener PrĂŒfvertrag?
  3. Gehört die Client-Selbstmeldung in denselben Bestand wie die Außenbeobachtung (mit Herkunftsmarke), oder
    muss sie getrennt bleiben?
  4. Wo liegt die ZulĂ€ssigkeitsprĂŒfung, wenn Vektor-Treffer ĂŒber Monitoring-Ereignisse eine Entscheidung
    vorbereiten? Nach der Resonanz-Messung vermutlich an der Generierungs-/Passkante, nicht im Score.

Kurz: v2 steht, getaggt und getestet. Die Struktur trÀgt neue Module ohne Overhead. TLS-Gate hÀlt an
mehreren Kanten schon „PrĂ€dikat ≠ stĂ€rkere Bindung“, an zwei Kanten nachweislich nicht. Und wenn aus
statisch „funkt regelmĂ€ĂŸig“ wird, zĂ€hlen ÜbergĂ€nge und nicht Wiederholungen, und Resonanz bleibt ein
Candidate.