🔐 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! 🛡️🦉