安全与审计
Hier leest u over authenticatie, autorisatie (zowel RBAC als ABAC), gegevensbescherming, rate limiting, audit en een aantal aanbevelingen voor het veilig gebruik van CVR in de praktijk.
Authenticatie
Web / SPA
Na login wordt gebruikgemaakt van een Laravel session (cookie); Laravel Sanctum is stateful voor same-origin API-calls. Zonder sessie wordt u doorgestuurd naar de loginpagina.
API (extern)
Er wordt een Bearer token in de Authorization-header verwacht. Dat token is ofwel de partner API key (die gehashed wordt opgeslagen in de partners-tabel) of een Sanctum personal access token voor gebruikers.
In een latere fase is optioneel ook OIDC/JWT (bijvoorbeeld Keycloak) via configuratie mogelijk.
Autorisatie — RBAC (rollen)
De toegang wordt in grote lijnen bepaald door de rol van de gebruiker of partner. De volgende rollen zijn gedefinieerd:
| Rol | Toepassing |
|---|---|
| SUPER_ADMIN | Platformbreed beheer |
| JURISDICTION_ADMIN | Beheer binnen één eiland of jurisdiction (Bonaire, Curaçao, Sint-Maarten, Saba of Sint-Eustatius) |
| TAX_OFFICER | Aanslagen, kwijtschelding, betalingsstatus |
| REGISTRATION_CLERK | Kentekenuitgifte, inschrijvingen, overschrijvingen |
| INSPECTOR | Keuringsresultaten registreren |
| INSURER_SYSTEM | Machine-to-machine; verzekeringsstatus melden/verifiëren |
| POLICE_OFFICER | Lookup (enforcement check); case_ref verplicht voor acties (audit) |
| MUNICIPAL_OFFICER | Gemeentelijke lookup en handhaving |
| AUDITOR / READ_ONLY | Alleen-lezen; auditlogs en rapporten |
Autorisatie — ABAC (attributen)
Naast de rol gelden er ook attribuut-beperkingen:
- Jurisdiction — De bevoegdheid kan beperkt zijn tot één of meer jurisdictions (Bonaire, Curaçao, Sint-Maarten, Saba, Sint-Eustatius). Dit zorgt voor multi-tenant isolatie.
- Purpose-of-use — Bij enforcement- en gemeente-reads is een purposeCode verplicht; alleen purposes die aan de rol of partner zijn toegewezen, zijn toegestaan. Het doelgebruik wordt gelogd.
- Case reference — Voor politie-acties (zoals een lookup in het kader van een actie, melding of beslag) is een case_id/caseRef verplicht voor de audit. Er zijn geen stille lookups.
Gegevensbescherming
At rest
Bij voorkeur wordt gebruikgemaakt van PostgreSQL disk-level encryption (LUKS of cloud); Laravel encrypted casts voor gevoelige velden (zoals national_id, CRIB of BSN-achtige id's) waar van toepassing. PII-encryptie at-rest kan via pgcrypto of op app-layer.
In transit
Er wordt alleen TLS (HTTPS) gebruikt; dit wordt afgedwongen in Nginx of de load balancer.
Documenten
Object storage met signed URLs en retention policies; er worden geen directe lange-termijn-URLs in logs opgenomen.
Secrets
APP_KEY, KRP_DOCUMENT_SIGNATURE_KEY en DB- en Redis-credentials staan in .env; ze komen nooit in de repo.
Rate limiting
- Per partner — Er geldt een limiet (bijvoorbeeld rate_limit_per_minute in de partners-tabel) per API key.
- Globaal — Throttle op het enforcement-endpoint (bijv. 300/min) en op de standaard API (bijv. 60/min) via config of env. Dit beperkt brute-force op lookup.
- Optioneel — Per partner kan een IP-allowlist worden ingesteld (partners.ip_allowlist).
Audit
Elke enforcement- of gemeente-read wordt gelogd met purpose (en optioneel case_ref).
Elke write levert een immutable audit-log op met onder meer:
- Who — de actor (user of partner)
- What — de actie, het entity type en id
- When — de timestamp
- Before/after — een diff of hash van de oude en nieuwe staat (waar van toepassing)
- Reason — een reason code of toelichting
- Context — IP, device en correlation_id
Er zijn geen stille updates; de responses bevatten een correlation_id voor traceerbaarheid.
Aanbevelingen (latere fase)
- mTLS voor de partner-API waar dat vereist is.
- Een break-glass flow voor verhoogde audit-toegang met rechtvaardiging.
- Regelmatige rotatie van API-keys en signing keys.
- Device binding en MDM voor mobile politie; remote wipe wanneer een apparaat verloren gaat.