Vault initial

This commit is contained in:
Hermes (Server)
2026-08-17 10:56:15 +02:00
parent 26cc1e86b0
commit 3274c11938
12 changed files with 625 additions and 192 deletions
@@ -0,0 +1,105 @@
# Audit 14.08.2026 Sicherheit & Code-Review
> Stand: 14.08.2026
> Umfang: Server Aingrad (Sicherheit + Aufräumen) und Melo App (Code-Review)
> Alle Änderungen live verifiziert · Backups: `/home/dustin/backup-audit-2026-08-14/`
---
## ⚠️ Zuerst: Zwei Korrekturen an bestehenden Notizen
**1. Die Neustart-Befehle in [[Server Aingrad - Komplette Übersicht]] sind gefährlich.**
Dort steht noch:
```bash
sudo pkill -f baka_auth.py && python3 /home/dustin/scripts/baka_auth.py 8994 &
```
Die drei Dienste laufen inzwischen als **systemd-Units mit `Restart=always`**. Der Befehl killt den verwalteten Prozess, systemd startet ihn sofort neu und belegt den Port — der manuell gestartete Prozess scheitert dann an `Address already in use`, oder er gewinnt das Rennen und läuft unverwaltet weiter, bis die Shell endet. Richtig ist:
```bash
sudo systemctl restart baka-auth # Port 8994
sudo systemctl restart melo-cloud # Port 8993
sudo systemctl restart yt-proxy # Port 8992
sudo systemctl status baka-auth # Zustand prüfen
```
**2. Die Dienst-Tabelle ist beim Zugriff überholt.** `search.baka-net.de` steht dort als „Offen" — seit heute Basic Auth. Ebenfalls nicht erfasst: `matrix`, `element`, `admin-matrix`, `livekit`, `workspace`, `crash`, `ladder`.
---
## 🔒 Behobene Sicherheitslücken
| Befund | Fix | Verifiziert |
|--------|-----|-------------|
| `/whoami` Auth-Bypass: Basic-Header wurde ohne Passwortprüfung geglaubt → jeder bekam `is_admin: true` | Caddy prüft das Passwort vor dem Proxy | 401 statt 200 |
| `/api/cloud/yt-finder` vor der Auth-Prüfung → jeder Request startet 120-s-Subprozess | Doppelte Route entfernt | 401 sofort |
| `ladder` offener Paywall-Proxy (Abuse auf eigene IP) | Basic Auth | 401 |
| `search` offene SearXNG | Basic Auth | 401 |
| `admin-matrix` Synapse-Panel offen | Basic Auth | 401 |
| Navidrome-Admin-Passwort im Klartext in `baka_auth.py` | → `/etc/baka-auth/navidrome_pw` (640 root:dustin) | Sync getestet |
| `handle_profile` listete bei Fehler alle Benutzernamen | Meldung neutralisiert | — |
| Share-Codes aus `random` (vorhersagbar) | `secrets.choice`, 6 → 8 Zeichen | alte Codes gültig |
| `baka_auth` single-threaded → Logins serialisiert hinter Navidrome-Timeouts | ThreadingWSGIServer + `threading.Lock` fürs Rate-Limit | Login getestet |
Caddy nutzt jetzt ein Snippet `(baka_users)` — Benutzerliste steht **an einer Stelle** statt viermal dupliziert.
---
## 🛑 Wichtigster Fund: Prod-Build von workspace umgeht die Auth
`hermes-workspace` läuft absichtlich mit `pnpm dev`. Der naheliegende „Fix" (Produktions-Build) wurde getestet — **auf separatem Port 3021, ohne den laufenden Dienst anzufassen**:
| Route | Dev (3020) | Prod (3021) |
|-------|-----------|-------------|
| `/api/sessions` | `{"ok":false,"error":"Unauthorized"}` | **200 + echte Chat-Titel, Previews, Token-Zahlen** |
| `/api/files` | 401 | **200** |
Der Produktions-Build setzt die Authentifizierung nicht durch. Eine Umstellung hätte sämtliche Agent-Konversationen öffentlich gemacht. **Nicht auf `node server-entry.js` umstellen, bevor die Auth-Middleware im SSR-Pfad repariert ist.** Prüfkommando danach:
```bash
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:PORT/api/sessions # muss 401 sein
```
Verbleibender Nachteil des Dev-Servers: er liefert serverseitigen Quellcode aus (`/src/server/auth-middleware.ts`, `/vite.config.ts` → 200). **Keine Secrets betroffen**`.env` und `/@fs/`-Zugriffe sind mit Vite 7.3.5 korrekt geblockt (403), im ausgelieferten Code stehen nur Variablennamen.
---
## 🎵 Melo App & Cloud
**Upload-Datenverlust behoben.** `upload()` verknüpfte bei >85 % Titel-Ähnlichkeit auf einen bestehenden Song und **verwarf die hochgeladene Datei** — Live-Versionen und Remixes wurden durch das Studio-Original ersetzt. Entfernt. Begründung durch Messung: 323 von 325 Songs haben einen gültigen Fingerprint (99,4 %), `fpcalc` läuft. Greift der Fingerprint nicht, ist das Audio nachweislich anders; ein Dateiname darf das nicht überstimmen.
End-to-End getestet (zwei verschiedene Audios, 94 % ähnliche Namen): neu → `new`, identisch → `linked` (SHA256-Dedup intakt), anderes Audio → `new` mit eigener ID. Gespeicherte Dateien byte-identisch mit den Originalen. Testdaten restlos entfernt (wieder 325 Songs, 0 verwaiste Einträge).
**`cgi`-Modul ersetzt.** Multipart-Parsing läuft jetzt über die stdlib (`email`); `cgi` ist seit Python 3.13 entfernt (PEP 594) — der Upload wäre beim Distro-Upgrade wortlos ausgefallen. Gegen `cgi.FieldStorage` byte-identisch getestet (Nullbytes, CRLF, Boundary-Sequenzen, Umlaute).
**`deletePlaylist` repariert.** Schickte POST auf `/api/v1/cloud/playlists`; der Server unterscheidet dort nach Methode (POST = anlegen, DELETE = löschen). Das Löschen landete im Anlegen-Handler, scheiterte an der Namensprüfung und lieferte HTTP 200 mit `status: error` — die UI meldete trotzdem Erfolg, die Playlist blieb. Jetzt DELETE, Rückgabewert wird ausgewertet, 3 Regressionstests.
- **202 Tests grün** (vorher 199), `flutter analyze` ohne Befund
- Commit `2223813` auf Branch `fix/cloud-playlist-delete`, noch nicht auf `main`
- `main` hat zusätzlich `v2.56.2` ungepusht
---
## 🧹 Aufgeräumt (~5 GB, 179 G → 184 G frei)
APT-Cache (1,1 G) · Build-Output des veralteten Duplikats `git/melo_app` (3,0 G) · npm-Cache · `gateway-restart.log` (29 M → 428 K) · drei leere Alt-Datenbanken in `/var/lib/melo-cloud/`.
**Nicht angefasst:** `.gradle/caches` (5,2 G) und `.hermes/profiles/server-security/home` (9,3 G — zweites Home mit eigenem Flutter, Chrome, Claude-Versionen). Beides regenerierbar, aber teuer bzw. potenziell in Benutzung.
---
## 📌 Offene Themen
- **`/home/dustin/scripts` ist kein Git-Repo.** ~3400 Zeilen Python tragen Auth und Musik-Cloud, völlig unversioniert. Einziger Schutz sind die Backups von heute. Eigenes Repo dringend empfohlen (`.gitignore` für `__pycache__` und Secrets).
- **Auth-Middleware im SSR-Pfad von workspace** — Blocker für jeden Prod-Build.
- **Versionsstrings der App widersprechen sich:** `main.dart:32` → 2.56.1, `settings_screen.dart:364` → 2.56.1, `settings_screen.dart:500` → 2.56.0, `home_screen.dart:1236` → 2.56.0. Nirgends 2.56.2. Besser eine Konstante, auf die alle vier zeigen.
- **Passwortloses sudo bleibt bewusst.** `backup_and_cleanup.sh` läuft per Cron täglich 04:00 und braucht es — global entfernen bricht das Backup still. Falls Härtung: NOPASSWD auf die konkret nötigen Befehle einschränken und den Cron-Lauf testen.
- **`_download`/`_stream` in `melo_cloud.py`** lesen ganze Dateien in den RAM (`fh.read()`), ebenso `download()` in der App (`r.bodyBytes`). Bei 50-MB-Songs und 7,7 GB RAM perspektivisch ein Thema.
- Basic-Auth-Passwörter (`baka`, `dustin`, `tinker`) schützen jetzt deutlich mehr als vorher — falls eins schwach ist, wäre das der nächste Schritt.
---
## Verwandte Notizen
- [[Server Aingrad - Komplette Übersicht]] — Dienst-Tabelle und Neustart-Befehle oben korrigieren
- [[Melo App - Status]] — Stand dort ist v2.53.1, aktuell ist v2.56.2 + Fix-Branch
+43
View File
@@ -0,0 +1,43 @@
# Melo App - Status
> Stand: 05.08.2026 · v2.53.1 · arm64 · 21,0 MB
## Aktuelle Version
- **v2.53.1** — Sprint D+E abgeschlossen, Review-FREIGABE
- 143/143 Tests, 0 Lint-Issues
- Push: `file:///home/dustin/gitea/data/git/repositories/baka/melo-app.git`
## Sync-System (v2.52-53)
- Favoriten bidirektional (lokal Server, sofort-Push)
- YT-Links nur Server-Fallback (kein Re-Download)
- Tombstones mit Server-Zeitstempel
- Auto-Sync Aus/1h/3h/6h/12h + Notification
- Konflikt-Report bei >24h Offline
## Navigation (5 Tabs, Rechtshänder)
```
🏠 Start — Weiterhören, Recap (7T/Monat/Jahr)
📚 Bibliothek — Songs, Alben, Künstler, Tags, Playlists, Downloads
▶️ Jetzt läuft — Now-Playing-Fullscreen
☁️ Cloud — Dashboard, Sync, Konflikt-Report
⚙️ Mehr — Einstellungen, Erweitert
```
## Versions-Historie
| Version | Inhalt |
|---------|--------|
| v2.48 | Sprint A: Shuffle, Repeat, Queue, Sleep-Timer |
| v2.49 | Sprint B: Now-Playing, Lyrics |
| v2.50 | Glow-Pulsation, Crossfade, 98 Tests |
| v2.51 | Sprint C: 5-Tabs, Cloud-Dashboard |
| v2.52 | Sprint D: Favoriten-Sync, YT-Fallback, Einstellungen |
| v2.53 | Sprint E: Recaps, Tombstones, Konflikt-Report |
## Offene Themen
- Sprint F: Android Auto, Home-Widget, Equalizer
- melo_cloud.py nicht versioniert (eigenes Repo empfohlen)
- Tinker-Easter-Egg: "Illuminati Song"
## Verwandte Notizen
- [[Server Aingrad - Komplette Übersicht]]
- Merge-Dateien für Claude: lokal `~/notizen/melo-claude-briefing.md` + `melo-app-code.md`
+37 -178
View File
@@ -1,9 +1,8 @@
# Server Aingrad Komplette Übersicht
> Stand: 24.07.2026
> IP: 159.195.51.99
> ZeroTier: 10.19.81.21
> System: Ubuntu 24.04 LTS, 4 Kerne, 8 GB RAM, 251 GB SSD
> Stand: 05.08.2026
> IP: 159.195.51.99
> System: Ubuntu 24.04 LTS, 8 Kerne, 7.7 GB RAM, 2 GB Swap
> Domain: baka-net.de
---
@@ -15,13 +14,18 @@
ssh dustin@159.195.51.99
# Docker-Container anzeigen
docker ps
sudo docker ps
# Logs eines Containers
docker logs <container>
sudo docker logs <container>
# Server neustarten
sudo reboot
# Caddy neu laden
sudo systemctl reload caddy
# Auth/Cloud/YT-Prozesse neu starten
sudo pkill -f baka_auth.py && python3 /home/dustin/scripts/baka_auth.py 8994 &
sudo pkill -f melo_cloud.py && python3 /home/dustin/scripts/melo_cloud.py 8993 &
sudo pkill -f yt_proxy.py && python3 /home/dustin/scripts/yt_proxy.py 8992 &
# Festplattenplatz prüfen
df -h
@@ -29,182 +33,37 @@ df -h
# RAM/Nutzung prüfen
free -m
# Hermes Gateway neustarten
systemctl --user restart hermes-gateway
# YT-Finder manuell
python3 /home/dustin/scripts/yt_link_finder.py
```
---
## 🔒 1. Firewall (UFW) Port-Freigaben
## 🌍 Domains & Dienste
**Status:** `sudo ufw status`
| URL | Dienst | Port | Zugriff |
|-----|--------|------|---------|
| https://baka-net.de | Dashboard (SPA) | 443 | Basic Auth |
| https://baka-net.de/melo/ | Melo Downloads | 443 | Öffentlich |
| https://cloud.baka-net.de | Melo Cloud API (v1) | 8993 | JWT |
| https://musik.baka-net.de | Navidrome | 4533 | Proxy-Auth |
| https://git.baka-net.de | Gitea | 3000 | Login |
| https://yt.baka-net.de | YT-Proxy | 8992 | Bearer-JWT |
| https://search.baka-net.de | SearXNG Meta-Suche | 8888 | Offen |
| https://mc.baka-net.de | MC-Infoseite | — | Öffentlich |
| Minecraft | Bedrock 1.26.36.1 | 19132/UDP | Offen, offline-mode |
| Erlaubt für | Port | Erklärung |
|-------------|------|-----------|
| SSH | 22/tcp | Server-Zugriff |
| Web (Caddy) | 80, 443/tcp | Websites + SSL |
| Syncthing | 22000/tcp+udp | Datei-Sync |
| ZeroTier | 9993/udp | VPN-Netzwerk |
| ZeroTier-Intern | Alle Ports auf `zt+` | Zugriff über sicheres VPN |
## Docker-Container
`anisette` · `synapse` · `navidrome` · `ladder` · `gitea` · `searxng`
---
## Wichtigste Datenbanken
- Baka-Auth: `/var/lib/melo-cloud/baka_auth.db`
- Registry (325 Songs): `/var/lib/melo-cloud/registry.db`
- Navidrome: 323 Songs, MusicFolder `/var/lib/melo-cloud/registry`
## 📦 2. Docker-Container
## ⚠️ Legacy
- API-Key `melo-cloud-2026-*` entfernt (v2.45, JWT ersetzt) — Build OHNE --dart-define
```bash
docker ps # Laufende Container anzeigen
docker ps -a # Alle Container (auch gestoppte)
docker logs -f <name> # Live-Logs anzeigen
docker restart <name> # Container neustarten
docker stop <name> # Container stoppen
docker system prune -af # Ungenutzte Docker-Daten löschen
```
### Aktive Container
| Container | Port | Zweck |
|-----------|------|-------|
| **gitea** | `127.0.0.1:3000` | Eigenes Git-System (git.baka-net.de) |
| **synapse** | `127.0.0.1:8008` | Matrix-Chat-Server (matrix.baka-net.de) |
| **anisette** | `127.0.0.1:6969` | Anisette-V3 für iOS-Sideloading (anisette.baka-net.de) |
---
## 🌐 3. Caddy-Webserver (Domain-Routing)
**Konfiguration:** `/etc/caddy/Caddyfile`
```bash
caddy reload # Konfiguration neu laden
systemctl restart caddy # Caddy neustarten
journalctl -u caddy -n 50 # Letzte 50 Log-Einträge
```
| Domain | Weiterleitung auf |
|--------|-------------------|
| baka-net.de | Statische Webseite |
| matrix.baka-net.de | localhost:8008 (Synapse) |
| git.baka-net.de | localhost:3000 (Gitea) |
| anisette.baka-net.de | localhost:6969 (Anisette-V3) |
---
## 🧰 4. Installierte Entwickler-Tools
```bash
# Flutter & Dart (Android/iOS App-Entwicklung)
export PATH="$HOME/development/flutter/bin:$PATH"
flutter doctor # Status prüfen
flutter build apk --release --split-per-abi # APK bauen
# Android SDK
export ANDROID_HOME="$HOME/development/android-sdk"
sdkmanager --list_installed # Installierte SDK-Versionen
# Java
java -version # OpenJDK 17
```
---
## 🛡️ 5. Security-Tools
### Gitleaks Findet Secrets in Git-Repos
```bash
# Aktuelles Repo scannen
gitleaks detect --source /pfad/zum/repo --verbose
# Nur geänderte Dateien vor Commit prüfen
gitleaks detect --source . --log-level debug
# Komplette Git-Historie durchsuchen
gitleaks detect --source /pfad/zum/repo --no-git
```
### Trivy Schwachstellen-Scanner
```bash
# Repository scannen
trivy repo https://github.com/user/repo
# Dateisystem scannen
trivy fs /pfad/zum/repo
# Docker-Image scannen
trivy image alpine:latest
```
### Semgrep Statische Code-Analyse (SAST)
```bash
# Projekt analysieren
semgrep --config=auto /pfad/zum/projekt
# Nach Sicherheitslücken suchen
semgrep --config=p/default /pfad/zum/projekt
# Nur bestimmte Regeln
semgrep --config=p/docker-security /pfad
```
---
## 🌐 6. Website-Klon-Tools
### HTTrack Komplette Webseiten kopieren
```bash
# Komplette Seite runterladen
httrack "https://example.com" -O /home/dustin/archiv/seite --depth=3
# Nur eine Seite + Ressourcen
httrack "https://example.com/seite.html" -O /home/dustin/archiv/seite --depth=1
# Mit Benutzername/Passwort
httrack "https://user:pass@example.com" -O /home/dustin/archiv/seite
```
---
## 🔄 7. Automatische Backups (Cron - 04:00 Uhr)
```bash
# Backup-Skript manuell ausführen
sudo /home/dustin/scripts/backup_and_cleanup.sh
# Backup-Ordner prüfen
ls -lh /home/dustin/Sync/backups/
# Crontab anzeigen
sudo crontab -l
```
**Sichert automatisch:** Gitea-Daten + Synapse-Datenbank
**Bereinigt:** Docker-Müll (`system prune`)
**Backup-Ziel:** `/home/dustin/Sync/backups/` (7 Tage Aufbewahrung)
---
## 🧪 8. Weitere Tools
| Tool | Befehl | Zweck |
|------|--------|-------|
| ZeroTier | `zerotier-cli listnetworks` | VPN-Status prüfen |
| Syncthing | `systemctl status syncthing@dustin` | Sync-Dienst prüfen |
| ADB | `adb devices` | Android-Geräte-Liste |
| Flutter | `flutter build apk --release --split-per-abi` | APK bauen |
---
## 📁 Wichtige Pfade
| Pfad | Inhalt |
|------|--------|
| `/home/dustin/` | Benutzer-Home |
| `/home/dustin/git/` | Git-Repos |
| `/home/dustin/git/melo_app/` | Melo App Quellcode |
| `/home/dustin/development/` | Flutter + Android SDK |
| `/home/dustin/hermes-vault/` | Notizen (Obsidian) |
| `/home/dustin/.hermes/` | Hermes-Konfiguration |
| `/home/dustin/scripts/` | Eigene Skripte |
| `/home/dustin/Sync/` | Syncthing-Synchronisation |
| `/home/dustin/Sync/backups/` | Backup-Archive |
| `/home/dustin/musik/` | Musik-Ordner |
| `/etc/caddy/Caddyfile` | Caddy-Konfiguration |
## Verwandte Notizen
- [[Melo App - Status]]
- Detaillierte Zugangsdaten: lokal `~/notizen/baka-net-gesamt.md`