2.1 KiB
2.1 KiB
ADR-0009 — Versleutelde platformmailboxen in de applicatie
- Status: accepted
- Datum: 2026-07-22
Context
Alerts van VDAB, Indeed, LinkedIn en andere gereviewde jobboards komen in verschillende mailboxaccounts binnen en moeten vaker dan eenmaal per dag verwerkt kunnen worden. Alleen globale environmentcredentials bieden geen bruikbare beheerflow in het platform. Mailbox-app-wachtwoorden zijn secrets en mogen niet leesbaar in de database, logs, taakresultaten of HTML terechtkomen.
Besluit
- Bewaar één gebruikersgescopeerde
MailboxConnectionper vacatureplatform. - Ondersteun Gmail, Outlook / Microsoft 365 en een gecontroleerde aangepaste publieke IMAP-host, uitsluitend via IMAP over TLS.
- Versleutel app-wachtwoorden met Fernet/MultiFernet en een afzonderlijke
MAILBOX_CREDENTIAL_KEYS-sleutellijst. De eerste sleutel versleutelt; volgende sleutels zijn alleen voor decryptie tijdens rotatie. - Laat de scheduler elke vijf minuten verschuldigde mailboxen selecteren. Iedere mailbox kiest zelf 5, 15, 30, 60, 180 of 360 minuten.
- Gebruik een databaselease per mailbox, idempotentie per mailbox + Message-ID en foutisolatie per mailbox/bericht.
- Alle UI-mutaties zijn login-, user-scope- en CSRF-beveiligd. Het wachtwoordveld wordt nooit opnieuw gevuld.
- Valideer de IMAP-host als publieke host voor de verbinding. Platformlinks uit mail worden niet automatisch gevolgd.
Sleutelrotatie
- Voeg de nieuwe sleutel vóór de oude toe aan
MAILBOX_CREDENTIAL_KEYS. - Herstart web, worker en scheduler.
- Draai
python manage.py rotate_mailbox_credentials. - Verwijder de oude sleutel pas nadat de opdracht slaagt en een mailboxsync is getest.
Gevolgen
cryptographyis een productieafhankelijkheid en staat exact gepind in de lockfile.- Een databasedump bevat ciphertext en blijft gevoelig; de encryptiesleutel wordt apart in de secretstore/back-up bewaard.
- Zonder expliciete sleutel is mailboxbeheer in productie fail-closed. Alleen DEBUG gebruikt een lokale sleutel afgeleid van de development
SECRET_KEY. - Dit is een mailboxlogin, geen login bij een jobboard en geen toestemming voor directe platformfetch.