Add reproducible Docker and WireGuard host bootstrap

This commit is contained in:
Mikei386
2026-08-20 21:23:16 +02:00
parent cb07779f5a
commit e83c0e2c70
25 changed files with 1584 additions and 835 deletions
+50 -60
View File
@@ -1,73 +1,63 @@
# Sicherheitsmodell
## Grundsatz
## Netzgrenze
Das lokale Modell erhält nur die Werkzeuge, die es für den aktuellen Modus
benötigt. Lokalität allein ersetzt keine Zugriffskontrolle.
- KI-Ports binden ausschließlich an die WireGuard-IP.
- Docker-Netze `172.30.0.0/16` verwenden eine eigene Routingtabelle.
- Heimnetz- und optionaler Internetverkehr laufen über WireGuard.
- Eine Blackhole-Default-Route verhindert Fail-open bei Tunnelverlust.
- `DOCKER-USER` erlaubt nur etablierte Verbindungen, KI→WireGuard und
WireGuard→Open-WebUI/Router.
- Der Host ist kein Router zwischen Universitäts- und Heimnetz.
## MCP-Profile
Docker-publizierte Ports können gewöhnliche Host-Firewallregeln umgehen.
Darum setzt der Installer seine Regeln ausdrücklich in `DOCKER-USER` und
verlässt sich nicht allein auf UFW.
Empfohlene Trennung:
## Containergrenzen
| Modus | Werkzeuge |
- llama.cpp: read-only, keine Capabilities, Modelle read-only, keine Ports.
- Router: unprivilegierter Benutzer, kein Docker-Socket, feste API-Oberfläche.
- Profile Controller: einzige Socket-Ausnahme; feste Profile und nur
List/Start/Stop, keine frei wählbaren Images, Befehle oder Mounts.
- Open WebUI: einziges persistentes Chat-Volume.
- SearXNG: intern, Suchanfragen ohne Chatverlauf.
Ein Docker-Socket bleibt grundsätzlich privilegiert. Der Controller reduziert
die erreichbare Funktion stark, ersetzt aber keine zusätzliche Socket-Proxy-
Sandbox. Er ist klein, testbar und nicht von Clients direkt erreichbar.
## Secrets und private Daten
- Keine Secrets in Git, Prompts, MCP-Schemas, Logs oder Screenshots.
- Installer-Konfiguration und `/etc/mike-ai/*` haben restriktive Rechte.
- Router-, Controller- und WebUI-Schlüssel sind getrennt und zufällig.
- Das Modell bekommt keine Schlüsselwerte zurück; spätere Integrationen nutzen
lokale Broker/Environment-Dateien.
- Open-WebUI-Volume kann Chats enthalten und wird nur verschlüsselt gesichert.
## Werkzeugprofile
| Modus | Erlaubte Werkzeuge |
|---|---|
| Standard | Websuche, harmlose lokale Hilfsfunktionen |
| Home Assistant | HA-Administration plus Websuche |
| ARR | Sonarr/Radarr plus Websuche |
| Unraid Read-only | Diagnose, Logs, Status |
| Unraid Write | nur bewusst aktiviert, mit Vorschau und Approval Ticket |
| Standard | lokale Websuche, harmlose Hilfsfunktionen |
| Home Assistant | eigener begrenzter HA-MCP |
| ARR | Sonarr/Radarr, zuerst read-only |
| Unraid Diagnose | Status und eng begrenzte Logs |
| Administration | Vorschau, Approval-Ticket, Verifikation |
## Nicht im Standardprofil
- allgemeine Shell
- `python3`, `ssh`, `scp` oder beliebiges `curl`
- Container erstellen, verändern oder löschen
- Registry-/Storage-Direktzugriff
- uneingeschränkte Dateisuche
## Secrets
- Keine Secrets in Git, Prompts, MCP-Schemas oder Logs.
- Konfiguration referenziert nur Namen lokaler Environment-Dateien.
- Dateien mit Secrets: Eigentümer root oder Dienstbenutzer, Modus `0600`.
- Tokens werden pro Dienst getrennt und minimal berechtigt.
- Ein Secret Broker oder Wrapper stellt Verbindungen her, ohne Tokens an das
Modell zurückzugeben.
## Netzwerk
- Port 8080 nur localhost oder administratives VLAN.
- Clients verwenden Port 8081.
- Whisper, XTTS, TinySearch und SearXNG nur localhost.
- Firewall erlaubt nur bekannte Quellnetze.
- Externe Suche erhält nur die tatsächliche Suchanfrage, keine Chat-Historie.
## Router-Grenze
- Alle fachlichen Endpunkte verlangen einen mindestens 32 Zeichen langen,
zufälligen Router-Key. Der Dienst startet ohne gültigen Key nicht.
- `/health` und `/ready` sind die einzigen anonymen Endpunkte und geben nur
groben Betriebszustand aus.
- Authentifizierungsheader werden niemals an llama.cpp weitergereicht.
- Remote-Bild-URLs sind standardmäßig gesperrt. Data-URLs werden auf MIME-Typ,
Base64-Gültigkeit und 20 MiB Maximalgröße geprüft.
- Die Zahl gleichzeitiger Requests ist begrenzt; große Uploads sind global
begrenzt und generierte Bilder werden nach Alter, Anzahl und Größe bereinigt.
- Crash-Recovery beendet keine PID nur aufgrund einer Zahl, sondern verlangt
zusätzlich einen erwarteten Prozessmarker in `/proc/<pid>/cmdline`.
Allgemeine Shell, beliebiges SSH/SCP, freies `curl`, Docker-Administration und
Dateisystemsuche gehören nicht ins Standardprofil.
## Schreibaktionen
Jede destruktive oder persistente Aktion verwendet:
Persistente oder destruktive Änderungen folgen immer: Bestandsaufnahme,
exakte Vorschau, an die Vorschau gebundene Freigabe, unveränderte Ausführung,
anschließende Verifikation.
1. read-only Bestandsaufnahme,
2. exakte Vorschau,
3. an diese Vorschau gebundenes Approval Ticket,
4. unveränderte Ausführung,
5. anschließende Verifikation.
## Vor jedem Push
## Repository-Prüfung vor jedem Push
- Suche nach Token-, Passwort- und Private-Key-Mustern.
- Keine `.env`, Zertifikate, Logs, Bilder, Audio oder Modellartefakte.
- Keine echten internen API-Schlüssel in Beispielen.
- Private-Key-, Token-, Passwort- und API-Key-Muster suchen.
- Keine `.env`, Zertifikate, Logs, Bilder, Audio oder Modelle einchecken.
- Beispiele enthalten nur Platzhalter; interne Hostnamen nur wenn bewusst.
- Änderungen am Controller und Netzwerkguard mit Tests und Review versehen.