Files
aza/AzA march 2026 - Kopie (3)/security/handovers/STEP_4_4_CREDENTIALS.md

167 lines
4.8 KiB
Markdown
Raw Normal View History

2026-03-25 13:42:48 +01:00
# STEP 4.4 KLARTEXT-CREDENTIALS ENTFERNT (LÜCKE #28)
# Status: ABGESCHLOSSEN
---
## Fundstellen
| Datei | Problem |
|-------|---------|
| `aza_email_config.json` | Klartext-Passwort im `password`-Feld: `"password": "Asdfasdf22@@As96k324"` |
Keine weiteren Klartext-Credentials in JSON/YAML/INI-Dateien gefunden.
**Hinweis:** Das hier entfernte Passwort war ein echtes Produktivpasswort.
Es sollte umgehend beim Mail-Provider geändert werden.
---
## Neue ENV-Variablen
| Variable | Beschreibung |
|----------|-------------|
| `AZA_EMAIL_PASSWORD_0` | Passwort für das erste E-Mail-Konto |
| `AZA_EMAIL_PASSWORD_1` | Passwort für das zweite E-Mail-Konto (falls vorhanden) |
| `AZA_EMAIL_PASSWORD_N` | Passwort für das N-te Konto (0-basiert) |
### Setzen unter Windows:
```cmd
set AZA_EMAIL_PASSWORD_0=MeinSicheresPasswort
```
### Setzen unter Linux/Mac:
```bash
export AZA_EMAIL_PASSWORD_0="MeinSicheresPasswort"
```
### Dauerhaft (Windows PowerShell):
```powershell
[Environment]::SetEnvironmentVariable("AZA_EMAIL_PASSWORD_0", "MeinPasswort", "User")
```
---
## Geänderte Dateien
| Datei | Änderung |
|-------|----------|
| `aza_email.py` | Neue Funktionen: `_get_account_password()`, `_strip_passwords()`, `_check_plaintext_migration()` |
| `aza_email.py` | `load_email_config()`: Lädt Passwörter aus ENV, ignoriert Klartext in JSON, gibt Warnung |
| `aza_email.py` | `save_email_config()`: Strippt `password` und `_password` vor dem Schreiben |
| `aza_email.py` | Alle IMAP/SMTP-Stellen: `acc.get("password")``acc.get("_password")` |
| `aza_email.py` | Account-Dialog: Passwort wird als `_password` (RAM-only) gespeichert |
| `aza_email_config.json` | Klartext-Passwort entfernt |
---
## Architektur
### Passwort-Fluss (NEU):
```
ENV (AZA_EMAIL_PASSWORD_0)
load_email_config() ──► acc["_password"] (nur RAM)
IMAP/SMTP Login ──► acc.get("_password", "")
save_email_config() ──► _strip_passwords() ──► JSON OHNE Passwort
```
### Passwort-Fluss (GUI-Eingabe):
```
Account-Dialog (Passwort-Feld)
save_account() ──► acc["_password"] = pw_input (nur RAM)
_save_config() ──► save_email_config() ──► _strip_passwords() ──► JSON OHNE Passwort
```
Das `_password`-Feld existiert NUR im RAM. Es wird NIE in JSON geschrieben.
Das `password`-Feld wird beim Laden aus JSON ignoriert und beim Speichern entfernt.
---
## Migrationsverhalten
Wenn `aza_email_config.json` noch ein `password`-Feld enthält:
1. **Warnung auf stderr:**
```
SICHERHEITSWARNUNG: Klartext-Passwoerter in aza_email_config.json gefunden!
Betroffene Konten: andre.surovy@haut-winterthur.ch
Bitte entfernen und stattdessen ENV-Variablen setzen:
AZA_EMAIL_PASSWORD_0
Die Passwoerter in der Datei werden IGNORIERT.
```
2. **Klartext-Passwort wird NICHT übernommen** (kein Auto-Migrate)
3. **Benutzer muss ENV-Variable setzen**, damit E-Mail funktioniert
4. **Beim nächsten Speichern** wird das `password`-Feld automatisch entfernt
---
## Fail-Start Verhalten
| Szenario | Ergebnis |
|----------|----------|
| `AZA_EMAIL_PASSWORD_0` gesetzt | E-Mail funktioniert |
| `AZA_EMAIL_PASSWORD_0` nicht gesetzt | E-Mail-Abruf zeigt: "Konto-Daten unvollständig" |
| Klartext-PW in JSON | Warnung + wird ignoriert |
| GUI-Passworteingabe | Funktioniert für Sitzung (nicht persistent) |
---
## Testergebnis
```
12/12 PASS, 0/12 FAIL
GESAMTBEWERTUNG: PASS
```
| Test | Ergebnis |
|------|----------|
| Kein Passwort in JSON | PASS |
| Warnung auf stderr bei Klartext | PASS |
| Passwort NICHT in geladenen Daten | PASS |
| ENV-PW in _password Feld | PASS |
| Kein password Feld nach Laden | PASS |
| Kein password in gespeicherter Datei | PASS |
| Kein _password in gespeicherter Datei | PASS |
| password entfernt (Konto 1) | PASS |
| password entfernt (Konto 2) | PASS |
| _password entfernt (nie auf Disk) | PASS |
| Andere Felder erhalten | PASS |
| Kein print mit password-Wert | PASS |
---
## Rest-Risiken
1. **Passwort im RAM:** Während der Sitzung liegt das Passwort im RAM
(Python-String). Für eine Desktop-App akzeptabel.
2. **ENV-Variable sichtbar:** `AZA_EMAIL_PASSWORD_0` kann in Prozesslisten
sichtbar sein. Empfehlung für Zukunft: OS-Keychain-Integration
(Windows Credential Manager / macOS Keychain).
3. **Altes Passwort exponiert:** Das Passwort `Asdfasdf22@@As96k324` war
in der JSON-Datei gespeichert. Es sollte beim Provider geändert werden.
4. **Backup-Dateien:** Die Kopie-Dateien (`aza_email - Kopie.py`, etc.)
enthalten noch den alten Code. Diese sind Backups und nicht aktiv.
---
## Repo-Hygiene
- Kein Git-Repository vorhanden → kein `.gitignore`-Eintrag nötig
- Kein History-Rewrite nötig
- `aza_email_config.json` wurde direkt bereinigt (Passwort entfernt)