Security F5/F6 + Konzept-Status: DB-TLS-Startwarnung, Log-Redaction geprueft

- F5: Startwarnung, wenn der DB-Connection-String kein SslMode erzwingt (String selbst wird
  nie geloggt). Eure Connection enthaelt bereits SslMode -> Warnung bleibt aus.
- F6: geprueft - keine Secret-Werte in Logs (nur Vorhandensein-Flags/Fehlermeldungen).
- Sicherheitskonzept: Status F1-F7 dokumentiert.

Build 0 Fehler, --smoke-ui ok.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-07-15 08:54:50 +02:00
co-authored by Claude Opus 4.8
parent f3ed63cf9d
commit 36c89a6acf
2 changed files with 37 additions and 0 deletions
+24
View File
@@ -138,6 +138,9 @@ internal static class Program
// Quelle: Umgebungsvariable POLYTRADER_MASTER_KEY, sonst gitignorierte master.key im App-Ordner.
ConfigureSecretProtection(AppHost.Services.GetRequiredService<TerminalLogger>());
// 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.");
}
/// <summary>
/// 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.
/// </summary>
private static void WarnIfDbTlsNotEnforced(IServiceProvider services)
{
try
{
var config = services.GetService<Microsoft.Extensions.Configuration.IConfiguration>();
string conn = config?["Database:MySqlConnectionString"] ?? string.Empty;
if (string.IsNullOrEmpty(conn)) return;
if (conn.IndexOf("sslmode", StringComparison.OrdinalIgnoreCase) < 0)
{
services.GetRequiredService<TerminalLogger>().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 */ }
}
/// <summary>
/// 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.
+13
View File
@@ -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)