Log d'audit - SocialGouv/egapro GitHub Wiki

Logs d'audit

Les logs d'audit sont stockés dans la table audit.action_log (PostgreSQL, schéma dédié audit).

Colonnes stockées

Colonne Type Description
id varchar(255) Identifiant unique de l'entrée
created_at timestamptz Horodatage de l'action
user_id varchar(255) ID utilisateur (session)
user_email varchar(255) Email utilisateur
siren varchar(9) SIREN de l'entreprise concernée
action varchar(100) Clé d'action (AUDIT_ACTIONS.*)
category varchar(20) read_sensitive, auth, mutation, export, system
resource_type varchar(50) Type de ressource (ex: declaration, cse_opinion)
resource_id varchar(255) ID de la ressource ciblée
status varchar(20) success / failure
error_message text Message d'erreur (si échec)
metadata jsonb Contexte métier libre (year, fileName…) — secrets auto-strippés
ip_address varchar(45) IP source (colonne dédiée, jamais dans metadata)
user_agent text User-Agent HTTP
duration_ms integer Durée de l'action

Durées de rétention (conformité CNIL)

Catégorie Rétention Usage
read_sensitive 180 jours Lectures sensibles (données GIP, PDF, PII) — gros volume, contient IP
auth 365 jours Login, logout, échecs de connexion
mutation 365 jours Toute écriture de données métier
export 365 jours Exports de données et API tierces
system 365 jours Actions cron / admin

La purge est appliquée par le cron cleanup.ts via la route /api/audit/cleanup. Clés automatiquement supprimées du metadata : password, token, refresh_token, secret, client_secret, authorization, apikey, api_key, accesskey, access_key, private_key.

Conforme ✅

Règle CNIL Implémentation egapro
Durée standard 6 mois pour logs d'accès read_sensitive = 180 jours ✅
Jusqu'à 12 mois si justification sécurité auth, mutation, export, system = 365 jours ✅ (justifié : traçabilité conformité égalité pro)
Purge automatique obligatoire Cron /api/audit/cleanupcleanupAuditLogs
Minimisation des données Sanitizer strip les secrets du metadata
Sécurité des logs (accès restreint) Schéma audit séparé en base ✅

Points à vérifier ⚠️

  1. Information des utilisateurs (RGPD art. 13) : la politique de confidentialité / mentions légales doivent mentionner explicitement la journalisation, les durées, et la finalité. → À vérifier dans les pages /mentions-legales et /politique-confidentialite.

  2. Registre des traitements : l'activité de journalisation doit figurer dans le registre RGPD de la DGT/DSS.

  3. Accès aux logs tracé : la CNIL recommande que la consultation des logs soit elle-même journalisée. Actuellement il n'y a pas d'interface de consultation interne → neutre pour le moment, mais à prévoir si une UI admin est ajoutée.

  4. IP = donnée personnelle : conserver une IP 365 jours pour un mutation est dans la limite haute. La justification (preuve de dépôt de déclaration réglementaire) est solide, mais doit être documentée dans l'AIPD si une analyse d'impact existe.

  5. Droit d'accès / effacement : un utilisateur peut demander l'accès à ses logs. Il n'y a pas actuellement de procédure outillée → à traiter manuellement via DPO.