From e9a5b36ecb54025ae0a689f61e6a37fc40a61cc0 Mon Sep 17 00:00:00 2001 From: Christoph Emsenhuber Date: Sun, 23 Aug 2026 21:25:56 +0200 Subject: [PATCH] Passwort-Rotation Etappe 1: dedizierte Service-Accounts statt geteiltem admin Vor dem Rotieren den Radius erhoben -- und der ist groesser als geplant: das Admin-Konto teilen sich fuenf Konsumenten. Neben ~/.secrets und der MikroMCP-Registry haengen der Nautobot-Stack (Portainer-Redeploy noetig) und VIER HA-mikrotik-Integrationen mit 40 device_tracker daran. Die HA- Eintraege melden supports_reconfigure=false, sind also nicht skriptbar. Christophs Entscheid daraufhin: Konten trennen statt ein Passwort teilen. Nicht das Rotieren ist das Problem, sondern dass ein einziges admin von fuenf Stellen benutzt wird -- sonst kostet jede Rotation wieder vier Re-Auths und einen Stack-Redeploy. Etappe 1 ist durch, rein additiv, kein laufender Dienst beruehrt. Vorher existierte auf allen vier Geraeten nur admin in der Gruppe full. Jetzt: grp-ha read,api,rest-api,test -> user ha grp-nautobot ssh,read,write,test,sensitive -> user nautobot Passwoerter als MIKROTIK_HA_PASS / MIKROTIK_NAUTOBOT_PASS in ~/.secrets. Angelegt ueber ein Skript, das die Werte aus der Datei liest -- bewusst nicht ueber manage_user, dessen password-Parameter im Transkript landet. Abnahme auf allen vier Geraeten: ha liest (am Core 59 DHCP-Leases) und wird beim Schreiben abgewiesen; nautobot kommt per SSH rein und exportiert. Der Export von nautobot ist byte-identisch zu dem von admin (391/56/87/87 Zeilen) -- die GC-Compliance driftet beim Umstellen also nicht, was das Hauptrisiko dieser Etappe war. /user wird von keiner ComplianceRule abgedeckt, die Konten erzeugen selbst keinen Drift. Offen: Konsumenten umhaengen (Nautobot-Stack, 4x HA), dann erst admin rotieren -- danach beruehrt eine Rotation nur noch zwei Dateien. Eigener Fehler protokolliert: eine Enumeration hat das ap1-Passwort im Klartext ins Transkript geschrieben. Selber Wert wie der am 22.08. verbrannte, also keine neue Expositionsklasse -- aber Merkregel ergaenzt, dass Secrets-Enumeration nur Schluesselnamen ausgibt. Co-Authored-By: Claude Opus 5 --- docs/teilprojekte.md | 54 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/docs/teilprojekte.md b/docs/teilprojekte.md index f237dd0..283e629 100644 --- a/docs/teilprojekte.md +++ b/docs/teilprojekte.md @@ -1054,7 +1054,59 @@ den Weg, über den man den Fehler zurücknehmen wollte. auf User-Entscheid 2026-08-23 vorerst unverändert**, weil Redigieren ihn nicht aus der Historie holt und Rotieren heute ~22 Shellys kostet. Nach TP17.1 sind es deutlich weniger. Anlass: das Core-Passwort ist bei einer Debug-Ausgabe im Klartext in ein Sitzungstranskript geraten. Ursache war `sshpass -p`, das es in die **Kommandozeile** - schreibt — sichtbar in `ps` und in jedem argv-Trace. ✅ **Vorbedingung erfüllt, geprüft 2026-08-23:** alle vier + schreibt — sichtbar in `ps` und in jedem argv-Trace. + --- + #### 🔑 Radius-Befund 2026-08-23: das Admin-Konto teilen sich FÜNF Konsumenten + Vor dem Rotieren erhoben — das ist deutlich mehr als „vier Geräte + eine Datei": + + | Halter | Nachziehen | + |---|---| + | `~/.secrets/credentials.env` | Datei | + | `~/.claude.json` (MikroMCP-Env, `ROUTER_*`/`CRS326_*`) | JSON + MCP-Neustart | + | **Nautobot-Stack** `NAUTOBOT_ROUTEROS_USERNAME/PASSWORD` | Stack-Datei + **Portainer-Redeploy auf der DS923** | + | **HA: VIER `mikrotik`-Integrationen** (`.99.1/.2/.11/.12`, 40 `device_tracker`) | 🔴 **`supports_reconfigure: false` — NICHT skriptbar**, 4× Re-Auth von Hand | + | Repo-Skripte (`routeros/*.py`, `nautobot/*.py`, `docs/tp*.sh`) | ziehen aus `~/.secrets` → automatisch | + + ⇒ **User-Entscheid 2026-08-23: Konten trennen statt ein Passwort teilen.** Nicht das Rotieren ist + das Problem, sondern dass ein einziges `admin` von fünf Stellen benutzt wird — jede Rotation kostet + sonst wieder vier Re-Auths und einen Stack-Redeploy. + + #### ✅ Etappe 1 DURCH (2026-08-23): dedizierte Service-Accounts auf allen vier Geräten + Rein **additiv**, kein laufender Dienst berührt. Vorher existierte **nur** `admin` (Gruppe `full`). + + | Gruppe | Policy | User | Zweck | + |---|---|---|---| + | `grp-ha` | `read,api,rest-api,test` | `ha` | HA-Mikrotik-Integration, **lesend** über API 8728 | + | `grp-nautobot` | `ssh,read,write,test,sensitive` | `nautobot` | Golden Config über SSH/Netmiko (Backup **und** Deploy) | + + Passwörter: `MIKROTIK_HA_PASS` / `MIKROTIK_NAUTOBOT_PASS` in `~/.secrets/credentials.env` + (32 Zeichen, je Dienst eigen, geräteübergreifend gleich). + 🔒 **Angelegt über ein Skript, das die Werte aus der Datei liest** — bewusst *nicht* über + `manage_user`, dessen `password`-Parameter im Sitzungstranskript landen würde. + + **Abnahme, auf allen vier Geräten geprüft:** + - `ha` liest (`identity`, `dhcp-lease` — am Core 59 Einträge, genau was das Device-Tracking braucht), + **Schreibversuch wird abgewiesen**. + - `nautobot` meldet sich per SSH an und exportiert; **kein REST** (bewusst kein `rest-api` in der Policy). + - 🎯 **Der Export von `nautobot` ist byte-identisch zu dem von `admin`** (391/56/87/87 Zeilen je Gerät) + ⇒ **die GC-Compliance driftet beim Umstellen nicht.** Das war das Hauptrisiko dieser Etappe. + - `/user` wird von **keiner** ComplianceRule abgedeckt ⇒ die neuen Konten erzeugen selbst keinen Drift. + + #### ⏭️ Etappe 2 offen — die Konsumenten umhängen, DANN `admin` rotieren + 1. **Nautobot** auf `nautobot` umstellen (Stack-Env + Portainer-Redeploy), GC-Backup-Lauf als Abnahme. + 2. **HA**: die vier `mikrotik`-Einträge auf den `ha`-User bringen. ⚠️ Reconfigure ist nicht skriptbar; + Entfernen-und-neu-Anlegen **wäre** skriptbar, riskiert aber die 40 `device_tracker`-Entity-IDs + (sie leiten sich aus der MAC ab, kämen also gleich zurück — **aber erst nachdem** die alten + Registry-Einträge weg sind, sonst hängt HA ein `_2` an; dieselbe Falle wie beim Shelly-Rename). + 3. **Erst danach** `admin` rotieren — dann berührt es nur noch `~/.secrets` + `~/.claude.json`. + + 🔴 **Eigener Fehler, protokolliert:** beim Erheben des Radius hat ein `json.dumps`-Aufruf über + `~/.claude.json` das **ap1-Passwort im Klartext ins Transkript geschrieben**. Da alle vier Geräte + dasselbe `admin`-Passwort teilen, ist es **derselbe Wert, der am 2026-08-22 bereits verbrannt ist** — + keine neue Expositionsklasse, aber ein zweiter Beleg dafür, dass die Rotation fällig ist. + **Merkregel: Secrets-Enumeration gibt nur Schlüsselnamen aus, nie Werte** — auch nicht abgeschnitten. + + ✅ **Vorbedingung erfüllt, geprüft 2026-08-23:** alle vier Skripte laufen auf `sshpass -e` (`tp6-marker/server.py`, `tp6-monitor-core.sh`, `tp25-walk-messung.sh`, `tp25-pin-s22.sh`) — die frühere Notiz, zwei davon hätten die Schwäche noch, war veraltet. Übrig blieb nur **`CLAUDE.md`, das `sshpass -p` weiterhin aktiv als Reboot-Weg