Audit Trail
Traçabilité de toutes les actions dans le système RGZ.
Logs Immutables (Outil #45)
Chaque action sensible est enregistrée dans la table immutable_logs avec une chaîne SHA-256. Cette table est en append-only — jamais de UPDATE ou DELETE.
sql
CREATE TABLE immutable_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
event_type TEXT NOT NULL,
data JSONB NOT NULL,
sha256_hash TEXT NOT NULL,
prev_hash TEXT,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Jamais de UPDATE/DELETE sur cette tableAudit Trail Middleware (Outil #48)
Chaque requête API est automatiquement loggée :
python
# app/middleware/audit.py — FastAPI middleware
# Enregistre: request_id, user_id, action, resource_type, ip, method, path,
# status_code, duration_ms, timestamp
# Exclut: GET /health, GET /metrics (trop verbeux)Événements Tracés
| Événement | Outil | Description |
|---|---|---|
PAYMENT_COMPLETED | #15 | Paiement KKiaPay réussi |
SUBSCRIBER_CREATED | #11 | Nouvelle inscription |
VOUCHER_USED | #20 | Voucher activé |
APDP_ANONYMIZATION | #78 | Suppression données APDP |
INVOICE_GENERATED | #24 | Facture PDF créée |
INCIDENT_CREATED | #58 | Incident P0/P1/P2 ouvert |
ADMIN_ACTION | #48 | Action admin (validation, rejet) |
Consultation Audit
bash
# Via API (admin JWT requis)
curl -H "Authorization: Bearer $JWT" \
"https://api-rgz.duckdns.org/api/v1/audit-trail?resource_id={id}&start=2026-02-01&end=2026-02-21"
# Via DB directement
docker exec rgz-db psql -U rgz_admin -c \
"SELECT created_at, event_type, data->>'subscriber_id'
FROM immutable_logs
WHERE event_type = 'APDP_ANONYMIZATION'
ORDER BY created_at DESC LIMIT 10;"
# Vérifier l'intégrité de la chaîne
GET /api/v1/logs/verify/{log_id} → {"valid": true}Rétention
- 12 mois minimum (obligation ARCEP Bénin)
- Partitionnement Elasticsearch par mois (
rgz-radius-2026.02, etc.) - ILM (Index Lifecycle Management) configuré dans Kibana
Dernière mise à jour: 2026-02-21