rebreak-monorepo/ops/mdm/SECURITY.md
chahinebrini 5d6c322129 wip: KeyboardAwareSheet migrations + Snake/Tetris UI + iron.png + useMe live-update
Sheets via neuer KeyboardAwareSheet-Composable (in Modal pattern, auto-grow
mit Tastatur, paddingBottom-Lift): EditMail, AddDomain, CreateRoom, ConnectMail.
GameOverScreen behält Spring-Slide-In, nutzt RN Keyboard.addListener für Lift.

- KeyboardAwareSheet.tsx — universal modal with sheet-grow + keyboard-padding
- react-native-keyboard-controller installiert + KeyboardProvider in Root
- Snake: time + ScoreProgressBar + useSnakeSounds (haptic, audio TODO)
- Tetris: title weg, Buttons zentriert, kein Pressable mit style-fn
- DPad-Buttons 60→48, more bg, no scale
- useMe: pub-sub listener pattern für app-weite avatar/nickname-Updates
- dm.tsx: resolveAvatar wrap (iron.png-Warning)
- Mail-error-humanizer + locales

Recovery-Doc-Update in docs/internal/RECOVERY_LOG_2026-05-10.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 23:59:25 +02:00

68 lines
3.2 KiB
Markdown

# MDM Server — Security
## Was muss geheim bleiben
| Secret | Wo es liegt | Permissions | Wer hat Zugriff |
|-------------------------------------|--------------------------------------|-------------|---------------------|
| PostgreSQL-Passwort | `/root/.nanomdm_db_pass` | 600 (root) | Chahine, Olfa |
| MDM CA Private Key | `/opt/nanomdm/certs/ca.key` | 600 (root) | Chahine, Olfa |
| Apple Push Private Key | `/opt/nanomdm/certs/push.key` | 600 (root) | Chahine, Olfa |
| nanomdm .env (enthält DB-Pass) | `/opt/nanomdm/.env` | 600 (root) | Chahine, Olfa |
| MDM-Admin-API-Key (nach Phase E) | Wird nach Phase E generiert | - | Chahine, Olfa, Ina* |
| Ina-Notfall-Credentials | Per Email (Phase E) + evt. Kopie | - | Ina |
(*) Ina bekommt nur den API-Key, keinen SSH-Zugriff.
## Was NICHT geheim sein muss
- `push.csr` — CSR ist öffentlich (geht ans Apple-Portal)
- `ca.crt` — CA-Zertifikat ist öffentlich (wird ans Gerät übertragen)
- nginx-Config, docker-compose.yml (ohne Passwörter)
## Threat-Modelle
### Server-Kompromittierung
Was der Angreifer bekommt:
- DB-Pass → Zugriff auf nanomdm-DB (Device-Liste, Enrollment-Daten)
- push.key → Kann eigene MDM-Befehle an Geräte senden (mit Apple-Cert)
- ca.key → Kann eigene Device-Identity-Certs ausstellen
Was zu tun ist:
1. Apple Push Cert sofort auf identity.apple.com revoken
2. Neuen VPS aufsetzen (Phase A-D wiederholen)
3. Geräte re-enrollen mit neuem Push-Cert + neuem CA-Cert
4. Neues DB-Passwort aus `/root/.nanomdm_db_pass` (von Chahine neu generiert)
### Device-Verlust (gestohlen)
- MDM-Remote-Wipe triggern: löscht alle Daten auf Gerät
- Apple-ID-basiertes "Find My" als zusätzliche Schicht (unabhängig vom MDM)
- MDM-Profil ist nach Factory-Reset weg → Gerät ist dann nicht mehr enrollt
### Angreifer hat Zugriff auf Ina's Email-Account
Ina's Notfall-Credentials (Phase E) geben nur Zugriff auf nanomdm-API um das Profil zu entfernen, keinen Server-SSH-Zugriff. Worst-case: Angreifer entfernt MDM-Profil vom Gerät. Das MDM kann dann re-enrollen wenn Chahine zustimmt.
### Abgelaufenes Apple Push Cert
Wenn push.pem abläuft (nach 1 Jahr): nanomdm kann keine Befehle mehr ans Gerät schicken. Gerät ist aber noch enrollt (Profil ist drauf). Nach Cert-Renewal (gleicher push.key) funktioniert Kommunikation wieder.
## Geheimhaltungs-Regeln
1. `push.key`, `ca.key`, DB-Passwort werden NIEMALS in Git committed
2. `/opt/nanomdm/.env` hat chmod 600 — Änderung würde nanomdm-Container-Restart erfordern
3. Keine Passwörter in Docker-Logs (env-vars sind als values gesetzt, nicht als --env in command-line args)
4. SSH-Zugriff nur via Key-Auth (kein Password-SSH auf dem Server)
## Audit-Trail
Relevante Events zum Dokumentieren in `/opt/nanomdm/SETUP-LOG.md` auf dem Server:
- Wann wurde welcher Container deployed
- Wann wurde Apple Push Cert erneuert (Datum + Apple-ID die es ausgestellt hat)
- Wann wurde Enrollment durchgeführt (Gerät, Datum)
- Wann wurde Profil entfernt (wer hat entfernt, warum)
Format: `[DATUM] [WER] [WAS]` — plain text, kein JSON.