Ga naar inhoud

Secrets

Uitgangspunt: alle secrets leven in .env-bestanden binnen de repo/stack en worden bij de eerste start automatisch gegenereerd. Er staan geen secrets los op de server (geen /root/.*-bestanden meer) en niets staat in git.

Twee soorten

  1. Stack-eigen secrets — alleen relevant binnen één stack (DB-wachtwoorden, Django SECRET_KEY, admin-wachtwoord, Laravel APP_KEY, Operaton service-wachtwoord, …). Elke repo genereert die zelf in zijn eigen .env via zijn eigen make setup.

  2. Gedeelde integratie-secrets — moeten gelijk zijn in zgw én portal, omdat ze de koppeling tussen beide vormen. Die beheert platform centraal in integration.env en schrijft ze naar beide stacks:

Sleutel Waarvoor
ZGW_JWT_CLIENT_ID / ZGW_JWT_SECRET JWT waarmee het portaal de ZGW-API's (Open Zaak e.a.) aanroept
OBJECTS_API_TOKEN token waarmee het portaal de Objects-API aanroept
OBJECTTYPES_API_TOKEN token waarmee het portaal de Objecttypes-API aanroept
NOTIF_CALLBACK_SECRET secret waarmee Open Notificaties het portaal terugbelt

Hoe het werkt

platform/scripts/setup.sh
   ├─ genereert (eenmalig) integration.env   ← chmod 600, in .gitignore
   └─ schrijft een "beheerd door platform"-blok in
        ../zgw/.env      en
        ../portal/.env

Het beheerde blok wordt bij elke make setup opnieuw geschreven (zodat een gewijzigd secret overal doorkomt); je eigen handmatige waarden eromheen blijven staan.

Een gedeeld secret roteren

cd platform
# verwijder de regel uit integration.env, of het hele bestand voor alles:
#   sed -i '/^NOTIF_CALLBACK_SECRET=/d' integration.env
make setup          # genereert het ontbrekende secret opnieuw + verspreidt het
make up-all         # herstart de stacks zodat ze het nieuwe secret oppikken

Standalone draaien (één repo)

Clone je alleen zgw of alleen portal zonder platform, dan genereert die repo zijn eigen integratie-secrets in zijn eigen .env. Voor de gekoppelde opstelling laat je platform ze uitlijnen — dat is het hele punt van de overkoepelende repo.

Nog veiliger (later)

De .env-aanpak is de pragmatische default. Wil je strenger: de waarden kunnen later naar Docker secrets of een SOPS/age-versleuteld bestand in de repo verhuizen zonder dat de stacks zelf veranderen.