PD-31 — Expression de besoin¶
Audit Log des Authentifications¶
Story : PD-31 Epic : PD-182 (AUTH) Projet : ProbatioVault-backend Version : 1.0 Date : 2026-02-15
1. Contexte¶
ProbatioVault est une infrastructure de preuve numérique souveraine fondée sur : - Un modèle Zero-Knowledge (SRP-6a, dérivations locales) - Une séparation forte des responsabilités (Backend / HSM / Stockage) - Un journal append-only probatoire - Un ancrage périodique (Merkle + TSA + blockchain)
L'authentification constitue le point d'entrée critique de la plateforme. Toute opération d'accès doit être traçable, horodatée et auditée, conformément : - Aux exigences d'auditabilité (architecture technique) - Aux exigences probatoires (journal immuable + ancrage périodique — Preuve Composite) - Aux normes de conformité (RGPD, NF Z42-013, ISO 14641)
2. Problème à résoudre¶
Aujourd'hui : Les événements d'authentification ne sont pas systématiquement journalisés de manière probatoire. En cas de litige, d'audit sécurité ou d'expertise judiciaire, il est impossible de : - Prouver qu'un utilisateur s'est connecté à une date précise - Démontrer qu'une tentative d'accès non autorisée a eu lieu - Fournir des preuves d'existence antérieure des logs
Demain : Chaque événement d'authentification sera intégré dans le cycle probatoire complet, permettant une opposabilité juridique.
3. Objectifs¶
3.1 Objectif principal¶
Garantir que toutes les opérations d'authentification soient : 1. Enregistrées de manière exhaustive 2. Horodatées avec précision UTC 3. Associées à des métadonnées contextuelles (IP, device, geoloc) 4. Intégrées dans le journal append-only 5. Incluses dans le batch Merkle périodique 6. Ancrées via TSA + blockchain 7. Exploitables pour audit, investigation ou production judiciaire
3.2 Objectifs secondaires¶
- Alerting temps réel : Détecter et signaler les patterns anormaux (bruteforce, geo-hopping)
- Scoring de risque : Attribuer un score de risque à chaque événement
- Preuve d'alerte : Les alertes elles-mêmes doivent être intégrées au cycle probatoire
4. Périmètre fonctionnel¶
4.1 Événements à journaliser¶
| Événement | Code | Description |
|---|---|---|
| Login réussi | AUTH_LOGIN_SUCCESS | Connexion utilisateur validée |
| Login échoué | AUTH_LOGIN_FAILURE | Tentative de connexion rejetée |
| Logout | AUTH_LOGOUT | Déconnexion volontaire |
| MFA tentative | AUTH_MFA_ATTEMPT | Initiation d'une vérification MFA |
| MFA réussi | AUTH_MFA_SUCCESS | Code MFA validé |
| MFA échoué | AUTH_MFA_FAILURE | Code MFA rejeté |
| Refus device révoqué | AUTH_DEVICE_REVOKED | Accès refusé : device blacklisté |
| Refus token invalide | AUTH_TOKEN_INVALID | Accès refusé : JWT expiré/invalide |
4.2 Canaux couverts¶
| Canal | Identifiant | Spécificités |
|---|---|---|
| App iOS | ios | Device ID via Keychain, biométrie |
| PWA | pwa | Browser fingerprint, WebAuthn |
| API B2B | api | API Key, IP fixe entreprise |
4.3 Métadonnées à collecter¶
| Champ | Type | Description | Obligatoire |
|---|---|---|---|
event_id | UUID v7 | Identifiant unique monotonique | Oui |
event_type | Enum | Code de l'événement (voir 4.1) | Oui |
timestamp | ISO-8601 | Horodatage UTC | Oui |
user_id | UUID | Identifiant utilisateur interne | Oui* |
identity_level | Enum | email / oidc / enterprise | Oui* |
device_id | UUID | Identifiant device si disponible | Non |
channel | Enum | ios / pwa / api | Oui |
ip_address | String | IPv4 ou IPv6 | Oui |
user_agent | String | User-Agent complet | Oui |
geo_country | ISO 3166-1 | Code pays (FR, US, etc.) | Oui |
geo_region | String | Région/État | Non |
success | Boolean | Résultat de l'opération | Oui |
failure_reason | Enum | Code erreur si échec | Conditionnel |
session_id | UUID | Identifiant session JWT | Conditionnel |
correlation_id | UUID | Traçabilité inter-services | Oui |
risk_score | Float 0-1 | Score de risque calculé | Oui |
*Peut être absent pour tentatives sur identifiant inconnu
4.4 Données exclues (Zero-Knowledge)¶
Les logs ne doivent JAMAIS contenir : - Mot de passe (hashé ou non) - Secret MFA (TOTP seed, recovery codes) - Clés cryptographiques - Données personnelles non nécessaires (principe de minimisation RGPD)
5. Contraintes¶
5.1 Immutabilité (NON NÉGOCIABLE)¶
| Contrainte | Description |
|---|---|
| Append-only | Aucune modification ni suppression |
| Horodatage | UTC + millisecondes |
| Intégrité | Hash SHA-3-256 par événement |
| Chaînage | Hash(N) inclut Hash(N-1) |
| Ancrage | Intégration batch Merkle périodique |
5.2 Architecture probatoire¶
Événement Auth
↓
Journal append-only (PostgreSQL + triggers)
↓
Batch Merkle (toutes les 10 min ou 1000 événements)
↓
TSA (horodatage certifié)
↓
Blockchain (ancrage public)
↓
Preuve Composite vérifiable
5.3 Rétention¶
| Durée | Stockage | Usage |
|---|---|---|
| 3 ans | PostgreSQL (hot) | Accès opérationnel rapide |
| 10 ans | S3 Glacier (cold) | Archivage légal |
Migration automatique après 3 ans vers cold storage.
5.4 Performance¶
| Métrique | Cible |
|---|---|
| Latence insertion | < 5 ms (P99) |
| Throughput | > 1000 evt/s |
| Impact sur auth | < 1 ms overhead |
L'insertion dans le journal ne doit JAMAIS bloquer le flow d'authentification (async + queue).
5.5 Confidentialité¶
- Logs accessibles uniquement aux rôles
ADMINetAUDITOR - Chiffrement at-rest (AES-256)
- Chiffrement in-transit (TLS 1.3)
- Respect séparation Zero-Knowledge
6. Alerting temps réel¶
6.1 Patterns à détecter¶
| Pattern | Description | Seuil par défaut |
|---|---|---|
| Bruteforce | Échecs répétés sur même user_id | > 5 en 5 min |
| Credential stuffing | Échecs depuis même IP, users différents | > 10 en 1 min |
| Geo-hopping | Connexions depuis pays différents | < 2h entre pays |
| Device anomaly | Nouveau device + échec | Immédiat |
| Token spray | Tentatives token invalide | > 20 en 1 min |
6.2 Caractéristiques¶
- Configurables : Seuils modifiables sans redéploiement
- Scoring : Chaque alerte contribue au
risk_scorede l'événement - Journalisées : Les alertes sont elles-mêmes des événements probatoires
- Intégrées : Incluses dans le cycle d'ancrage Merkle
6.3 Actions¶
| Niveau | Action |
|---|---|
| INFO | Log uniquement |
| WARNING | Notification admin |
| CRITICAL | Notification + blocage temporaire compte |
7. Export judiciaire¶
7.1 Format Preuve ProbatioVault¶
L'export pour expertise judiciaire doit inclure :
- Sous-ensemble des logs demandés (filtré par date, user, etc.)
- Merkle path correspondant (preuve d'inclusion)
- Merkle root ancré
- Jeton TSA (horodatage certifié)
- Transaction blockchain (preuve d'ancrage public)
- Métadonnées du batch d'ancrage
7.2 Garanties¶
L'export prouve : - Les logs existaient à la date T (antériorité) - Ils n'ont pas été modifiés depuis (intégrité) - Ils faisaient partie d'un ensemble cohérent (batch) - Cet ensemble a été figé cryptographiquement (Merkle) - Ce figement est ancré via tiers de confiance (TSA + blockchain)
8. Hors périmètre¶
Les éléments suivants sont explicitement exclus de cette story :
- Dashboard de visualisation des logs (story dédiée)
- Analytics temps réel (Grafana, Prometheus)
- Intégration SIEM externe (Splunk, ELK)
- Notifications push utilisateur
- Rapport PDF certifié automatique
9. Critères de succès¶
| # | Critère | Mesurable |
|---|---|---|
| 1 | 100% des événements auth sont journalisés | Count(events) = Count(auth_requests) |
| 2 | Latence insertion < 5ms P99 | Metrics Prometheus |
| 3 | Intégrité vérifiable par Merkle path | Test de vérification |
| 4 | Alertes déclenchées en < 1s | Test de bruteforce |
| 5 | Export judiciaire complet et vérifiable | Test de vérification end-to-end |
| 6 | Rétention 10 ans respectée | Policy Glacier configurée |
| 7 | Zero données sensibles dans les logs | Audit RGPD |
10. Dépendances¶
| Dépendance | Story | Statut |
|---|---|---|
| Journal append-only | PD-37 | DONE |
| Batch Merkle | PD-39 | DONE |
| Ancrage TSA | PD-39 | DONE |
| Ancrage blockchain | PD-40 | DONE |
| Auth SRP-6a | PD-24/25 | DONE |
| Session management | PD-28 | DONE |
11. Risques identifiés¶
| Risque | Impact | Mitigation |
|---|---|---|
| Volume logs élevé | Coût stockage | Compression + tiering S3 |
| Latence géolocalisation | Impact perf | Cache GeoIP + async |
| Faux positifs alerting | Fatigue opérateur | Scoring + tuning |
| RGPD violation | Légal | Audit minimisation |
Validation PO¶
Date : 2026-02-15 Statut : En attente validation
Document généré dans le cadre du workflow de gouvernance ProbatioVault.