Files
infrastructure/docs/GNAI-004-SEC_Access-Control.md
2026-08-28 18:54:45 +02:00

390 lines
8.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Security & Access Control Specification
**Dokumenten-ID:** GNAI-004-SEC
**Titel:** Homelab / LLM-Infrastruktur Sicherheits-, Authentifizierungs- und Zugriffskonzept
**Version:** 1.0
**Status:** Architekturentscheidung
**Vorgänger / Referenzen:** GNAI-INFRA-003
---
## 1. Zweck
Dieses Dokument definiert das verbindliche Zugriffs- und Authentifizierungsmodell für die öffentlich und intern erreichbaren Komponenten der Ghostnet-Infrastruktur.
Das Modell trennt bewusst:
- **Netzwerkzugang** über WireGuard,
- **Benutzeridentität** über Keycloak/OIDC,
- **Maschinen-/API-Zugriff** über API-Keys bzw. anwendungsbezogene Credentials,
- **SSH-Administration** über SSH Public Keys.
Ziel ist Least Privilege bei gleichzeitig überschaubarer Administration.
---
## 2. Rollenmodell
### 2.1 Full Admin
Vollständiger privilegierter Infrastrukturzugriff.
**Netzwerkzugang:**
- WireGuard
**Erlaubte Zielbereiche:**
- Proxmox Management
- LLM Server
- weitere explizit freigegebene Managementsysteme
**Zusätzliche Authentifizierung:**
- Proxmox-eigene Authentifizierung und 2FA, sofern konfiguriert
- SSH Public Keys für SSH
- Anwendungsspezifische Credentials bei Web-UIs
WireGuard ersetzt die eigentliche Dienstauthentifizierung nicht.
---
### 2.2 LLM Admin
Administration des LLM-Servers ohne allgemeine Proxmox-/LAN-Administration.
**Netzwerkzugang:**
- WireGuard
**Erlaubte Zielbereiche:**
- LLM-Server
- SSH
- weitere ausdrücklich für den LLM-Betrieb freigegebene Managementschnittstellen
**Nicht erlaubt:**
- Proxmox Management
- allgemeiner Zugriff auf andere Service-LXCs
- allgemeiner Zugriff auf das LAN
**SSH:**
- Public-Key-Authentifizierung
- kein Passwort-Login
---
### 2.3 LLM User
Kein privilegierter Netzwerkzugang.
**Zugang:**
```text
HTTPS → NPM → LiteLLM
```
**Authentifizierung:**
- API-Key
**Erlaubt:**
- Nutzung der von LiteLLM freigegebenen Modelle / Endpunkte
- Nutzung nach den für den Benutzer gesetzten Quoten und Policies
**Nicht erlaubt:**
- SSH
- Zugriff auf den LLM-Server allgemein
- Zugriff auf `llama.cpp` direkt
- Zugriff auf Proxmox
- Zugriff auf andere interne Services
Ein normaler LLM User erhält **keinen WireGuard-Peer**, sofern für einen konkreten Anwendungsfall kein zusätzlicher privilegierter Zugriff erforderlich ist.
---
## 3. Zugriffsmatrix
| Ziel | Full Admin | LLM Admin | LLM User | Öffentlich |
| --- | --- | --- | --- | --- |
| Proxmox Web UI | ✅ WireGuard | ❌ | ❌ | ❌ |
| Proxmox SSH | ✅ WireGuard + SSH-Key | ❌ | ❌ | ❌ |
| LLM Server SSH | ✅ WireGuard + SSH-Key | ✅ WireGuard + SSH-Key | ❌ | ❌ |
| `llama.cpp` direkt | intern/admin nach Bedarf | intern/admin nach Bedarf | ❌ | ❌ |
| LiteLLM API | ✅ | ✅ | ✅ HTTPS + API-Key | ✅ HTTPS |
| OpenWebUI | ✅ | ✅ optional | ✅ HTTPS + OIDC | ✅ HTTPS |
| Nextcloud | ✅ | ✅ optional | ✅ HTTPS + OIDC | ✅ HTTPS |
| Gitea | ✅ | ✅ optional | ✅ HTTPS + OIDC | ✅ HTTPS |
| Keycloak OIDC-Endpunkte | ✅ | ✅ | ✅ für Login | ✅ nur erforderliche Endpunkte |
| Keycloak Admin | ✅ WireGuard | ❌ | ❌ | ❌ |
| NPM Admin | ✅ WireGuard | ❌ | ❌ | ❌ |
| Fail2Ban Management | ✅ intern/admin | ggf. LLM-intern falls separat erforderlich | ❌ | ❌ |
---
## 4. Authentifizierungsmodell
### 4.1 WireGuard
WireGuard authentifiziert Peers kryptografisch über Public-/Private-Key-Paare.
Es besteht keine Kopplung zwischen WireGuard-Peer-Authentifizierung und Keycloak.
Grund:
- WireGuard kontrolliert **Netzwerkzugang**
- Keycloak kontrolliert **Benutzer-/Anwendungsidentität**
Diese Trennung ist beabsichtigt.
---
### 4.2 Keycloak / OIDC
Keycloak ist die zentrale Identitätsquelle für webbasierte Benutzeranwendungen.
Ziel:
```text
Benutzer
Keycloak
↓ OIDC
Nextcloud / Gitea / OpenWebUI / weitere Services
```
Administrative Keycloak-Funktionen bleiben auf das Managementnetz beschränkt.
---
### 4.3 LiteLLM API
Die LLM-API ist ein anwendungsbezogener Dienst und wird deshalb nicht durch einen allgemeinen LAN-/VPN-Zugang für normale Benutzer bereitgestellt.
Ziel:
```text
Client
↓ HTTPS
NPM
LiteLLM
llama.cpp
```
Die Autorisierung erfolgt über API-Keys.
API-Keys sollen:
- individuell pro Benutzer bzw. Anwendung vergeben werden,
- widerrufbar sein,
- nach Möglichkeit mit Quoten / Rate Limits verbunden werden,
- nicht als Ersatz für privilegierten Netzwerkzugriff dienen.
---
### 4.4 SSH
SSH wird auf dem LLM-Server schlüsselbasiert betrieben.
Zusätzliche Schutzschicht:
```text
WireGuard
+
SSH Public Key
```
Passwort- und Root-Login über SSH bleiben deaktiviert.
---
## 5. Netzwerk-Autorisierung
WireGuard-Peers werden nicht pauschal für das gesamte LAN freigeschaltet.
Zugriff ist mindestens nach folgendem Muster zu definieren:
```text
Full Admin
→ Proxmox
→ LLM Server
→ explizit freigegebene Managementziele
LLM Admin
→ LLM Server
→ explizit freigegebene Managementziele
LLM User
→ kein Management-VPN
```
`AllowedIPs` und Firewall-Regeln bilden gemeinsam die technische Durchsetzung.
---
## 6. Public vs. Private Exposure
### Öffentlich
- HTTP/HTTPS auf NPM
- für den VPN-Betrieb: WireGuard UDP-Port
- OIDC-Endpunkte, soweit für Web-Login erforderlich
- LiteLLM API über HTTPS
- öffentliche Webanwendungen
### Privat
- Proxmox Management
- SSH
- NPM Admin
- Keycloak Admin
- `llama.cpp`
- interne Datenbanken
- interne Serviceports
- Podman-/Container-Management
- sonstige Infrastruktur-Interfaces
---
## 7. Fail2Ban-Rolle
Fail2Ban ist ein ergänzender Schutzmechanismus für die öffentliche NPM-Schicht.
Es soll insbesondere:
- eindeutige Scanner-/Exploit-Muster,
- wiederholte Missbrauchsmuster,
- geeignete Authentifizierungsangriffe
erkennen und dynamisch blockieren.
Nicht vorgesehen ist ein pauschales Blocking aller HTTP-Fehlercodes.
Insbesondere soll ein allgemeiner `404` nicht automatisch als Angriff gewertet werden.
Die finalen Jails werden serviceorientiert entworfen und getrennt validiert.
---
## 8. Weitere Schutzmaßnahmen
Das Zugriffskonzept setzt zusätzlich voraus:
### Perimeter
- keine unnötigen Portweiterleitungen
- IPv4-/IPv6-Exposure gleichwertig prüfen
- keine direkte Veröffentlichung von Managementports
### Identität
- MFA für privilegierte Accounts
- vorzugsweise WebAuthn/FIDO2, wo sinnvoll
- individuelle Accounts statt gemeinsam genutzter Konten
### Systeme
- zeitnahes Patchmanagement
- minimale installierte Dienste
- minimale Container-/LXC-Capabilities
- unprivileged LXCs, wo technisch möglich
### Recovery
- getrennte Backups
- Schutz gegen versehentliches oder böswilliges Löschen
- regelmäßige Restore-Tests
### Monitoring
- Uptime-/Health-Monitoring
- regelmäßige Überprüfung der extern sichtbaren Ports und Dienste
- Überwachung sicherheitsrelevanter Logs
---
## 9. Grundprinzip für zukünftige Services
Neue Services sind nach folgendem Entscheidungsmodell einzuordnen:
### Ist es ein öffentlicher Benutzer-/Anwendungsdienst?
→ HTTPS über NPM
→ OIDC/Keycloak oder anwendungsspezifische Authentifizierung
### Ist es ein privilegierter Managementdienst?
→ nicht öffentlich
→ Zugriff über WireGuard
→ zusätzliche Dienstauthentifizierung
### Ist es ein Backend?
→ keine Internet-Exposure
→ Zugriff ausschließlich von den benötigten internen Komponenten
### Ist es eine Maschinen-API?
→ HTTPS über NPM, wenn extern erforderlich
→ API-Key oder geeignetes OAuth2-/Client-Credentials-Modell
→ Rate Limits / Quotas
---
## 10. Sicherheitsziel
Die Zielarchitektur soll sicherstellen, dass ein kompromittierter Bestandteil möglichst nicht automatisch zu einem vollständigen Infrastrukturzugriff führt.
Beispiele:
```text
Kompromittiertes Webkonto
≠ Proxmox-Zugriff
Gestohlener LLM-API-Key
≠ SSH-Zugriff
Kompromittierter LLM-Container
≠ WireGuard-Admin
LLM-Admin-WireGuard-Peer
≠ Proxmox-Admin
Öffentlicher NPM-Dienst
≠ direkter Zugriff auf interne Backendports
```
Das Sicherheitsmodell basiert damit nicht auf einem einzelnen „Security-Programm“, sondern auf der Kombination mehrerer voneinander unabhängiger Kontrollen.
---
## 11. Offene Implementierungsdetails
Die folgenden Punkte werden erst in den jeweiligen Umsetzungs-SOPs festgelegt:
- WireGuard-VPN-Adressraum
- Peer-IP-Zuweisungen
- Firewall-Regeln für Full Admin / LLM Admin
- konkrete `wg-easy`-Containerkonfiguration
- NPM- und Fail2Ban-Netzwerke
- konkrete Fail2Ban-Filter/Jails
- LiteLLM-Key-/Quota-Modell
- Keycloak-Realm-/Client-/Role-Struktur
- DNS-Namen
- IPv6-Regelsatz
- Logging-/Alerting-Strategie
---
## 12. Änderungsverlauf
| Datum | Version | Geändert von | Beschreibung |
| --- | --- | --- | --- |
| 2026-08-28 | 1.0 | spektr | Erstellung des Sicherheits- und Zugriffskonzepts. |