Minimaler Rust-Startpunkt für AdminBot v2 als lokaler, deterministischer Linux-Daemon.
Dieses Repository bildet jetzt nur noch das aktuelle AdminBot-v2-Zielbild ab:
- Rust-Daemon
adminbotd - Operator-CLI
adminbotctl - versionierte Policy-/polkit-/systemd-Artefakte
docs/adminbot_v2/*als Architektur- und Protokollreferenzdocs/security/*als kanonische Sicherheitsdokumentation
Der frühere Python-/rootbot-/Watchdog-/Docker-/ELK-Bestand ist bewusst nicht mehr Teil dieses Repositories.
Aktueller Stand:
- Unix Domain Socket IPC mit
u32-Length-Prefix und JSON - typisierte Requests, Responses und Fehlercodes
- statische Action Registry
- minimale Policy Engine auf TOML-Basis
- Audit-Logging über strukturierte Prozessausgabe für journald-Capture
- implementierte Aktionen:
system.statussystem.healthresource.snapshotdisk.usageservice.statusservice.restart
cargo buildDie minimale Operator-CLI liegt als eigener Binary-Einstieg vor:
cargo run --bin adminbotctl -- --helpUnterstuetzte Befehle:
adminbotctl statusadminbotctl healthadminbotctl policy validateadminbotctl gate run --mode artifact|liveadminbotctl audit tailadminbotctl restart --unit <unit> --reason <text> --confirm
Die vollstaendige Spezifikation und sichere Nutzung liegt unter:
docs/cli/adminbotctl.md
Low-Level-IPC-Testhilfen fuer das v2-Protokoll liegen weiterhin unter:
scripts/send_request.shscripts/test_success_case.shscripts/test_policy_deny_case.sh
sudo install -d -m 0755 /etc/adminbot
sudo install -m 0644 config/policy.example.toml /etc/adminbot/policy.toml
sudo chown root:root /etc/adminbot/policy.tomlDie Beispielpolicy ist bewusst konservativ und gibt dem lokalen Beispielclient nur Read-only-Capabilities.
Sie vergibt standardmaessig kein read_sensitive und schaltet weder journal.query noch process.snapshot oder service.restart im Default frei.
adminbotd startet fail closed, wenn /etc/adminbot/policy.toml nicht root-owned ist oder group-/world-writable bleibt.
Die versionierte polkit-Regelvorlage fuer den service.restart-Pfad liegt unter:
deploy/polkit/50-adminbotd-systemd.rules
Sie ist bewusst nur fuer den Service-User adminbot ausgelegt und oeffnet ausschliesslich die systemd-Aktion org.freedesktop.systemd1.manage-units. Die fachliche Freigabe bleibt in AdminBot-Policy und Code.
Wichtig fuer v1.x:
- Autorisierung folgt echten lokalen Peer-Credentials (
SO_PEERCRED, Unix-User, Unix-Gruppen) requested_by.typeundrequested_by.iddienen nur Audit, Korrelation und UX- wenn Human- und Agent-Rollen unterschiedlich berechtigt sein sollen, muessen sie ueber getrennte Unix-User oder Gruppen getrennt werden
Der Daemon erwartet standardmäßig:
- Policy:
/etc/adminbot/policy.toml - Socket:
/run/adminbot/adminbot.sock - Socket-Gruppe:
adminbotctl - Restart-Abuse-State:
/var/lib/adminbot/restart_abuse_state.json
Vor dem Start:
sudo install -d -o adminbot -g adminbot -m 0750 /run/adminbotadminbotd startet fail closed, wenn /run/adminbot nicht das erwartete Runtime-Verzeichnis ist oder wenn unter /run/adminbot/adminbot.sock ein unsicheres Alt-Artefakt liegt.
Fuer service.restart gilt zusaetzlich: der Daemon erwartet ein sicheres, beschreibbares State-Artefakt unter /var/lib/adminbot/restart_abuse_state.json. Wenn dieses Artefakt untrusted oder nicht persistierbar ist, wird der Restart-Pfad fail closed blockiert.
Dann:
cargo runDer verbindliche Security-Gate-Check liegt unter:
scripts/verify_security_release_gate.sh
Das Script ist der stabile Repo-/CI-Einstiegspunkt und delegiert intern an:
adminbotctl gate run
Repo-/CI-Check:
bash scripts/verify_security_release_gate.sh --mode artifact
adminbotctl gate run --mode artifactDieser Check wird zusaetzlich automatisch in GitHub Actions erzwungen:
- Workflow:
.github/workflows/security-gate.yml - Pflicht fuer Pull Requests
- Pflicht fuer Pushes auf
devundmain
Ein PR gilt damit nicht als security-sauber, wenn das artifact-Gate fehlschlaegt.
Zielsystem-Check:
bash scripts/verify_security_release_gate.sh --mode live
adminbotctl gate run --mode liveDie mitgelieferten Skripte erzeugen das binäre u32-Length-Prefix und sprechen danach direkt mit dem Unix Domain Socket.
Success-Case:
./scripts/test_success_case.sh /run/adminbot/adminbot.sockPolicy-Deny-Case:
./scripts/test_policy_deny_case.sh /run/adminbot/adminbot.sockGenerisch mit JSON von stdin:
echo '{"version":1,"request_id":"2a6f8f0d-6fa0-4f42-b5d8-6dd9f2a62571","requested_by":{"type":"human","id":"local-cli"},"action":"system.status","params":{},"dry_run":false,"timeout_ms":3000}' | ./scripts/send_request.sh /run/adminbot/adminbot.sock -