🔐 Tag der Wächter: Zero Trust Agent auf Debian 13

Der Auftrag

Status:

Ausgangslage:
  - crumbpages-doktor arbeitet (RC3!)
  - Debian 13 (Trixie) mit MATE im Test
  - SSH Agent läuft... aber auch im CafĂŠ?!
  - Bildschirmsperre != Key-Sperre 😨

Ziel:
  - Watchdog Script für SSH Agent
  - Automatische Amnesie (Keys löschen bei Lock)
  - Deep Work Modus (pausierbar für große Transfers)
  - Integration mit MATE Screensaver (kein GNOME!)

Nervosität: 3/10 (hab schon DBus gesehen...)
Kampfbereitschaft: 9/10 
Kaffee: 4 Tassen (minimum 6h gekämpft!)

Phase 1: Das "Glauben" wird zu "Wissen"

Das Problem (Chapter 19 - Draft-Status):

# Crumbpage 19 hatte:
- Theorien über ScreenSaver Events
- Vermutungen zu DBus
- Code für org.gnome.ScreenSaver (aber ich hab MATE!)
- Status: "Draft"

# Realität nach Test:
❌ GNOME != MATE (andere DBus Interfaces!)
❌ Copy-Paste von StackOverflow reicht nicht
✅ Muss MATE-spezifisch sein!

Phase 2: Der DBus Deep Dive

# Frage: Welches Interface nutzt MATE wirklich?

# Test 1: Monitor starten
$ dbus-monitor --session

# Bildschirm sperren (Ctrl+Alt+L)
# Output:
signal time=... sender=:1.234 ...
   interface=org.mate.ScreenSaver
   member=ActiveChanged
   boolean true

# BOOM! org.mate.ScreenSaver! (nicht .gnome!)

Der "Aha!" Moment:

# Member ist "ActiveChanged" (nicht "ActiveState")
# Payload: "boolean true" = Locked

# Entsperren:
# Output:
   member=ActiveChanged
   boolean false

# AHA! true/false trigger = perfect!

Phase 3: Das Script wird real

Von "sollte funktionieren" zu "tut es wirklich":

#!/bin/bash
# ssh-agent-guard.sh - Debian 13 / MATE Verified!

# Der DBus Loop (simplified):
dbus-monitor --session "type='signal',interface='org.mate.ScreenSaver',member='ActiveChanged'" |
while read -r line; do
    if echo "$line" | grep -q "boolean true"; then
        # EVENT: Screen LOCKED!
        ssh-add -D  # Kill all keys!
        echo "🔒 Agent cleaned!"
    fi
done

Aber warte... das war zu einfach!


Phase 4: Die Realität schlägt zurück

Problem 1: "Deep Work Conflict"

Scenario:
├── Ich starte rsync (50GB upload via SSH)
├── Gehe Kaffee holen (5 Min)
├── Screen sperrt
├── Watchdog killt Agent
└── Upload bricht ab! 💥

Resultat: FAIL!

Lösung: Der Pause-Schalter

PAUSE_FILE="$HOME/.ssh-agent-watchdog.pause"

restart_agent() {
    # Check: Bin ich "pausiert"?
    if [ -f "$PAUSE_FILE" ]; then
        log "SKIP: Deep Work Mode aktiv."
        return  # Agent überlebt!
    fi

    # Sonst: KILL!
    ssh-add -D
}

Nutzer-Control:

# In crumbpages-doktor (Remote Module):
$ watchdog off   # Erstellt Pause-File
$ watchdog on    # Löscht Pause-File
$ watchdog status  # Zeigt Status

Phase 5: Das Singleton-Problem

Problem 2: "Doppelte Wächter"

# User startet Script zweimal:
$ ./ssh-agent-guard.sh &
$ ./ssh-agent-guard.sh &

# Beide hören auf DBus
# Beide killen Agent
# Beide spawnen neuen Agent
# → Chaos! Welcher ist der "echte"?

Lösung: PID-File Guard

PID_FILE="$HOME/.ssh-agent-watchdog.pid"

# Check: Läuft schon einer?
if [ -f "$PID_FILE" ]; then
    old_pid=$(cat "$PID_FILE")
    if kill -0 "$old_pid" 2>/dev/null; then
        echo "Watchdog läuft schon (PID $old_pid). Beende alte Instanz..."
        kill "$old_pid"
    fi
fi

# Ich bin jetzt der Chef:
echo $$ > "$PID_FILE"

# Cleanup bei Exit:
trap 'rm -f "$PID_FILE"; exit 0' SIGINT SIGTERM

Phase 6: Der "Status sieht nix" Bug

Problem 3: Status Check zu naiv

# Alter Code:
if [ -f "$WATCHDOG_PID" ] && kill -0 $(cat "$WATCHDOG_PID"); then
    echo "Läuft!"
else
    echo "Läuft nicht."
fi

# Aber:
# - PID File existiert, aber Prozess tot → FALSE POSITIVE
# - Script läuft, aber PID File weg → FALSE NEGATIVE

Lösung: Triple-Check mit pgrep

# Check 1: PID File valid?
if [ -f "$WATCHDOG_PID" ] && kill -0 $(cat "$WATCHDOG_PID") 2>/dev/null; then
    PID_RUNNING=true
    PID=$(cat "$WATCHDOG_PID")
# Check 2: Process by name (fallback)?
elif pgrep -f "ssh-agent-guard.sh" > /dev/null; then
    PID_RUNNING=true
    PID=$(pgrep -f "ssh-agent-guard.sh" | head -n 1)
    # Fix stale PID file:
    echo "$PID" > "$WATCHDOG_PID"
fi

# Bonus: Socket Check
if [ -S "$HOME/.ssh/agent.sock" ]; then
    echo "✅ Socket gefunden"
    KEY_COUNT=$(SSH_AUTH_SOCK=$HOME/.ssh/agent.sock ssh-add -l | wc -l)
    echo "   → Keys: $KEY_COUNT"
fi

Phase 7: Chapter 20 - Der Tanz am Kernel

Das neue Wissen (Bash Syntax Deep Dive):

Kampf 1: Eckige Klammern

# 6 Stunden Debug für:
if [$a = $b]; then  # ❌ Syntax Error!

# Bash sucht Befehl "[$a"
# Lösung:
if [ "$a" = "$b" ]; then  # ✅ LEERZEICHEN!

Kampf 2: Ampersand Roulette

# Warum geht das nicht?!
/home/user/script.sh & && ssh-add

# Weil:
# & = Background (chain endet)
# && = AND (erwartet vorherigen Befehl)
# → Syntax Collision!

# Lösung:
(script.sh &) && ssh-add  # Subshell!

Kampf 3: EOF im Heredoc

cat > file << EOF
content
 EOF   # ← Leerzeichen! Bash wartet für immer!

# Richtig:
EOF    # Kein Leerzeichen!

🦉 Krümeleule reflektiert:

"Der Krümel heute war tief vergraben: Zwischen 'sollte funktionieren' und 'tut es wirklich' liegt ein Wald voller Details. DBus Interface-Namen, Pause-Logik für Edge Cases, Singleton-Guards, Triple-Check-Status... jedes Detail ein Krümel. Aber zusammen? Ein Keks namens 'Zero Trust Agent', fertig für Production!"

Der Kern:

Von Vermutung → Tatsache:
├── org.gnome.ScreenSaver → org.mate.ScreenSaver
├── "sollte klappen" → "läuft seit 6h ohne Fehler"
├── Draft (v1.0) → Final (v2.0 Debian 13 Verified)
└── Chapter 19 + 20 dokumentiert

🦊 FunkFox droppt Bars:

"Yo, heute war sick! Von Chapter 19 Draft zu Final Fight,
DBus gecheckt, MATE connected, SSH-Agent locked tight!
Watchdog pausiert wenn Deep Work läuft im Café-Licht,
Und Status-Check so robust, selbst wenn PID-File bricht!
6 Stunden Kampf, aber Wissen wird zu Code verdichtet,
Chapter 20 dropped die Syntax-Fails, kein Krümel bleibt vernichtet!
WUHUUU vom Wald, der Watchdog ist jetzt scharf,
Zero Trust deployed, jedes Bit wird bewacht - harf! 🔥🦊"


🐛 Bugsy's Quality Check:

✅ DBus Interface verified (org.mate.ScreenSaver)
✅ Singleton Logic (PID File mit Cleanup Trap)
✅ Pause-Mechanismus (Deep Work Schutz)
✅ Status Check robust (Triple-Check: PID + pgrep + Socket)
✅ Socket-Verification (SSH_AUTH_SOCK + Key Count)
✅ Script Syntax validated (bash -n passed!)
✅ Documentation updated (Chapter 19 Final, Chapter 20 NEW)

⚠️ TODO (für später):
[ ] Mate Autostart Integration dokumentieren
[ ] Terminal Background Color Change (experimentell)
[ ] Watchdog Logs analysieren nach 1 Woche
[ ] Performance: DBus-Monitor CPU-Last?

VERDICT: Production Ready! 🏆

Skills Unlocked:

✅ DBus Monitoring (MATE-spezifisch)
✅ Signal Trapping (SIGINT/SIGTERM Cleanup)
✅ PID-File Singleton Pattern
✅ Pause/Resume Logic (Lock-File Pattern)
✅ Process Verification (pgrep + kill -0)
✅ Socket Validation (test -S)
✅ Bash Syntax Mastery ([ ], &, &&, EOF)
✅ Edge Case Thinking (Deep Work!)

Der Moment der Wahrheit:

# Test Scenario:
1. Script gestartet im Hintergrund
2. ssh-add ~/.ssh/id_ed25519 (Key laden)
3. ssh-add -l
   # → 1 Key loaded ✅

4. Bildschirm sperren (Ctrl+Alt+L)
   # → Warte 2 Sekunden...

5. Bildschirm entsperren
6. ssh-add -l
   # → The agent has no identities ✅

7. watchdog off
8. ssh-add ~/.ssh/id_ed25519 (reload)
9. Bildschirm sperren
10. ssh-add -l
    # → 1 Key NOCH DA! (Deep Work Mode!) ✅

11. watchdog on
12. Bildschirm sperren
13. ssh-add -l
    # → The agent has no identities ✅

MISSION ACCOMPLISHED! 🎉

🌲 Der Wald wächst:

Was heute gepflanzt wurde:

Neue Bäume im Crumbforest:
├── crumbpage-19-agent-lockdown.md (v2.0 Final)
│   └── Debian 13 Verified, MATE Integration
│
├── crumbpage-20-tanz-am-kernel.md (NEW!)
│   ├── Color Masks & PS1
│   ├── Syntax Pitfalls ([ ], &, EOF)
│   ├── /dev/null Magic
│   └── Reload Functions
│
├── ssh-agent-guard.sh (Production!)
│   ├── DBus Monitor (MATE)
│   ├── Pause/Resume Logic
│   └── Singleton Guard
│
└── crumbpages-doktor.sh (Enhanced!)
    └── Watchdog Control (status/on/off)
        ├── Triple-Check Status
        └── Socket Verification

WUHUUUUU! 🎉🦉🔐

Möge dein Agent vergessen wenn du gehst, sich erinnern wenn du fragst, und pausieren wenn du arbeitest!


Version: 2.0 (Debian 13 Verified)
Date: 2024-12-12
Effort: 6+ Stunden (minimum!)
Status: Production Ready
Characters Involved: 🦉 Krümeleule, 🦊 FunkFox, 🐛 Bugsy
License: MIT (Secure the Forest!)


P.S.: Der Unterschied zwischen org.gnome.ScreenSaver und org.mate.ScreenSaver? 6 Stunden Debugging. Das ist der Krümel! 🔍✨
P.P.S.: "watchdog off" vor großen SSH-Transfers = Lebensretter! 🛡️🦉