Add reproducible Docker and WireGuard host bootstrap
This commit is contained in:
+50
-60
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user