diff --git a/Program.cs b/Program.cs index 86115bf..3c362b3 100644 --- a/Program.cs +++ b/Program.cs @@ -138,6 +138,9 @@ internal static class Program // Quelle: Umgebungsvariable POLYTRADER_MASTER_KEY, sonst gitignorierte master.key im App-Ordner. ConfigureSecretProtection(AppHost.Services.GetRequiredService()); + // F5 (Sicherheit): warnen, wenn die (remote) DB-Verbindung keine TLS-Erzwingung hat. + WarnIfDbTlsNotEnforced(AppHost.Services); + try { // Trade-Nummerierung fortsetzen: höchste bestehende TradeId serverseitig lesen @@ -324,6 +327,27 @@ internal static class Program "Master-Key setzen (env POLYTRADER_MASTER_KEY oder master.key), siehe docs/sicherheit."); } + /// + /// F5: Warnt, wenn der DB-Connection-String keine TLS-Erzwingung (SslMode) enthält. Der String + /// selbst wird NICHT geloggt (enthält das Passwort) – nur das Fehlen der TLS-Option. + /// + private static void WarnIfDbTlsNotEnforced(IServiceProvider services) + { + try + { + var config = services.GetService(); + string conn = config?["Database:MySqlConnectionString"] ?? string.Empty; + if (string.IsNullOrEmpty(conn)) return; + if (conn.IndexOf("sslmode", StringComparison.OrdinalIgnoreCase) < 0) + { + services.GetRequiredService().Warning( + "⚠️ SICHERHEIT: DB-Verbindung ohne SslMode – Transportverschlüsselung zur (remote) MySQL nicht erzwungen. " + + "Im Connection-String 'SslMode=Required' (oder VerifyFull) setzen, siehe docs/sicherheit."); + } + } + catch { /* Warnung ist best-effort; darf den Start nie stören */ } + } + /// /// F1: Verschlüsselt einmalig/idempotent evtl. vorhandene Klartext-Credentials in der DB (Alt-Bestand /// wird beim Re-Save durch den EF-Converter verschlüsselt). Nur wenn ein Master-Key gesetzt ist. diff --git a/docs/sicherheit/SICHERHEITSKONZEPT.md b/docs/sicherheit/SICHERHEITSKONZEPT.md index b293216..4329f33 100644 --- a/docs/sicherheit/SICHERHEITSKONZEPT.md +++ b/docs/sicherheit/SICHERHEITSKONZEPT.md @@ -67,6 +67,19 @@ Predictalytics-Projekt, **nicht** in PolyTrader. > Die 🔴-Befunde (F1, F2) betreffen direkt die Kontrolle über die Gelder und sollten **vor** dem > Live-Betrieb mit nennenswerten Beträgen behoben werden. +### Status (2026-07-14) +- ✅ **F1 behoben** – AES-256-GCM at-rest (`SecretProtection` + EF-Converter), portabler Master-Key + außerhalb der DB, selbstheilende Migration. **Aktivierung im Zielland:** `POLYTRADER_MASTER_KEY` + setzen (zufälliger 32-Byte-Base64-Key, **separat sichern** – Verlust = kein Key-Zugriff mehr) + + Migration `EncryptAccountSecretsWidenColumns` anwenden. +- ✅ **F2 behoben** – toter Private-Key-als-argv-Code entfernt; Sicherheitshinweis fürs künftige Auto-Redeem. +- ✅ **F3 behoben (Code)** – Secrets aus dem Quellcode. **Offen (deinerseits): Alchemy-Key + Mullvad-Account + ROTIEREN** (lagen in der Git-History). +- ✅ **F4 behoben** – Newtonsoft.Json 11.0.2 → 13.0.4 (Vuln weg). Follow-up: übriger Threema-Lib-Stack (Sodium/EF-Sqlite) modernisieren. +- 🟡 **F5** – TLS-Startwarnung ergänzt; eure Connection enthält bereits `SslMode` (Warnung blieb aus) → ok. +- 🟢 **F6 geprüft – sauber**: keine Secret-Werte in Logs (nur Vorhandensein-Flags/Fehlermeldungen). Beibehalten. +- 🟡 **F7** – öffentliche RPC-Fallbacks: bewusst akzeptiert oder später auf authentifizierte RPCs beschränken. + --- ## 5. Kontrollen & Richtlinien (Soll-Zustand)