Skip to content

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 table

Audit 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énementOutilDescription
PAYMENT_COMPLETED#15Paiement KKiaPay réussi
SUBSCRIBER_CREATED#11Nouvelle inscription
VOUCHER_USED#20Voucher activé
APDP_ANONYMIZATION#78Suppression données APDP
INVOICE_GENERATED#24Facture PDF créée
INCIDENT_CREATED#58Incident P0/P1/P2 ouvert
ADMIN_ACTION#48Action 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

PROJET MOSAÏQUE — 81 outils, 22 conteneurs, 500+ revendeurs WiFi Zone