[Security/High] Zugangsdaten und JWT-Secret liegen im Klartext in appsettings*.json #35

Open
opened 2026-09-09 20:16:56 +00:00 by Aceless · 1 comment
Owner

Problem

appsettings.json, appsettings.Development.json und appsettings.Production.json sind eingecheckt und enthalten je Datenbank-Passwort und JWT-Secret.

Zusaetzlich ist in allen drei Umgebungen dasselbe Secret hinterlegt. Ein Token aus Development ist damit auch in Produktion gueltig.

Fix

  • Secrets aus den eingecheckten Dateien entfernen, nur Struktur mit leeren Werten belassen.
  • Lokal dotnet user-secrets, im Container Umgebungsvariablen (ConnectionStrings__DefaultConnection, JwtSettings__Secret).
  • Je Umgebung ein eigenes, zufaellig erzeugtes Secret mit mindestens 32 Byte.
  • Bestehendes Secret als kompromittiert betrachten und rotieren.
  • Beim Start pruefen, ob das Secret gesetzt und lang genug ist, sonst Startabbruch. Aktuell wuerde jwt!.Issuer bei fehlender Konfiguration nur eine NullReferenceException werfen.
## Problem `appsettings.json`, `appsettings.Development.json` und `appsettings.Production.json` sind eingecheckt und enthalten je Datenbank-Passwort und JWT-Secret. Zusaetzlich ist in allen drei Umgebungen dasselbe Secret hinterlegt. Ein Token aus Development ist damit auch in Produktion gueltig. ## Fix - Secrets aus den eingecheckten Dateien entfernen, nur Struktur mit leeren Werten belassen. - Lokal `dotnet user-secrets`, im Container Umgebungsvariablen (`ConnectionStrings__DefaultConnection`, `JwtSettings__Secret`). - Je Umgebung ein eigenes, zufaellig erzeugtes Secret mit mindestens 32 Byte. - Bestehendes Secret als kompromittiert betrachten und rotieren. - Beim Start pruefen, ob das Secret gesetzt und lang genug ist, sonst Startabbruch. Aktuell wuerde `jwt!.Issuer` bei fehlender Konfiguration nur eine NullReferenceException werfen.
Author
Owner

Code-Seite erledigt, Rotation offen.

Geändert

  • appsettings.Development.json und appsettings.Production.json sind nicht mehr getrackt und stehen in .gitignore sowie in .dockerignore. Damit landen sie auch nicht mehr im Image.
  • appsettings.json enthält nur noch die Struktur mit leeren Werten.
  • Neu: appsettings.Development.json.example als Vorlage.
  • Program.cs prüft beim Start Connection String, Secret (mindestens 32 Byte), Issuer, Audience und Ablaufzeit und bricht mit einer verständlichen Meldung ab, statt später eine NullReferenceException zu werfen.
  • backend/README.md beschreibt die nötigen Umgebungsvariablen und enthält ein Compose-Beispiel.

Wichtig für das nächste Deployment: Der Container braucht jetzt ConnectionStrings__DefaultConnection und JwtSettings__Secret aus der Umgebung.

Offen

  • Datenbankpasswort und JWT-Secret rotieren, beides steht weiterhin in der Git-History.
  • Je Umgebung ein eigenes Secret, bisher war es in Development und Production identisch.

Branch backend/issue-fixes, Commits 2a1cc95.

Code-Seite erledigt, Rotation offen. **Geändert** - `appsettings.Development.json` und `appsettings.Production.json` sind nicht mehr getrackt und stehen in `.gitignore` sowie in `.dockerignore`. Damit landen sie auch nicht mehr im Image. - `appsettings.json` enthält nur noch die Struktur mit leeren Werten. - Neu: `appsettings.Development.json.example` als Vorlage. - `Program.cs` prüft beim Start Connection String, Secret (mindestens 32 Byte), Issuer, Audience und Ablaufzeit und bricht mit einer verständlichen Meldung ab, statt später eine NullReferenceException zu werfen. - `backend/README.md` beschreibt die nötigen Umgebungsvariablen und enthält ein Compose-Beispiel. **Wichtig für das nächste Deployment:** Der Container braucht jetzt `ConnectionStrings__DefaultConnection` und `JwtSettings__Secret` aus der Umgebung. **Offen** - Datenbankpasswort und JWT-Secret rotieren, beides steht weiterhin in der Git-History. - Je Umgebung ein eigenes Secret, bisher war es in Development und Production identisch. --- Branch `backend/issue-fixes`, Commits 2a1cc95.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Aceless/RecipePlanner#35
No description provided.