Encryptie in rust
Gevoelige velden die in de platformdatabase worden opgeslagen, worden met AES-256-GCM versleuteld voordat ze naar schijf worden geschreven.
| Wat | Hoe |
|---|---|
| Account API-sleutels (Anthropic, OpenAI-compat., SMTP) | AES-256-GCM, MASTER_ENCRYPTION_KEY |
| Gebruikerswachtwoord-hashes | bcrypt (cost 12) |
| IMAP / e-mail-kanaalcredentials | AES-256-GCM, MASTER_ENCRYPTION_KEY |
| Databasebestanden op schijf | Gevoelige velden worden vóór opslag op applicatieniveau versleuteld (AES-256-GCM, per-account AAD, sleutels in HashiCorp Vault). |
De MASTER_ENCRYPTION_KEY wordt bij het opstarten via de serveromgeving geïnjecteerd en wordt nooit in de codebase of database opgeslagen. Gevoelige gegevens worden versleuteld met AES-256-GCM met per-account additional authenticated data; sleutelrotatie vereist een herversleuteling.
Encryptie in transit
- Alle publieke endpoints uitsluitend via HTTPS; HTTP wordt omgeleid naar HTTPS (Apache HSTS-header).
- Ondersteunde TLS-versies: TLS 1.2 en 1.3 (TLS 1.0 / 1.1 uitgeschakeld).
- Widget widget.js wordt geserveerd met Access-Control-Allow-Origin: *, maar de chat-API-endpoints valideren widget_key + origin-allowlist.
- Interne serviceaanroepen (Redis, MySQL op localhost) communiceren via de loopback-interface. Geen data verlaat de host onversleuteld.
Back-ups
Het volgende back-upschema is van toepassing op de platform-database en accountdatabases:
| Item | Frequentie | Bewaarperiode | Locatie |
|---|---|---|---|
| Platform-DB (einstein_saas_platform) | Dagelijks, 's nachts (UTC, geautomatiseerd) | 7 dagelijkse back-ups (roterend) | Lokaal volume + versleutelde offsite-replica |
| Account-DBs (einstein_saas_tenant_*) | Dagelijks, 's nachts (UTC, geautomatiseerd) | 7 dagelijkse back-ups (roterend) | Lokaal volume + versleutelde offsite-replica |
| Geüploade bestanden / documentopslag | Dagelijks, 's nachts (UTC, geautomatiseerd) | 7 dagelijkse back-ups (roterend) | Lokaal volume + versleutelde offsite-replica |
Back-ups draaien per database via mysqldump --single-transaction, worden gecomprimeerd en met age versleuteld opgeslagen, gerepliceerd naar een apart offsite-volume, en elke run wordt gecontroleerd op een niet-lege dump en gelogd met succes-/mislukkingsstatus.
Back-uparchieven worden in rust versleuteld met age (X25519 / ChaCha20-Poly1305); de ontsleutelingssleutel wordt los van de archieven bewaard. Velden met kolomniveau-versleuteling (AES-256-GCM) blijven versleuteld binnen elk archief. Herstelbaarheid wordt geverifieerd met een geautomatiseerde maandelijkse restore-test.
Toegangscontrole
4.1 Rolgebaseerde toegangscontrole (RBAC)
Elke portalgebruiker krijgt een rol toegewezen. Rollen bevatten losse permissies per onderdeel. Het platform controleert permissies server-side.
4.2 Tweefactorauthenticatie
- 2FA via een authenticator-app (TOTP, RFC 6238 — bijvoorbeeld Google Authenticator of Authy) of via een code per e-mail. Elke gebruiker zet het zelf aan in de accountinstellingen.
- Staat 2FA aan, dan vraagt het platform bij elke login om de tweede stap.
- Herstelcodes zijn er niet. Wie de code per e-mail kiest, heeft geen aparte app nodig.
4.3 Accountisolatie
Authenticatie vereist een account-context (slug-gebaseerde login). Sessietokens zijn beperkt tot één account. Cross-account resource-toegang wordt op de applicatielaag voorkomen door verplichte tenant_id-filters in de databasequery's.
Auditlogging
Significante acties op platform-resources worden vastgelegd in de tabel audit_log (platform-database). Elke invoer bevat:
- Actor: gebruikers-ID, rol en tenant-ID.
- Actie: werkwoord (aanmaken, bijwerken, verwijderen, inloggen, exporteren, …).
- Resource: entiteitstype en ID.
- Metadata: gewijzigde veldnamen en oud/nieuw waarden (gevoelige velden geredigeerd).
- Tijdstempel: opgeslagen in UTC (ISO 8601).
- IP-adres: bron-IP van het verzoek.
Auditlog-vermeldingen hebben op dit moment geen vaste bewaartermijn: ze worden niet automatisch gewist. De enige uitzondering is het bewijs dat een verwijderverzoek is uitgevoerd; die vermeldingen worden na 12 maanden automatisch gewist. Het log is append-only op applicatieniveau.
Auditregels worden geschreven door de gewone databasegebruiker van de applicatie. Een aparte insert-only databasegebruiker is alleen ingericht voor het auditlog van de reseller-API.
Kwetsbaarhedenbeheer
6.1 CVE-monitoring
Composer-afhankelijkheden controleren we met composer audit. Kritieke kwetsbaarheden in runtime-afhankelijkheden pakken we met voorrang op.
6.2 Patchcyclus
- OS-beveiligingsupdates: dagelijks automatisch geïnstalleerd (unattended-upgrades).
- PHP-runtime: PHP 8.5, bijgewerkt met beveiligingsupdates.
- Webserver: Apache 2.4.x — bijgehouden met distributie-beveiligingsupdates.
6.3 Responsible Disclosure
Externe beveiligingsonderzoekers worden uitgenodigd kwetsbaarheden te melden via ons gecoördineerde openbaarmakingsbeleid. Lees het responsible disclosure-beleid →
Hosting & infrastructuur
| Component | Detail |
|---|---|
| Hostingregio | EU — Nederland (database), Frankrijk (bestanden en back-ups) |
| Webserver | Apache 2.4 (mod_rewrite, mod_ssl) |
| Runtime | PHP 8.5 |
| Database | MySQL / MariaDB (platform + per-tenant) |
| Cache / sessies | Redis (loopback, password-protected) |
| Grensoverschrijdende datatransfers | De AI-verwerking kan buiten de EU plaatsvinden, bijvoorbeeld in de Verenigde Staten, tenzij EU-only aanstaat (vanaf Plus). Welke AI-leveranciers we gebruiken, laten we je op verzoek weten. |