33 lines
1.5 KiB
Markdown
33 lines
1.5 KiB
Markdown
# ADR: recipientEmail in BullMQ-Jobs
|
|
|
|
**Datum:** 2026-04-17
|
|
**Status:** Akzeptiert
|
|
|
|
## Kontext
|
|
|
|
BullMQ-Jobs im `email-send`-Queue enthalten `recipientEmail` im Klartext. SMTP benötigt die Klartext-E-Mail-Adresse als Empfängeradresse — ohne sie kann keine E-Mail zugestellt werden.
|
|
|
|
## Entscheidung
|
|
|
|
`recipientEmail` verbleibt im Klartext in den Job-Daten. Redis läuft ausschließlich intern (kein öffentlicher Port, Docker-internes Netzwerk, Hetzner DE).
|
|
|
|
Risikominimierung durch bestehende Maßnahmen:
|
|
- `removeOnComplete: 100` — abgeschlossene Jobs werden nach 100 Einträgen bereinigt
|
|
- `removeOnFail: { count: 500 }` — fehlgeschlagene Jobs werden begrenzt
|
|
- `recipientHash` (SHA256) wird für alle Analytics-Events genutzt — kein Klartext in ClickHouse
|
|
|
|
## Abgelehnete Alternativen
|
|
|
|
**E-Mail-Adresse zur Laufzeit aus DB laden:** Worker enthält nur `subscriberId`, lädt E-Mail aus PostgreSQL. Nachteil: zusätzliche DB-Abfrage pro Job, komplexerer Fehlerfall bei DB-Ausfall während des Versands.
|
|
|
|
**Redis Encryption-at-rest:** Technisch möglich (Redis 7 + verschlüsselte RDB-Snapshots). Infra-Aufgabe, nicht im Anwendungscode lösbar.
|
|
|
|
## Akzeptiertes Risiko
|
|
|
|
Bei einem Redis-Dump-Leak wären E-Mail-Adressen sichtbar. Wahrscheinlichkeit gering (internes Netz, kein öffentlicher Zugriff).
|
|
|
|
## Offene Maßnahmen
|
|
|
|
- Infra-Ticket erstellen: Redis-Encryption-at-rest auf Hetzner konfigurieren
|
|
- Redis-Port darf nie in `docker-compose.yml` nach außen exponiert werden
|