Add steam headless apps with security docs and verification guide

This commit is contained in:
Joachim Friberg
2026-03-18 21:52:15 +01:00
parent 69011271fc
commit c1e347e5e0
8 changed files with 670 additions and 0 deletions
+70
View File
@@ -0,0 +1,70 @@
# Security Model
Detta dokument beskriver säkerhetsmodellen för `steam-moonlight` och hur risker begränsas mellan default- och Moonlight-profil.
## Mål
- Hålla default-profilen (`steam`) så nära least-privilege som möjligt.
- Göra Moonlight-profil (`steam-moonlight`) explicit opt-in med tydlig riskaccept.
- Hålla state/data begränsad till `/DATA/AppData/$AppID/...`.
## Tillitsgränser
- Host OS och Docker daemon är högsta trust-zon.
- Containern är lägre trust-zon.
- Moonlight-klienter och LAN-trafik är extern yta.
## Threat Model
Primära hot:
- Kontoövertagande via svagt `SUNSHINE_PASS`.
- Lateral movement via `network_mode: host` (Moonlight-profil).
- Ökad impact vid containerkompromiss p.g.a. extra capabilities och device passthrough.
- Dataförlust vid felaktig mount-path.
## Säkerhetskontroller
Gemensamt:
- Immutable image pin (`tag + digest`).
- Ingen docker socket mount.
- Ingen `privileged: true`.
- Data paths begränsade till `/DATA/AppData/$AppID/...`.
Defaultprofil (`steam`):
- `cap_drop: ["ALL"]`
- `no-new-privileges:true`
- Ingen `host` network
- Inga device mounts
- Sunshine avstängd som default (`ENABLE_SUNSHINE=false`)
Moonlightprofil (`steam-moonlight`):
- Högriskkontroller isolerade till `profiles: ["moonlight"]`
- `cap_drop: ["ALL"]` + minsta kända `cap_add`
- Explicit device lista (`/dev/fuse`, `/dev/uinput`, `/dev/dri/*`)
- `seccomp:unconfined` och `apparmor:unconfined` endast i Moonlight-profilen
## Fail-Closed Regler
- Moonlight ska inte startas om `SUNSHINE_PASS` är default eller tomt.
- Moonlight ska inte startas om GPU-device mapping saknas eller är fel.
- Vid osäkerhet, kör endast defaultprofilen (`steam`).
## Operativa krav
- Exponera inte Sunshine admin/UI mot internet.
- Begränsa åtkomst till LAN/VPN och pålitliga klienter.
- Rota image-pins kontrollerat och verifiera digest före uppdatering.
- Följ checklistan i `MOONLIGHT-RUNTIME-CHECKLIST.md` före varje aktivering.
## Incidentrespons (minimum)
Vid misstänkt kompromiss:
1. Stoppa Moonlight-profilen direkt.
2. Roterar `SUNSHINE_PASS` och övriga credentials.
3. Granska hostens nätverksexponering och Docker logs.
4. Byt image till känd god pin och starta om endast defaultprofil.