Technical & organisational measures

This page lists the technical and organisational measures (TOMs) that the ZentraLink platform supports out of the box. The list reflects what the codebase actually implements; operators add their own physical and procedural measures on top.

Access control

  • Self-hosted deployment on operator-owned infrastructure; physical access controlled by the host provider's policies (Hetzner / IONOS / on-prem).
  • Argon2id password hashing (memoryCost 19 MiB).
  • Two-factor authentication via TOTP with single-use backup codes.
  • Server-side opaque session tokens, 14-day TTL, secure + httpOnly + sameSite cookies.
  • Role-based access control (OWNER, ADMIN, MANAGER, MEMBER, VIEWER).

Authorisation

  • Tenant-scoped data access on every API route via requireTenantContext().
  • Per-route RBAC checks (RESOURCE_WRITE, USER_MANAGE, TENANT_MANAGE, AUDIT_READ).
  • Approver-role configuration for DNS change requests (TenantPolicy).
  • Tenant isolation verified by automated smoke tests on every phase.

Pseudonymisation / minimisation

  • Audit log stores user id + structured metadata, not raw payloads.
  • Login fingerprints are stored as SHA-256 hashes (not raw IP/UA pairs).
  • Backup codes stored as argon2id hashes only.

Encryption

  • TLS for all transport (operator-issued certificates, e.g. via Let's Encrypt).
  • Provider API credentials, 2FA secrets and tenant SMTP passwords encrypted at rest with AES-256-GCM using PLATFORM_ENCRYPTION_KEY.
  • Database access via Unix socket or localhost TCP recommended for single-host installs.

Integrity

  • Every DNS write produces a DnsChange row + audit event.
  • Pre- and post-execution snapshots captured automatically by the change-request executor.
  • Provider operations report per-op success/failure into the change request.

Availability

  • PostgreSQL standard backup tooling via scripts/backup.sh (pg_dump).
  • systemd-supervised services with automatic restart on failure.
  • Healthcheck endpoint exposed at /api/healthz.
  • Cron worker isolated behind CRON_TOKEN bearer auth, idempotent loops.

Auditability

  • AuditEvent rows for every privileged action (filtered viewer at /dashboard/audit).
  • CronRun rows for every scheduled job invocation.
  • MailMessage rows for every outbound email attempt (QUEUED/SENT/FAILED).
  • DnsChange and DnsChangeRequest rows form the complete DNS history.

Vendor management

  • Provider list and roles documented on the /integrations page.
  • Subprocessor list maintained at /subprocessors with current vendors and their role in the data flow.

Incident response

  • Statuspage rendered from the StatusIncident table at /status.
  • Security disclosure address: security@zentralink.net (operator can override per deployment).
  • Operator is responsible for time-bound notification flows (incident comms).