Politique · sécurité

Posture de sécurité

Cette page liste les contrôles techniques en place sur AuditRail. Mise à jour 2026-05-19, alignée avec l'audit interne complet shipé la même semaine (≈68 findings traités sur 76 catalogués).

Transport et entête

  • TLS 1.2+ partout, HSTS preload

    2 ans, includeSubDomains, preload listé.

  • CSP nonce + strict-dynamic

    Pas d'unsafe-inline ; chaque requête a un nonce unique.

  • Permissions-Policy explicite

    34 directives, accès aux API navigateur scopé à (self) ou ()

  • Origin-Agent-Cluster, COOP, CORP, X-Frame DENY, X-Content-Type nosniff

    Isolation process-level.

Authentification

  • Better Auth + Magic-link + Passkey + TOTP 2FA

    Liens magiques 15 min, single-use, page interstitielle anti-link-preview-bot.

  • Cookie __Host- en production

    Forcé à Path=/, sans Domain, Secure obligatoire.

  • Step-up auth (≤5 min) sur toute mutation Owner

    Garde de régression au build (test CI).

  • Trusted-device avec fingerprint UA

    Famille navigateur + OS comparés au consume time ; mismatch journalisé.

  • Rate-limit distribué Upstash

    Per-IP read 120/min, write 60/min, magic-link 5/15min/IP + 3/h/email, 2FA 10/min/IP.

Isolation multi-tenant

  • org_id obligatoire sur chaque table tenant

    NOT NULL + indexé. Application enforce WHERE org_id = $1.

  • Pas de fallback silencieux

    Une session sans org_id renvoie 403 ; suspension d'org vérifiée à chaque requête.

  • Contraintes UNIQUE org-scoped

    (org_id, code) sur les sites audités ; (org_id, email) sur allowed_users.

  • Validation des FK cross-tenant

    Chaque identifiant cross-table (audit, anomalie, site, photo) est vérifié contre le tenant courant.

Audit et tamper-evidence

  • audit_events avec chaîne de hash SHA-256

    Trigger BEFORE INSERT + advisory lock anti-fork. verify_audit_chain() exposé.

  • REVOKE DELETE/UPDATE sur le rôle applicatif

    Le rôle Neon ne peut ni effacer ni modifier l'audit log.

  • Coverage

    Toute mutation sensible (auth, admin, billing, RGPD, dispatch) journalisée avec actor + IP-hash + UA.

Données et RGPD

  • Endpoints DSR self-service

    GET /api/me/export (Art. 15/20), PATCH /api/me (Art. 16), DELETE /api/me (Art. 17), POST /api/me/restrict (Art. 18).

  • Rétention bornée

    180 j login_events, 24 mois audit_events + logs email, 7 j IP/UA session — 5 crons quotidiens.

  • EXIF strip

    Photos uploadées réécrites sans métadonnées sous 24 h ; copies PDF aussi.

  • Sous-traitants

    Hébergement UE (Vercel cdg1, Neon EU, R2 EU). Resend, Stripe, Anthropic sous EU-US DPF + DPA Art. 28.

  • Anthropic opt-in

    Résumés de questionnaire désactivés par défaut, anonymisés (ni code ni nom de site transmis).

Infra et chaîne d'approvisionnement

  • Région unique cdg1 (Paris, UE)

    Pas de réplication hors-UE.

  • Dependabot hebdomadaire

    Groupé par écosystème ; npm audit moderate-level en CI.

  • CI permissions read-only par défaut

    Aucune action ne peut écrire sans demande explicite.

  • Service Worker NetworkOnly pour HTML+API

    Pas de fuite cross-utilisateur sur tablette partagée.

  • Preview deployments gated

    Vercel SSO + middleware refuse *.vercel.app hors prod.

Observabilité

  • Panneau /admin/security temps réel

    Score de posture 0-100, 22 checks, heatmap RLS, flux audit_events, sessions actives, vérification de chaîne.

  • Redaction de logs

    Helper safe-log masque emails, IP, secrets dans console.error/warn.

  • Documentation publique

    Threat model, triage, compliance, pentest checklist — tous dans docs/security/.

Responsible disclosure

Vous avez trouvé une vulnérabilité ? Écrivez-nous à security@auditrail.app. Un humain lit la boîte sous 48h. Triage sous 5 jours ouvrés, divulgation coordonnée à 90 jours par défaut.

Périmètre complet et règles d'engagement : SECURITY.md (GitHub) ou security.txt.

Récompenses

SévéritéMontant (EUR)Exemples
CRITICAL1 500 – 3 000Cross-tenant read/write, RCE, full auth bypass.
HIGH500 – 1 500Escalade dans un tenant, Owner bypass, Stripe forgery.
MEDIUM100 – 500Stored XSS bypassant la CSP, IDOR tenant-scope, session binding.
LOW50 – 100Hardening, informational, headers manquants avec impact réel.

Remerciements

Aucun rapport accepté à ce jour. Les contributeurs accepteront d'être listés ici (handle ou anonyme, au choix) au fil des soumissions.