Beveiligingsbijlage — SchoolFlow
Bijlage bij de verwerkersovereenkomst: concrete technische en organisatorische maatregelen (art. 32 AVG).
Technische maatregelen
| Maatregel | Status | Toelichting |
|---|---|---|
| Tenant-scheiding per school | Geïmplementeerd | Row Level Security in PostgreSQL/Supabase; iedere query is automatisch beperkt tot school_id = current_school_id() van de ingelogde gebruiker (zie supabase/migrations/0002_auth_and_rls.sql) |
| Encryptie in transit | Geïmplementeerd | HTTPS/TLS voor alle verkeer naar het dashboard, de n8n-webhooks en Supabase |
| Encryptie at rest | Geïmplementeerd | Standaard encryptie-at-rest van de Supabase/PostgreSQL-hostingprovider |
| Authenticatie | Geïmplementeerd | Supabase Auth (e-mail/wachtwoord); geen publieke self-registratie — accounts ontstaan alleen via uitnodiging door een schoolbeheerder |
| MFA voor gevoelige rollen | Geïmplementeerd en afgedwongen | Verplichte TOTP-authenticatie (authenticator-app) voor de rollen HR en schoolbeheerder; wie nog niet is ingeschreven, wordt bij inloggen direct naar de inschrijfpagina geleid (zie middleware.ts en /dashboard/beveiliging) |
| Least-privilege rollen | Geïmplementeerd | Rolgebaseerde navigatie en servergezijdige rolcontrole in het dashboard (employee/operator/scheduler/teamlead/hr/substitute/admin); zie components/DashboardNav.tsx en de per-pagina rolchecks |
| Auditlogging | Geïmplementeerd | audit_log-tabel, gevuld door SF 21 - SchoolFlow Audit & Compliance |
| Service-role-scheiding | Geïmplementeerd | De n8n-workflows gebruiken een service-role-sleutel die buiten RLS om schrijft; elke query daarin filtert zelf op school_id (zie toelichting onderaan 0002_auth_and_rls.sql) |
| Gescheiden omgevingen | Aanbevolen | Gebruik een apart Supabase-project (of minimaal een aparte demo-school met demo_mode = true) voor demo's, gescheiden van een eventuele toekomstige productieomgeving |
| SSO (Microsoft Entra ID / Google Workspace / SURFconext) | Nog niet geïmplementeerd | Voorzien in fase 3 van de roadmap (docs/mvp-roadmap.md) |
Organisatorische maatregelen
- Geen invoermogelijkheid voor medische gegevens in het reguliere gebruikersportaal; UI-teksten wijzen gebruikers hier expliciet op (zie
/dashboard/ziek-melden). - Toegang tot de Supabase service-role-sleutel en de n8n-omgeving is beperkt tot de leverancier (Elhoucine Automation) en, na oplevering, de door de school aangewezen schoolbeheerder(s).
- Nieuwe gebruikers worden alleen toegevoegd via een expliciete uitnodiging door een schoolbeheerder (geen self-serve registratie) — zie
app/api/internal/gebruikers/uitnodigen/route.ts. - Demo-modus (
demo_mode = truein de schoolinstellingen) voorkomt dat notificaties naar echte medewerkers of leerlingen gaan totdat de school schriftelijk akkoord geeft — ziedocs/productie-runbook.md. - Zie
docs/incidentprocedure.mdvoor de te volgen stappen bij een (vermoeden van een) datalek.
Wat nog ontbreekt voor een volwaardig productiebeveiligingsniveau
- Onafhankelijke security-review/pentest vóór eerste betalende productie-oplevering aan een school.
- Formele incident-response-oefening met het team.
- MFA uitbreiden naar de rol scheduler (roostermaker) indien de school dat wenst — nu bewust beperkt tot HR/admin, de rollen met het breedste inzicht in personeelsgegevens.