Journal d'audit¶
Toute action sensible (création / suppression / élévation de
privilèges, ajout d'un connecteur cloud, changement de licence,
configuration OIDC, suppression de compte…) est tracée dans la
table audit_logs et consultable via /admin/audit.
Champs enregistrés¶
| Champ | Contenu |
|---|---|
id |
identifiant interne (auto-incrément) |
created_at |
timestamp UTC |
actor_user_id |
utilisateur ayant exécuté l'action (ou null = système) |
actor_ip |
IP source (depuis X-Forwarded-For derrière le proxy) |
action |
code action — ex. user.create, org.delete, oauth.attach, license.activate |
target_type |
type de l'objet ciblé (user, org, cloud_connection…) |
target_id |
identifiant de l'objet ciblé |
metadata |
JSON libre (ex. {"old_role": "member", "new_role": "admin"}) |
Pseudonymisation : aucun email, aucun contenu de requête RAG
n'est stocké dans le journal. Seuls les user_id numériques sont
conservés. Voir app/utils/logger.py.
Recherche & filtres¶
/admin/audit propose :
- Filtre par action (autocomplete)
- Filtre par utilisateur (id ou email — résolu en id à l'envoi)
- Plage de dates
- Export CSV (limité à 10 000 lignes par export)
Archivage off-host¶
Le cron archive_audit_log (dimanche 03:30 UTC) archive les
entrées > 180 jours vers un bucket S3 (chiffré côté serveur,
classe Glacier IR ou équivalent). Les lignes archivées sont
ensuite supprimées de la table principale pour limiter la
croissance.
Configuration via .env :
AUDIT_S3_BUCKET=myeline-audit-archive
AUDIT_S3_ENDPOINT=https://s3.fr-par.scw.cloud
AUDIT_S3_ACCESS_KEY=…
AUDIT_S3_SECRET_KEY=…
AUDIT_S3_RETENTION_DAYS=180 # défaut : 180
Sans AUDIT_S3_BUCKET, le cron est no-op (aucune perte de données,
juste pas d'archivage). En souverain pur, pointer vers un MinIO
interne plutôt qu'un S3 cloud.
Durée légale de conservation¶
13 mois côté actif + archive jusqu'à 5 ans pour les actions liées
à des données personnelles (RGPD, art. 30 — registre des
traitements). Adapter AUDIT_S3_RETENTION_DAYS au-delà selon votre
politique interne.