Security i audit

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_ADMINPlatformbreed beheer
JURISDICTION_ADMINBeheer binnen één eiland of jurisdiction (Bonaire, Curaçao, Sint-Maarten, Saba of Sint-Eustatius)
TAX_OFFICERAanslagen, kwijtschelding, betalingsstatus
REGISTRATION_CLERKKentekenuitgifte, inschrijvingen, overschrijvingen
INSPECTORKeuringsresultaten registreren
INSURER_SYSTEMMachine-to-machine; verzekeringsstatus melden/verifiëren
POLICE_OFFICERLookup (enforcement check); case_ref verplicht voor acties (audit)
MUNICIPAL_OFFICERGemeentelijke lookup en handhaving
AUDITOR / READ_ONLYAlleen-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.
API → | Informashon →