Files
OZM-Keks-Handbuch-v1/crumbpage-19-agent-lockdown.md
2025-12-12 19:45:38 +01:00

5.4 KiB
Raw Blame History

🔐 Crumbpage 19: The Zero Trust Agent (Paranoid Mode)

Subtitle: Vertraue nichts, was du nicht gerade berührst
Pfad: 19 von X
Schwierigkeit: (4/5)
Zeit: ~2 Stunden
Voraussetzungen: SSH Agent, Bash Scripting

"Ein unbewachter Schlüssel ist ein verlorener Schlüssel." 🕵️‍♂️


📋 Das Szenario

Du sitzt im Café. Dein Laptop ist entsperrt, dein ssh-agent hat alle Keys im RAM. Ein Dieb reißt dir den offenen Laptop aus der Hand ("Snatch & Run"). Er hat jetzt Zugriff auf alle deine Server. 😱

Oder: Du gehst kurz weg, Screen Lock geht an. Jemand errät dein (schwaches?) Laptop-Passwort oder nutzt einen Exploit am Lockscreen. Sobald er drin ist: Vollzugriff via SSH.

Die Lösung: Der Agent muss seine Schlüssel vergessen, sobald du den Platz verlässt (Screen Lock). Und er muss sofort nach der Passphrase fragen, wenn du wiederkommst (Unlock).


🛡️ Level 1: Das Zeit-Limit (TTL)

Der einfachste Schutz. Schlüssel vergessen sich selbst nach X Minuten.

# Füge Key hinzu, aber vergiss ihn nach 5 Minuten (300 Sekunden)
$ ssh-add -t 300 ~/.ssh/id_ed25519

Pro: Funktioniert überall (Mac/Linux). Contra: Wenn du arbeitest, läuft es manchmal "unter den Fingern" ab.


🛡️ Level 2: Der "Nuke" Button

Gewöhne dir an, nicht nur den Screen zu sperren, sondern den Agent zu leeren.

In deiner .bashrc:

# Sperren UND Schlüssel wegwerfen
alias away='ssh-add -D && loginctl lock-session'

(Auf Mac: ssh-add -D && pmset displaysleepnow)

Benutzung: Wenn du aufstehst, tippe away. Laptop sperrt, Keys sind weg.


🛡️ Level 3: The Watchdog (Debian 13 / Mate Edition)

Status: Getestet & Verifiziert auf Debian 13 (Trixie) mit MATE Desktop.

Du willst, dass das automatisch passiert, wenn der Bildschirmschoner angeht? Wir nutzen dbus-monitor, um direkt auf den Puls des Screensavers zu hören.

Das Script: ssh-agent-guard.sh

Dieses Script muss in den Autostart (System -> Einstellungen -> Startprogramme).

#!/bin/bash
# ~/.local/bin/ssh-agent-guard.sh

LOG_FILE="$HOME/.ssh-agent-screenlock.log"
SOCKET_PATH="$HOME/.ssh/agent.sock"
PID_FILE="$HOME/.ssh-agent-watchdog.pid"
PAUSE_FILE="$HOME/.ssh-agent-watchdog.pause"

# 1. Singleton Check: Nur ein Wächter erlaubt
if [ -f "$PID_FILE" ]; then
    old_pid=$(cat "$PID_FILE")
    kill -0 "$old_pid" 2>/dev/null && kill "$old_pid"
fi
echo $$ > "$PID_FILE"

# 2. Cleanup Trap (Aufräumen bei Exit)
cleanup() { rm -f "$PID_FILE"; exit 0; }
trap cleanup SIGINT SIGTERM

log() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"; }

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

    log "🔒 LOCK: Killing Agent..."
    
    # Kill existing agents
    if [ -n "$SSH_AGENT_PID" ]; then kill "$SSH_AGENT_PID" 2>/dev/null; fi
    pkill -u "$USER" ssh-agent
    
    # Clean Environment
    unset SSH_AUTH_SOCK SSH_AGENT_PID
    rm -f "$SOCKET_PATH"

    # Respawn & Bind to fixed socket
    eval "$(ssh-agent -a "$SOCKET_PATH" -s)" >/dev/null
    
    # Save Environment for others
    echo "export SSH_AUTH_SOCK=$SOCKET_PATH" > "$HOME/.ssh/agent-environment"
    echo "export SSH_AGENT_PID=$SSH_AGENT_PID" >> "$HOME/.ssh/agent-environment"
    
    log "✨ RESPAWN: Neuer Agent (PID: $SSH_AGENT_PID)"
}

# 3. MATE Hardening: Sofort sperren, keine Grace-Period
gsettings set org.mate.screensaver lock-enabled true
gsettings set org.mate.screensaver lock-delay 0

# 4. Der DBus Loop
dbus-monitor --session "type='signal',interface='org.mate.ScreenSaver',member='ActiveChanged'" 2>/dev/null |
while read -r line; do
    if echo "$line" | grep -q "boolean true"; then
        # EVENT: Screen Locked -> Kill Agent
        mate-screensaver-command --lock 2>/dev/null # Double Tap
        restart_agent
    fi
done

Die Integration

Damit deine Terminals den neuen Agent immer finden, muss das Environment dynamisch geladen werden. In deiner .bashrc:

# Lade Agent-Info, falls vorhanden
if [ -f ~/.ssh/agent-environment ]; then
    source ~/.ssh/agent-environment
fi

🛡️ Level 4: Deep Work & Kontrolle

Manchmal darf der Agent nicht sterben (z.B. bei einem 50GB Upload über SCP, während du Kaffee holst). Dafür haben wir den Watchdog-Knochen (Pause-Funktion).

Im crumbpages-doktor (Modul Remote) gibt es jetzt Befehle:

  • watchdog status: Läuft der Wächter?
  • watchdog off: PAUSE. Der Screensaver tötet den Agent nicht mehr.
  • watchdog on: SCHARF. Sicherheit wiederhergestellt.

Tipp: Wenn du exit im Remote-Doktor tippst, feuert jetzt eine "Paranoid Trap" und löscht die Keys sofort (ssh-add -D). Sicher ist sicher.


🦉 Crystal Owl's Weisheit

"Ein System ist nur so sicher wie sein schwächstes Glied. Meistens ist das Glied... Bequemlichkeit."

Wir haben die Bequemlichkeit automatisiert. Der Agent stirbt, wenn du weggehst. Er wird wiedergeboren, wenn du wiederkommst aber ohne Erinnerung (Keys). Du musst das Passwort neu eingeben. Das ist der Preis der Sicherheit.


Version: 2.0 (Debian 13 Verified)
Status: Final
Tags: #Security #Debian13 #Mate #DBus #ZeroTrust


Navigation:
← Zurück: Alle Themen | Weiter: Tanz am Kernel (Bash Hacks)