Files
aza/AzA march 2026/security/handovers/STEP_4_4_CREDENTIALS.md
2026-03-25 22:03:39 +01:00

167 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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)