Flex HR

Security & Compliance White Paper / Livre blanc sécurité

Multi-tenant HRIS — Sensitive HR data

Document généré à partir de l'implémentation applicative (juillet 2026, rév. 4)

Livre blanc sécurité & conformité

Plateforme SIRH multi-tenant — Flex HR

Destinataires : services informatiques, RSSI, DPO, auditeurs

Version document : août 2026 (rév. 9) — A.5.6 Security Watch + A.8.23 N/A compensé ; Annexe A 77 Implemented ; écarts DPA / revue indépendante

1. Introduction

Ce livre blanc décrit les mesures de sécurité, de gouvernance des accès et de protection des données implémentées dans l’application Flex HR (SIRH multi-organisations). Il s’adresse aux équipes IT chargées d’évaluer le sérieux de la plateforme pour des données RH sensibles.

Pack d’alignement ISO (complément) : cartographie honnête des contrôles produit vs ISO/IEC 27001, 27017, 27018, 27701 et 25010 (statuts Implémenté / Partiel / Plateforme / Client / Écart) — iso-alignment-fluxehra.html / PDF. Ce n’est pas une revendication de certification ISO.

Principe directeur : le navigateur est considéré comme non fiable. Les rôles, le périmètre organisationnel et les opérations sensibles sont toujours validés côté serveur (ou par les politiques PostgreSQL Row Level Security sous le JWT de l’utilisateur).

↑ Sommaire · ↑ Languages

2. Architecture technique

Frontend : Next.js (App Router), déployé sur Vercel.

Backend applicatif : routes API Next.js (Node.js) agissant comme couche de contrôle avant les opérations privilégiées.

Données & identité : Supabase (PostgreSQL, Auth, Storage, Realtime).

Modèle multi-tenant : schéma PostgreSQL partagé ; chaque table métier porte un organization_id protégé par RLS. Les Super Admins gèrent les modèles globaux (default_schemas, settings) distincts des données par organisation.

Données temporelles (bitemporal) : historisation des données employé avec dates d’effet ; intégrité assurée par la logique applicative et les contraintes base.

↑ Sommaire · ↑ Languages

3. Hébergement & localisation des données

Supabase (base de données, authentification, stockage fichiers) :

Vercel (application web & API) :

Recommandation IT : documenter dans votre registre de traitement la région Supabase effective et la configuration régionale Vercel choisie pour chaque environnement (production, préproduction).

↑ Sommaire · ↑ Languages

4. Authentification & sessions

↑ Sommaire · ↑ Languages

5. Rôles & contrôle d’accès (RBAC)

La plateforme combine un rôle plateforme (users.role) et des permissions fines par organisation (role_permissions).

Rôle / profilDescription
Super Admin (super_admin)Administration plateforme (schémas par défaut, paramètres) ; accès aux données d’une organisation uniquement après accord Org Admin (grant 48 h) puis entrée explicite.
Org Admin (admin)Administration d’une organisation : schémas, paramètres, intégrations, mass upload.
Domain AdminAccès lecture/écriture par module (Core HR, Performance, etc.) via role_permissions (roleType = Domain Admin).
HRPérimètre géographique/organisationnel optionnel ; accès HR Self Service et écrans métier selon modules.
ManagerDérivé de la chaîne hiérarchique (manager dans les données organisation) ; Manager Self Service.
Employé (employee)Self-service employé ; visibilité des champs selon la matrice Data Visibility.

Matrice API serveur (lib/supabase-api-auth.ts) : requireBearerDbUser, requireSuperAdminBearer, requireOrgAdminBearer, assertOrganizationScope empêchent un admin d’org d’agir sur un autre organization_id.

Garde middleware (proxy.ts) : pages /su-admin/* réservées aux Super Admins ; API en refus par défaut — toute route /api/* exige une session valide sauf liste blanche explicite (lib/middleware-routes.ts) : auth publique, cron avec CRON_SECRET, intégrations HMAC.

↑ Sommaire · ↑ Languages

6. Isolation multi-tenant & Row Level Security

La frontière principale entre organisations est PostgreSQL RLS : les politiques lient auth.uid() au profil users et au organization_id des lignes.

↑ Sommaire · ↑ Languages

7. Proxy / impersonation (support & audit)

Fonctionnalité permettant à un administrateur de visualiser l’application comme un autre utilisateur (support, recette).

↑ Sommaire · ↑ Languages

8. Protection des données & RGPD

L’application fournit des mécanismes techniques alignés sur les exigences RGPD ; la conformité juridique globale (base légale, registre, DPA avec sous-traitants) reste de la responsabilité du responsable de traitement.

↑ Sommaire · ↑ Languages

9. Visibilité des champs & rétention

Onglet Data Visibility & Retention (SU Admin et configuration org) :

↑ Sommaire · ↑ Languages

10. Chiffrement — champs tagués sensibles en base de données

En transit :

Au repos (infrastructure) :

Chiffrement applicatif effectif en base — champs sensitive: true :

Le drapeau sensitive sur un champ de schéma (ex. numéro de sécurité sociale, IBAN, permis de conduire, documents sensibles) n’est pas limité à l’interface. Lors de chaque enregistrement, la valeur en clair est transformée avant insertion PostgreSQL en texte chiffré préfixé ENC2:: (AES-256-GCM, IV aléatoire, tag d’authentification, clé dérivée par scrypt de ENCRYPTION_KEY). Les valeurs historiques au format ENC:: (AES CryptoJS) restent lisibles en rétrocompatibilité et seront ré-encryptées progressivement.

Distinction importante pour les équipes IT :

Limites à connaître :

↑ Sommaire · ↑ Languages

11. Clés API & gestion des secrets

SecretUsageExposition
NEXT_PUBLIC_SUPABASE_ANON_KEYClient Supabase (soumise à RLS)Publique (bundle client)
SUPABASE_SERVICE_ROLE_KEYOpérations privilégiées serveurStrictement serveur
ENCRYPTION_KEYChiffrement champs sensiblesServeur uniquement
CRON_SECRETJobs planifiés (notifications, exports)Serveur / planificateur
INTEGRATION_KEY_PEPPER / HMACClés API intégration (hash SHA-256, jamais stockées en clair)Serveur
ORG_AUTH_STATE_SECRETSSO OIDC état signéServeur
APP_URLOrigine canonique pour redirections (anti open-redirect / Host spoofing)Serveur (obligatoire en production)
EMPLOYEE_DATA_REQUEST_TOKEN_PEPPERHachage des jetons de demande de données employé (nouvelles embauches)Serveur (obligatoire en production)
SMTP / TurnstileE-mails et anti-botTable settings / organization_settings
REQUIRE_MFA_FOR_PRIVILEGED_ROLESExige JWT aal2 pour admin / super_admin / hr / Domain Admin (défaut ON en production si non défini)Vercel / env

Les paramètres globaux (settings) ne sont modifiables que par Super Admin. Régénération des clés d’intégration via API dédiée avec audit.

↑ Sommaire · ↑ Languages

12. Piste d’audit (audit trail)

Table audit_logs (PostgreSQL) :

Les écritures Core HR embauche / mise à jour / sortie émettent désormais des événements d’audit (juillet 2026 rév. 4).

SIEM / détection d’intrusion (août 2026, rév. 6) : en complément de audit_logs (piste métier), l’application émet des événements de sécurité structurés [SECURITY_EVENT] via lib/security-logger.ts : 401/403, isolation tenant / BOLA, échecs d’auth, refus RLS, rate-limit, MFA, échecs cron, HMAC webhook (DocuSign Connect / export intégration), blocages SSRF (ssrf-guard). Ingest direct vers Axiom (dataset fluxehra_logs, hors Log Drain Vercel). Moniteurs e-mail (3 slots) : BOLA/tenant (403), force brute par IP, et signal fort (CRON_AUTH_DENIED / RLS_DENIED / WEBHOOK_HMAC_DENIED / SSRF_BLOCKED). Payloads sans PII (e-mail haché pour les échecs de login). Procédure interne : docs/siem-security-operations.md (non publique).

↑ Sommaire · ↑ Languages

13. Stockage documentaire (DMS)

↑ Sommaire · ↑ Languages

14. Notifications & signalement d’incidents

↑ Sommaire · ↑ Languages

15. En-têtes HTTP & surface d’attaque

En-têtes de sécurité (next.config.js + proxy.ts) :

Gestion des dépendances (ISO A.8.8) : onglet SU Admin Components Update (dérive de versions vs registre npm) + SLA affiché (Critique ≤ 7 j, Élevé ≤ 30 j, Moyen ≤ 90 j). Gate CI npm run audit:deps (workflow GitHub dependency-audit) : échec sur avis high/critical des dépendances de production ; waivers documentés via AUDIT_ALLOWLIST.

Veille communautés (ISO A.5.6) : SU Admin Security Watch (CERT-FR / CISA / OSV, filtré impact) + Action GitHub quotidienne + Dependabot ; registre d’abonnements signé (2026-08-14).

Rate limiting global (lib/api-rate-limit.ts, table api_rate_limits en backend durable partagé entre instances, fallback mémoire) sur toutes les routes /api/* via le proxy :

Observabilité : @vercel/analytics et @vercel/speed-insights (métriques agrégées, sans données RH) ; CSP connect-src autorise vitals.vercel-insights.com. SIEM Axiom : ingest applicatif des événements SECURITY_EVENT (authz, tenant, RLS, brute-force par IP, cron, HMAC webhook, SSRF) vers fluxehra_logs ; alertes moniteur → e-mail ops. Événements ops structurés (captureOpsEvent) et webhook optionnel OPS_ALERT_WEBHOOK_URL.

Protection SSRF (ISO A.8.21) (lib/ssrf-guard.ts) : URLs/hôtes sortants configurables — webhooks d’export API, endpoints OIDC (token/JWKS + authorize), SSO SAML IdP, hôte SFTP, et hôtes SMTP (test + envoi) — https obligatoire pour les URLs IdP, résolution DNS, blocage des plages privées / loopback / lien-local / métadonnées cloud (RFC1918, 127.0.0.0/8, 169.254.0.0/16…). Validation à la sauvegarde Org SSO/OAuth et à l’authorize.

Autres contrôles : rate limiting export intégration (12 req/min), liste blanche IP optionnelle, HMAC sur exports, Turnstile anti-énumération e-mail (optionnel), réponses neutres anti-énumération sur les endpoints d’authentification publics, robots.txt restrictif, slugs organisation réservés (lib/org-slug-policy.ts — blocage .env, segments réservés), build TypeScript strict (sans ignoreBuildErrors). Lecteur SCORM : iframes sandbox, postMessage avec origine stricte, limites zip anti-bombe (100 Mo compressé / 500 Mo décompressé / 5 000 fichiers).

Régions production : Supabase eu-west-1 (Irlande) et Vercel dub1 (Dublin) — alignées dans vercel.json pour minimiser la latence et la résidence des données en Europe.

↑ Sommaire · ↑ Languages

16. Checklist de vérification IT

  1. Confirmer RLS activé sur toutes les tables locataires dans Supabase (migration 20260606120000 pour Core HR).
  2. Vérifier l’absence de SUPABASE_TLS_INSECURE et SMTP_TLS_INSECURE en production.
  3. Régions documentées : Supabase eu-west-1, Vercel dub1 (vercel.json) ; production https://fluxehra.ai.
  4. Valider la force de CRON_SECRET et restreindre l’appelant du planificateur.
  5. Activer Turnstile (SU global + org IT Link) si trafic bot suspect.
  6. Tester tentatives IDOR (organization_id falsifié) sur APIs admin.
  7. Surveiller le SIEM Axiom (fluxehra_logs) : moniteurs BOLA/tenant, brute-force par IP, high-signal (cron / RLS / HMAC / SSRF) ; plus rate-limit, échecs audit, AUTH_UPSTREAM_UNAVAILABLE, 403 MFA_REQUIRED.
  8. Confirmer AXIOM_TOKEN / AXIOM_DATASET / AXIOM_URL (edge) en production ; smoke ingest après rotation de token.
  9. MFA : activer TOTP (Enroll + Verify) dans Supabase Dashboard → Authentication → MFA ; en production MFA est ON par défaut pour admin/super_admin/hr/Domain Admin (sinon définir explicitement REQUIRE_MFA_FOR_PRIVILEGED_ROLES) ; inscription sur /security/mfa et step-up TOTP à la connexion pour aal2.
  10. Visiter /trust (Trust Center) ; télécharger le pack ISO iso-alignment-fluxehra.pdf.
  11. Politique mot de passe : confirmer ≥ 20 + complexité côté app et dans Supabase Auth Dashboard.
  12. URLs de redirection Supabase incluent https://fluxehra.ai/**.
  13. Configurer APP_URL=https://fluxehra.ai et EMPLOYEE_DATA_REQUEST_TOKEN_PEPPER en production.
  14. Configurer SSO OIDC par organisation (Org Setup) ou SAML au niveau projet Supabase.

↑ Sommaire · ↑ Languages

17. Écarts résiduels (transparence)

Contrôles récemment renforcés (juin–juillet 2026) :

Ce document reflète l’état de l’application au moment de sa génération. Pour toute question : contact@fluxehra.ai

↑ Sommaire · ↑ Languages

Security & Compliance White Paper

Multi-tenant HRIS Platform — Flex HR

Audience: IT departments, CISO, DPO, auditors

Document version: August 2026 (rev. 9) — A.5.6 Security Watch + A.8.23 N/A compensating; Annex A 77 Implemented; residual DPA / independent review

1. Introduction

This white paper describes security, access governance, and data protection measures implemented in the Flex HR application (multi-organization HRIS). It is intended for IT teams evaluating the platform for sensitive HR data.

ISO alignment pack (companion): honest product-control mapping to ISO/IEC 27001, 27017, 27018, 27701, and 25010 (Implemented / Partial / Platform / Customer / Gap) — iso-alignment-fluxehra.html / PDF. Not an ISO certification claim.

Design principle: the browser is untrusted. Roles, organization scope, and sensitive operations are always enforced on the server (or by PostgreSQL Row Level Security under the user JWT).

↑ Table of contents · ↑ Languages

2. Technical architecture

Frontend: Next.js (App Router), deployed on Vercel.

Application backend: Next.js API routes (Node.js) as a control layer before privileged operations.

Data & identity: Supabase (PostgreSQL, Auth, Storage, Realtime).

Multi-tenant model: shared PostgreSQL schema; tenant tables carry organization_id protected by RLS. Super Admins manage global templates separate from per-organization data.

Bitemporal data: employee history with effective dates; integrity via application logic and database constraints.

↑ Table of contents · ↑ Languages

3. Hosting & data location

Supabase (database, auth, file storage):

Vercel (web app & API):

IT recommendation: record the effective Supabase region and Vercel configuration per environment in your processing register.

↑ Table of contents · ↑ Languages

4. Authentication & sessions

↑ Table of contents · ↑ Languages

5. Roles & access control (RBAC)

The platform combines platform role (users.role) and fine-grained org permissions (role_permissions).

RoleDescription
Super AdminPlatform administration: default schemas, settings; tenant org data only after Org Admin–approved 48h grant and explicit Enter.
Org AdminSingle-organization administration.
Domain AdminPer-module Read/Write via role_permissions.
HROptional geographic/org scope; HR Self Service.
ManagerDerived from management chain; Manager Self Service.
EmployeeEmployee self-service; field visibility per Data Visibility matrix.

Server API matrix (supabase-api-auth.ts) and middleware guards (proxy.ts) enforce scope. Default-deny API: all /api/* routes require a valid session except an explicit allowlist (middleware-routes.ts): public auth, cron with CRON_SECRET, HMAC integrations.

↑ Table of contents · ↑ Languages

6. Multi-tenant isolation & RLS

Primary boundary: PostgreSQL RLS linking auth.uid() to users and row organization_id.

↑ Table of contents · ↑ Languages

7. Proxy / impersonation

↑ Table of contents · ↑ Languages

8. Data protection & GDPR

The application provides technical mechanisms aligned with GDPR expectations; legal compliance (lawful basis, register, DPAs) remains the controller's responsibility.

↑ Table of contents · ↑ Languages

9. Field visibility & retention

Data Visibility & Retention tab: manager/employee modes none, view, edit, workflow. Sensitive fields (SSN, IBAN, etc.) restricted by default. The sensitive: true schema flag triggers database encryption on save (section 10) — not UI masking only. Virtual local-data policy for all local-data-* schemas. Self-service validated in self-service-submit-auth.ts.

↑ Table of contents · ↑ Languages

10. Encryption — sensitive-tagged fields in the database

In transit: HTTPS, HSTS, TLS verification for Supabase and SMTP.

At rest (infrastructure): Supabase disk/storage encryption per project region.

Effective application encryption — sensitive: true schema fields: The sensitive flag is not UI-only. On every save, plain values are encrypted before PostgreSQL insert as ENC2:: + AES-256-GCM ciphertext (random IV, auth tag, scrypt-derived key from server-only ENCRYPTION_KEY). Legacy ENC:: (CryptoJS AES) values stay readable for backward compatibility.

Limits: Only schema fields marked sensitive: true are encrypted this way; binary documents are protected by the private bucket + authenticated file route (section 13), not ENC2::.

↑ Table of contents · ↑ Languages

11. API keys & secrets

Anon key (client, RLS-bound); service role (server only); encryption key; cron secret; integration key hashing (SHA-256); OIDC state secret; APP_URL (canonical redirect origin, required in production); EMPLOYEE_DATA_REQUEST_TOKEN_PEPPER (new-hire data-request token hashing, required in production); SMTP/Turnstile in settings tables. Global settings: Super Admin only.

↑ Table of contents · ↑ Languages

12. Audit trail

audit_logs table with org scope, user, proxied user, event codes, details. Frozen AUDIT_EVENTS catalogue including CORE_HR_HIRE / CORE_HR_UPDATE / CORE_HR_TERMINATE, retention, DSAR, and compliance-evidence exports. CSV + compliance JSON export in Audit Trail UI. Page views deduped per minute.

Security SIEM (August 2026, rev. 6): alongside business audit_logs, the app emits structured [SECURITY_EVENT] telemetry via lib/security-logger.ts (401/403, tenant isolation / BOLA, auth failures, RLS denials, rate limits, cron auth failures, webhook HMAC denials for DocuSign Connect / integration export, SSRF blocks). Direct ingest to Axiom dataset fluxehra_logs (not Vercel Log Drain). Email monitors (3 slots): BOLA/tenant (403), brute-force per IP, and high-signal (CRON_AUTH_DENIED / RLS_DENIED / WEBHOOK_HMAC_DENIED / SSRF_BLOCKED). Payloads are PII-safe (hashed email on login failures). Internal ops procedure: docs/siem-security-operations.md (not public).

↑ Table of contents · ↑ Languages

13. Document storage (DMS)

Private Supabase bucket documents (no public read). All reads go through the authenticated app route /api/documents/file/… (lib/document-access.ts) enforcing application rules: Employee/Manager field visibility (Data Visibility matrix), management subtree, HR/Admin org scope, and learning enrollments for SCORM/course content — each asset individually authorized then streamed (service role, Range support for video). Uploads via signed URLs after authorization, org-scoped storage RLS insert policy. Storage gateway (lib/storage-ops.ts): sole entry point to the Supabase Storage SDK for documents — every operation calls assertSafeStoragePath first. Path hardening via isUnsafeStoragePath (traversal, encoded %2e, absolute paths, backslashes) plus assertStoragePathUnderOrg on upload/delete APIs (including public employee-data-request flow). employee_picture remains readable by org members (org chart).

↑ Table of contents · ↑ Languages

14. Notifications & incident reporting

Sanitized HTML notifications; TLS SMTP; cron secret. Configurable core-hr:employee-data-request email template for new-hire data requests. Manual « Report a bug » → in-app escalation HR → Org Admin → SU (no email). Automatic client-error reports still email configurable bugReportEmail. ISO A.8.11: bug/error channels run redactSensitivePii (IBAN/SSN-like patterns) before store/email; authorized CSV/API/SFTP/DSAR/UI decrypt remains plaintext for justified exports.

↑ Table of contents · ↑ Languages

15. HTTP headers & attack surface

Per-request nonce-based Content-Security-Policy (lib/csp.ts, applied in proxy.ts): in production, script-src allows neither 'unsafe-inline' nor 'unsafe-eval' — inline scripts carry a random 128-bit nonce with 'strict-dynamic'; dynamically injected scripts (Turnstile) inherit trust. style-src 'unsafe-inline' is kept as a documented accepted risk (Tailwind/Radix/chart libraries rely on inline style attributes). X-Powered-By suppressed (poweredByHeader: false). Plus HSTS (2-year preload), X-Frame-Options DENY, nosniff, Permissions-Policy, Referrer-Policy.

Dependency management (ISO A.8.8): SU Admin Components Update (version drift vs npm) + in-UI SLA (Critical ≤7d, High ≤30d, Medium ≤90d). CI gate npm run audit:deps (GitHub dependency-audit workflow) fails on production high/critical advisories; documented waivers via AUDIT_ALLOWLIST.

Community subscriptions (ISO A.5.6): SU Admin Security Watch (CERT-FR / CISA / OSV, impact-filtered) + daily GitHub Action + Dependabot; signed subscriptions register (2026-08-14).

Global API rate limits (durable api_rate_limits table shared across instances, memory fallback): authenticated 600/min per verified user; file serving /api/documents/file/ 3,000/min per user; public auth 30/min (includes /api/public/employee-data-request); other public 120/min; cron 60/min.

Vercel observability: @vercel/analytics and @vercel/speed-insights (aggregated metrics, no HR payload); CSP connect-src allows vitals.vercel-insights.com. Axiom security SIEM: application ingest of SECURITY_EVENT telemetry (authz, tenant, RLS, per-IP brute-force, cron, webhook HMAC, SSRF) to dataset fluxehra_logs; monitor alerts to ops email. Structured ops events (captureOpsEvent) and optional OPS_ALERT_WEBHOOK_URL.

SSRF guard (ISO A.8.21) (ssrf-guard.ts) on tenant-configurable outbound destinations: export webhooks, OIDC token/JWKS + authorize URLs, SAML IdP SSO URL, SFTP hosts, and SMTP hosts (test + send) — https required for IdP URLs, DNS resolution, private/loopback/metadata ranges blocked; validated on Org SSO/OAuth save and authorize. Integration export limits, optional IP allow-list, HMAC exports, Turnstile anti-enumeration, neutral anti-enumeration responses on public auth endpoints, restrictive robots.txt, reserved org slugs (org-slug-policy.ts), strict TypeScript build. SCORM player: sandboxed iframes, strict postMessage origins, zip-bomb limits. Regions: Supabase eu-west-1 + Vercel dub1 (vercel.json).

↑ Table of contents · ↑ Languages

16. IT verification checklist

  1. Confirm RLS on tenant tables (Core HR migration 20260606120000).
  2. No insecure TLS flags in production.
  3. Document Supabase eu-west-1 and Vercel dub1 regions; production URL https://fluxehra.ai.
  4. Set APP_URL and EMPLOYEE_DATA_REQUEST_TOKEN_PEPPER in production.
  5. Strong CRON_SECRET.
  6. Enable Turnstile globally (SU login) and/or per org (IT Link) if needed.
  7. Test IDOR on admin APIs.
  8. Monitor Axiom SIEM (fluxehra_logs): BOLA/tenant, per-IP brute-force, high-signal (cron / RLS / HMAC / SSRF); plus rate limits, audit failures, auth upstream errors, 403 MFA_REQUIRED.
  9. Confirm AXIOM_TOKEN / AXIOM_DATASET / AXIOM_URL (edge) in production; re-run ingest smoke after token rotation.
  10. MFA: enable TOTP Enroll+Verify in Supabase Dashboard; MFA defaults ON in production for admin/super_admin/hr (set REQUIRE_MFA_FOR_PRIVILEGED_ROLES=false only to disable); enroll at /security/mfa and complete TOTP step-up for aal2.
  11. Password policy: app enforces ≥20 + complexity on /reset-password; align Supabase Auth dashboard.
  12. Review /trust and download iso-alignment-fluxehra.pdf.
  13. Supabase redirect URLs include https://fluxehra.ai/**.
  14. Configure per-org OIDC SSO or project-level SAML.

↑ Table of contents · ↑ Languages

17. Residual gaps (transparency)

Recently strengthened (June–July 2026): HTTP security headers; default-deny API allowlist; durable rate limiting; proxy revalidation; Core HR tenant RLS; MFA TOTP for admin/SU/hr/Domain Admin with login step-up (default ON in production); IDOR fixes; scoped crypto decrypt; AES-256-GCM (ENC2::); SSRF guard; private documents bucket; routing hardening; eu-west-1 + dub1; production https://fluxehra.ai; Turnstile; nonce CSP (rev. 2); Storage path hardening; July 2026 rev. 3: Employee data request flow; OIDC open-redirect mitigation; storage-ops.ts; Vercel Analytics. July 2026 rev. 4: Core HR hire/update/terminate audit; real retention purge; DSAR export/anonymize; MFA default-on + HR role; password policy ≥20; Trust Center /trust; compliance evidence export; npm run test:security-smoke; ISO alignment pack updated. August 2026 rev. 5: Axiom security SIEM (direct SECURITY_EVENT ingest, BOLA/RLS/brute-force monitors, internal SIEM procedure). August 2026 rev. 6: RLS/HMAC/SSRF instrumentation; high-signal monitor; per-IP brute-force; BOLA monitor tuning. August 2026 Wave 1: MFA for Domain Admin; IDOR guard tests; Pro backup commitment documented; solo IR attestation. August 2026 rev. 7: Annex A A.8.8 / A.8.11 / A.8.21 Implemented — audit:deps CI, bug/error PII redaction, SMTP+IdP SSRF; ISO pack ownership column (App/Company/Mixed). August 2026 rev. 8: Foil Envie ISMS maximize pack signed; Annex A ~75 Implemented; security-tests CI + non-prod URL guard. August 2026 rev. 9: A.5.6 Implemented (SU Admin Security Watch, daily Action, Dependabot, signed subscriptions); A.8.23 Implemented (web-filter N/A + compensating); Annex A 77 Implemented / 3 Partial (A.5.20/31/35).

Contact: contact@fluxehra.ai

↑ Table of contents · ↑ Languages

Libro blanco de seguridad y cumplimiento

Plataforma SIRH multi-inquilino — Flex HR

Destinatarios: departamentos de TI, CISO, DPO, auditores

Versión del documento: agosto de 2026 (rev. 9) — A.5.6 Security Watch + A.8.23 N/A compensado; Anexo A 77 Implemented; residuales DPA / revisión independiente

1. Introducción

Este libro blanco describe las medidas de seguridad, gobernanza de accesos y protección de datos de Flex HR (SIRH multi-organización), dirigido a equipos de TI que evalúan datos RH sensibles.

Pack de alineación ISO (complemento, EN/FR): iso-alignment-fluxehra.html — no es una reclamación de certificación ISO.

Principio: el navegador no es de confianza; roles y operaciones sensibles se validan en el servidor o mediante RLS en PostgreSQL.

↑ Índice · ↑ Languages

2. Arquitectura técnica

Frontend: Next.js en Vercel. Backend: rutas API Next.js. Datos: Supabase (PostgreSQL, Auth, Storage). Modelo multi-inquilino con RLS. Datos bitemporales para historial de empleados.

↑ Índice · ↑ Languages

3. Alojamiento y ubicación de datos

Supabase: región del proyecto elegida al crearlo (p. ej. UE: Fráncfort, París) — determina ubicación principal. Clave anónima en cliente; service_role solo servidor.

Vercel: aplicación y API serverless; región configurable. Documentos grandes se suben directamente a Supabase Storage.

Recomendación: documentar regiones en el registro de tratamiento.

↑ Índice · ↑ Languages

4. Autenticación y sesiones

↑ Índice · ↑ Languages

5. Roles y control de acceso

RolDescripción
Super AdminAdministración global de la plataforma.
Org AdminAdministración de una organización.
Domain AdminAcceso por módulo vía role_permissions.
HRÁmbito geográfico opcional; autoservicio HR.
ManagerCadena jerárquica; autoservicio manager.
EmpleadoAutoservicio con visibilidad de campos configurable.

APIs servidor y middleware proxy.ts aplican el alcance organizacional. API en denegación por defecto: todas las rutas /api/* requieren sesión salvo lista blanca explícita.

↑ Índice · ↑ Languages

6. Aislamiento multi-inquilino y RLS

RLS en PostgreSQL como frontera principal. Cliente con JWT; service role solo tras autorización en servidor. Core HR (migración 20260606120000): políticas tenant-scoped en employees, employee_historical_data, organizations.

↑ Índice · ↑ Languages

7. Proxy / suplantación

JWT identifica siempre al usuario real. Sesiones proxy en servidor (proxy_sessions, 12 h). Revalidación continua en cada API protegida (proxy-api-guard.ts). Auditoría con registro servidor. No amplía privilegios más allá de RLS.

↑ Índice · ↑ Languages

8. Protección de datos y RGPD

Mecanismos técnicos (visibilidad, retención, cifrado, eliminación en cascada). Cumplimiento legal del responsable del tratamiento. Subencargados: Supabase y Vercel. Aviso de cookies.

↑ Índice · ↑ Languages

9. Visibilidad y retención

Matriz por campo: ninguno, lectura, edición, flujo de trabajo HR. Campos sensibles restringidos. El flag sensitive: true activa el cifrado en base al guardar (sección 10), no solo en interfaz. Política virtual para datos locales por país. Validación en autoservicio.

↑ Índice · ↑ Languages

10. Cifrado — campos sensibles en base de datos

HTTPS/HSTS en tránsito. Cifrado de infraestructura Supabase en reposo.

Cifrado aplicativo efectivo: los campos con sensitive: true no son solo de interfaz — se cifran antes del INSERT en PostgreSQL como ENC2:: (AES-256-GCM, IV aleatorio, tag de autenticación, clave derivada por scrypt de ENCRYPTION_KEY en servidor). Los valores antiguos ENC:: siguen siendo legibles (retrocompatibilidad).

Límites: solo campos marcados sensibles; documentos binarios usan Storage, no ENC2::.

↑ Índice · ↑ Languages

11. Claves API y secretos

Clave anónima (cliente), service role (servidor), ENCRYPTION_KEY, CRON_SECRET, hash de claves de integración, SMTP/Turnstile en configuración. Solo Super Admin modifica ajustes globales.

↑ Índice · ↑ Languages

12. Pista de auditoría

Tabla audit_logs, catálogo AUDIT_EVENTS, exportación CSV, vistas de página deduplicadas. Algunas escrituras Core HR aún sin auditoría completa.

↑ Índice · ↑ Languages

13. Almacenamiento documental

Bucket documents privado (sin lectura pública). Lecturas vía /api/documents/file/… con autorización por visibilidad de campo, árbol jerárquico e inscripciones Learning. Puerta de enlace Storage (lib/storage-ops.ts) + isUnsafeStoragePath (anti-traversal, %2e) y assertStoragePathUnderOrg. Subidas mediante URLs firmadas tras autorización. Foto (employee_picture) visible para miembros de la org (organigrama).

↑ Índice · ↑ Languages

14. Notificaciones e informes de errores

HTML sanitizado, SMTP TLS, cron protegido. Bugs manuales: escalado in-app HR → Org Admin → SU (sin correo). Errores automáticos de cliente: correo SMTP configurable. ISO A.8.11: redactSensitivePii en canales bug/error; CSV/API/SFTP/DSAR/UI autorizados siguen en claro tras descifrado.

↑ Índice · ↑ Languages

15. Cabeceras HTTP

CSP con nonce por petición (lib/csp.ts, aplicada en proxy.ts): en producción script-src no permite 'unsafe-inline' ni 'unsafe-eval' — nonce aleatorio + 'strict-dynamic'; style-src 'unsafe-inline' se mantiene como riesgo residual documentado. X-Powered-By suprimido. Además HSTS, X-Frame-Options, Permissions-Policy. ISO A.8.8: pestaña SU Admin Components Update + SLA + CI npm run audit:deps (falla en high/critical). Rate limiting global /api durable por usuario (tabla api_rate_limits; 600/3000 archivos/30 public_auth/120/60 req/min). Vercel Analytics / Speed Insights (CSP: vitals.vercel-insights.com). ISO A.8.21: protección SSRF en webhooks, OIDC/SAML, SFTP y SMTP (validación al guardar IdP). Reproductor SCORM endurecido. Regiones: Supabase eu-west-1 + Vercel dub1.

↑ Índice · ↑ Languages

16. Lista de verificación IT

  1. RLS activo (migración Core HR 20260606120000).
  2. Sin flags TLS inseguros en producción.
  3. Regiones eu-west-1 + dub1 documentadas.
  4. CRON_SECRET fuerte.
  5. Turnstile si aplica.
  6. Pruebas IDOR.
  7. Monitorizar 429 y 403 MFA_REQUIRED.
  8. MFA: TOTP en Supabase Dashboard; REQUIRE_MFA_FOR_PRIVILEGED_ROLES=true en Vercel; inscripción en /security/mfa.
  9. Política de contraseña: confirmar ≥ 20 + complejidad en la app y en Supabase Auth Dashboard.

↑ Índice · ↑ Languages

17. Brechas residuales

Reforzado recientemente (junio–agosto 2026, rev. 9): cabeceras HTTP; API deny-by-default; rate limit; RLS Core HR; MFA TOTP; cifrado AES-256-GCM; bucket documents privado; regiones eu-west-1 + dub1; Employee data request; pack ISO (columna ownership); DSAR y retención; SIEM Axiom; CI vulnerabilidades y SSRF SMTP/IdP; pack SMSI firmado; Security Watch (CERT-FR/CISA/OSV).

contact@fluxehra.ai

↑ Índice · ↑ Languages

Sicherheits- & Compliance-Whitepaper

Multi-Mandanten-HRIS-Plattform — Flex HR

Zielgruppe: IT-Abteilungen, CISO, DSB, Prüfer

Dokumentversion: August 2026 (Rev. 9) — A.5.6 Security Watch + A.8.23 N/A kompensiert; Anhang A 77 Implemented; Restlücken DPA / unabhängige Prüfung

1. Einleitung

Dieses Whitepaper beschreibt Sicherheits-, Zugriffs- und Datenschutzmaßnahmen von Flex HR (Multi-Organisations-HRIS) für IT-Teams mit sensiblen HR-Daten.

ISO-Alignment-Pack (Ergänzung, EN/FR): iso-alignment-fluxehra.html — keine ISO-Zertifizierungsbehauptung.

Prinzip: Der Browser ist nicht vertrauenswürdig; Rollen und sensible Operationen werden serverseitig oder per PostgreSQL-RLS unter dem Benutzer-JWT durchgesetzt.

↑ Inhaltsverzeichnis · ↑ Languages

2. Technische Architektur

Frontend: Next.js auf Vercel. Backend: Next.js-API-Routen. Daten: Supabase (PostgreSQL, Auth, Storage). Shared-Schema-Multi-Tenancy mit RLS. Bitemporale Mitarbeiterhistorie.

↑ Inhaltsverzeichnis · ↑ Languages

3. Hosting & Datenstandort

Supabase: Projektregion bei Erstellung wählbar (z. B. EU: Frankfurt, Paris) — bestimmt primären Speicherort. Anon-Key im Client; service_role nur serverseitig.

Vercel: Web-App und serverlose APIs; Region konfigurierbar. Große Dokumente direkt zu Supabase Storage.

Empfehlung: Regionen im Verarbeitungsverzeichnis dokumentieren.

↑ Inhaltsverzeichnis · ↑ Languages

4. Authentifizierung & Sitzungen

↑ Inhaltsverzeichnis · ↑ Languages

5. Rollen & Zugriffskontrolle

RolleBeschreibung
Super AdminGlobale Plattformverwaltung.
Org AdminVerwaltung einer Organisation.
Domain AdminModulzugriff über role_permissions.
HRGeografischer Scope; HR Self Service.
ManagerHierarchiekette; Manager Self Service.
MitarbeiterSelf Service mit Feldsichtbarkeit.

Server-APIs und Middleware proxy.ts erzwingen Organisationsumfang. Default-Deny-API: alle /api/*-Routen erfordern Session außer expliziter Allowlist.

↑ Inhaltsverzeichnis · ↑ Languages

6. Mandantenisolation & RLS

PostgreSQL-RLS als Hauptgrenze. Client mit JWT; Service Role nur nach Autorisierung. Core HR (Migration 20260606120000): mandantenspezifische Policies auf employees, employee_historical_data, organizations.

↑ Inhaltsverzeichnis · ↑ Languages

7. Proxy / Identitätswechsel

JWT identifiziert immer den echten Benutzer. proxy_sessions serverseitig (12 h TTL). Kontinuierliche Revalidierung bei jedem geschützten API-Aufruf (proxy-api-guard.ts). Audit über Serverdatensatz. Keine Rechte über RLS hinaus.

↑ Inhaltsverzeichnis · ↑ Languages

8. Datenschutz & DSGVO

Technische Mechanismen (Sichtbarkeit, Aufbewahrung, Verschlüsselung, Löschkaskade). Rechtliche Compliance beim Verantwortlichen. Auftragsverarbeiter: Supabase und Vercel. Cookie-Hinweis.

↑ Inhaltsverzeichnis · ↑ Languages

9. Feldsichtbarkeit & Aufbewahrung

Matrix pro Feld: none, view, edit, workflow. Sensible Felder eingeschränkt. sensitive: true löst DB-Verschlüsselung beim Speichern aus (Abschnitt 10), nicht nur UI. Virtuelle Local-Data-Policy. Self-Service-Validierung serverseitig.

↑ Inhaltsverzeichnis · ↑ Languages

10. Verschlüsselung — sensible Felder in der Datenbank

HTTPS/HSTS in Transit. Supabase-Infrastrukturverschlüsselung at rest.

Wirksame Anwendungsverschlüsselung: Felder mit sensitive: true werden vor dem PostgreSQL-INSERT als ENC2:: (AES-256-GCM, zufälliger IV, Auth-Tag, scrypt-abgeleiteter Schlüssel aus ENCRYPTION_KEY) gespeichert — nicht nur UI-Maskierung. Alte ENC::-Werte bleiben rückwärtskompatibel lesbar.

Grenzen: nur markierte Felder; Dokumente im Storage separat.

↑ Inhaltsverzeichnis · ↑ Languages

11. API-Schlüssel & Geheimnisse

Anon-Key (Client), Service Role (Server), ENCRYPTION_KEY, CRON_SECRET, Integrations-Key-Hashing, SMTP/Turnstile in Einstellungen. Globale Settings nur Super Admin.

↑ Inhaltsverzeichnis · ↑ Languages

12. Audit-Trail

Tabelle audit_logs, Katalog AUDIT_EVENTS, CSV-Export. Seitenaufrufe dedupliziert. Einige Core-HR-Schreibvorgänge noch nicht vollständig auditiert.

↑ Inhaltsverzeichnis · ↑ Languages

13. Dokumentenspeicher

Privater Supabase-Bucket documents. Lesezugriffe über /api/documents/file/… mit Feldsichtbarkeit und Learning-Enrollments. Storage-Gateway (lib/storage-ops.ts) + isUnsafeStoragePath und assertStoragePathUnderOrg. Uploads über signierte URLs. employee_picture für Org-Mitglieder sichtbar.

↑ Inhaltsverzeichnis · ↑ Languages

14. Benachrichtigungen & Fehlermeldungen

Sanitisiertes HTML, TLS-SMTP, geschützter Cron. Manuelle Bugs: In-App-Eskalation HR → Org Admin → SU (kein E-Mail). Automatische Client-Fehler: SMTP. ISO A.8.11: redactSensitivePii auf Bug-/Fehlerkanälen; autorisierte CSV/API/SFTP/DSAR/UI bleiben nach Entschlüsselung Klartext.

↑ Inhaltsverzeichnis · ↑ Languages

15. HTTP-Sicherheitsheader

Nonce-basierte CSP pro Request (lib/csp.ts, angewendet in proxy.ts): in Produktion erlaubt script-src weder 'unsafe-inline' noch 'unsafe-eval'. X-Powered-By unterdrückt. Dazu HSTS, X-Frame-Options, Permissions-Policy. ISO A.8.8: SU-Admin Components Update + SLA + CI npm run audit:deps (Fail bei high/critical). Globales /api-Rate-Limiting (600/3000 Dateien/30 public_auth/120/60 req/min). Vercel Analytics / Speed Insights (CSP: vitals.vercel-insights.com). ISO A.8.21: SSRF-Schutz für Webhooks, OIDC/SAML, SFTP und SMTP (Validierung beim IdP-Speichern). SCORM-Härtung. Regionen: eu-west-1 + dub1.

↑ Inhaltsverzeichnis · ↑ Languages

16. IT-Prüfliste

  1. RLS aktiv (Core-HR-Migration 20260606120000).
  2. Keine unsicheren TLS-Flags in Produktion.
  3. Regionen eu-west-1 + dub1 dokumentiert; Produktion https://fluxehra.ai.
  4. Starkes CRON_SECRET.
  5. Turnstile global (SU) und/oder pro Org (IT Link) bei Bedarf.
  6. IDOR-Tests.
  7. 429- und 403 MFA_REQUIRED-Monitoring.
  8. MFA: TOTP in Supabase Dashboard; REQUIRE_MFA_FOR_PRIVILEGED_ROLES=true auf Vercel; Registrierung unter /security/mfa und Step-up beim Login für aal2.
  9. Passwortrichtlinie: ≥ 20 + Komplexität in der App und im Supabase Auth Dashboard bestätigen.
  10. Supabase-Redirect-URLs mit https://fluxehra.ai/**.

↑ Inhaltsverzeichnis · ↑ Languages

17. Verbleibende Lücken

Kürzlich verstärkt (Juni–August 2026, Rev. 9): HTTP-Sicherheitsheader; Default-Deny-API; Rate-Limiting; Core-HR-RLS; MFA TOTP; AES-256-GCM; privater Documents-Bucket; Region eu-west-1 + dub1; Employee data request; ISO-Pack (Ownership-Spalte); DSAR und Retention; Axiom-SIEM; CI-Vulnerabilities und SMTP/IdP-SSRF; signiertes ISMS-Pack; Security Watch (CERT-FR/CISA/OSV).

contact@fluxehra.ai

↑ Inhaltsverzeichnis · ↑ Languages