← Beveiligingsoverzicht

Beveiligingspraktijken

Technische en organisatorische maatregelen die platform-data en klantworkloads beschermen bij ZelixAI.

🔐
Sectie 1

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.

🔓
Sectie 2

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.
💾
Sectie 3

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.

👥
Sectie 4

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.

📋
Sectie 5

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.

🛡
Sectie 6

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 →

🏢
Sectie 7

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.

Heb je een ingevulde beveiligingsvragenlijst nodig?

Heb je een beveiligingsvragenlijst? Stuur hem naar ons securityteam.

Neem contact op met het securityteam →