Analyser les logs Auth0 : patterns, requêtes et détection d'anomalies
Comment analyser efficacement les logs Auth0 ? Requêtes Lucene, export vers BigQuery/Splunk et patterns d'analyse pour la sécurité et le business.
Par Auth0.Expert · 2025-05-05 · 10 min de lecture
Analyser les logs Auth0 : guide complet
TL;DR
Les logs Auth0 contiennent des informations précieuses : sécurité, comportement utilisateur, performance des Actions. Ce guide présente les patterns d'analyse les plus utiles avec des requêtes prêtes à l'emploi.
---
Types de logs Auth0 importants
Ce dictionnaire recense les principaux types de logs générés par Auth0, pour comprendre la signification des codes lors de l'analyse.
LOG_TYPES = {
# Authentication
"s": "Success Login",
"f": "Failed Login",
"fp": "Wrong Password",
"fu": "User Not Found",
"frd": "Rule/Action Rejected",
"limit_wc": "Too Many Attempts",
# Sessions
"slo": "Single Log Out",
"ss": "Sign Up Success",
"ssa": "Sign Up Failure",
# Password
"pwd_leak": "Breached Password",
"scp": "Change Password",
# MFA
"gd_start_auth": "MFA Started",
"gd_auth_succeed": "MFA Success",
"gd_auth_failed": "MFA Failed",
# M2M
"sce": "Client Credentials Exchange",
"fce": "Failed Client Credentials",
# API
"mgmt_api_operation": "Management API Operation",
}
---
Requêtes Lucene pour le dashboard Auth0
Voici des exemples de filtres Lucene permettant d'extraire rapidement les événements importants dans le dashboard Auth0.
# Connexions depuis un pays spécifique
type:s AND _exists_:location_info.country_code AND location_info.country_code:"FR"
# Toutes les erreurs des 24 dernières heures
type:f AND date:[now-24h TO *]
# Pic d'erreurs pour un utilisateur
user_name:"[email protected]" AND type:(f OR fp OR fu)
# Actions ayant généré des erreurs
type:frd AND date:[now-7d TO *]
# Mots de passe compromis
type:pwd_leak
# Connexions depuis Tor
ip_metadata.tor:true
# Tous les logins admin
user_name:*@yourcompany.com AND type:s
# M2M exchanges pour un client spécifique
type:sce AND client_id:"CLIENT_ID_HERE"
# Erreurs de validation JWT
type:(fcoa OR fui)
---
Export vers BigQuery : analyse à grande échelle
Ce pipeline exporte les logs Auth0 vers BigQuery pour permettre des analyses à grande échelle, via un process typique utilisant Pub/Sub et des webhooks.
# Pipeline : Auth0 → Pub/Sub → BigQuery
# (via Log Streaming → HTTP webhook → votre pipeline)
import json
from google.cloud import bigquery
BQ_DATASET = "auth0_logs"
BQ_TABLE = "events"
client = bigquery.Client()
table_ref = client.dataset(BQ_DATASET).table(BQ_TABLE)
def process_auth0_event(event: dict):
"""Transformer un event Auth0 pour BigQuery."""
return {
"event_id": event.get("_id"),
"timestamp": event.get("date"),
"type": event.get("type"),
"user_id": event.get("user_id"),
"user_name": event.get("user_name"),
"ip": event.get("ip"),
"country_code": event.get("location_info", {}).get("country_code"),
"country_name": event.get("location_info", {}).get("country_name"),
"city": event.get("location_info", {}).get("city_name"),
"client_id": event.get("client_id"),
"client_name": event.get("client_name"),
"connection": event.get("connection"),
"user_agent": event.get("user_agent"),
"is_mobile": "Mobile" in event.get("user_agent", ""),
"is_tor": event.get("ip_metadata", {}).get("is_tor", False),
"error_code": event.get("code"),
"error_description": event.get("description"),
}
Ce code reçoit un événement Auth0, le transforme et le structure pour l'insérer dans une table BigQuery, facilitant ainsi son exploitation analytique.
---
Requêtes BigQuery pour l'analyse
Ces requêtes SQL permettent d’extraire des insights directement à partir des logs stockés dans BigQuery, par exemple pour mesurer l'activité ou détecter des anomalies.
-- 1. Top 10 pays par volume de logins (30 derniers jours)
SELECT
country_name,
country_code,
COUNT(*) as total_attempts,
COUNTIF(type = 's') as successes,
COUNTIF(type = 'f') as failures,
ROUND(100 * COUNTIF(type = 's') / COUNT(*), 1) as success_rate_pct
FROM `project.auth0_logs.events`
WHERE DATE(timestamp) >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
GROUP BY 1, 2
ORDER BY total_attempts DESC
LIMIT 10;
-- 2. Tendance quotidienne des signups
SELECT
DATE(timestamp) as date,
COUNT(*) as new_signups,
COUNTIF(connection = 'google-oauth2') as via_google,
COUNTIF(connection = 'Username-Password-Authentication') as via_password
FROM `project.auth0_logs.events`
WHERE type = 'ss'
AND DATE(timestamp) >= DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY)
GROUP BY 1
ORDER BY 1;
-- 3. Détection d'anomalies : IPs avec beaucoup d'échecs
WITH ip_stats AS (
SELECT
ip,
COUNT(*) as total_attempts,
COUNTIF(type = 'f') as failures,
COUNT(DISTINCT user_name) as unique_users_attempted,
DATE(MIN(timestamp)) as first_seen
FROM `project.auth0_logs.events`
WHERE DATE(timestamp) = CURRENT_DATE()
GROUP BY ip
)
SELECT *,
ROUND(100 * failures / total_attempts, 1) as failure_rate_pct
FROM ip_stats
WHERE total_attempts > 20 AND failures / total_attempts > 0.7
ORDER BY total_attempts DESC;
-- 4. Utilisateurs les plus actifs (potentiel: bots ou power users)
SELECT
user_name,
COUNT(*) as login_count,
COUNT(DISTINCT DATE(timestamp)) as active_days,
COUNT(DISTINCT ip) as distinct_ips
FROM `project.auth0_logs.events`
WHERE type = 's'
AND DATE(timestamp) >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)
GROUP BY 1
ORDER BY login_count DESC
LIMIT 20;
Ces quatre requêtes illustrent comment extraire des statistiques d'usage, suivre la croissance, identifier des comportements suspects, ou isoler les utilisateurs avec une activité inhabituelle.
---
Pattern de détection : credential stuffing
Cette requête détecte un schéma d’attaque “credential stuffing” en repérant de nombreux échecs de connexion répartis sur beaucoup d’IPs, chacune effectuant peu de tentatives.
-- Détection signature credential stuffing :
-- Beaucoup d'IPs différentes, chacune avec peu de tentatives
WITH hourly_stats AS (
SELECT
TIMESTAMP_TRUNC(timestamp, HOUR) as hour,
COUNT(DISTINCT ip) as unique_ips,
COUNT(*) as total_attempts,
COUNTIF(type = 'f') as failures,
AVG(COUNT(*)) OVER (PARTITION BY ip) as avg_per_ip
FROM `project.auth0_logs.events`
WHERE DATE(timestamp) = CURRENT_DATE()
GROUP BY hour, ip
)
SELECT
hour,
COUNT(*) as involved_ips,
SUM(total_attempts) as total_attempts,
AVG(total_attempts) as avg_attempts_per_ip,
'Possible credential stuffing' as alert
FROM hourly_stats
WHERE failures / total_attempts > 0.8 -- 80%+ d'échecs
AND avg_per_ip < 5 -- Chaque IP n'essaie que 1-4 fois (distribué)
HAVING COUNT(*) > 100 -- Plus de 100 IPs impliquées
GROUP BY hour;
Ce pattern permet d’automatiser la détection en quasi temps réel de tentatives d’attaque par injection massive d’identifiants.
---
Dashboard business : métriques produit
Ce code extrait des KPIs business pertinents (DAU, signups, adoption Google/Enterprise, taux de succès) directement depuis les logs Auth0, idéal pour piloter un produit SaaS sécurisé.
# KPIs produit extraits des logs Auth0
async def get_product_kpis(start_date: str, end_date: str) -> dict:
logs = await bigquery_query(f"""
SELECT
DATE(timestamp) as date,
COUNT(DISTINCT CASE WHEN type = 's' THEN user_id END) as dau,
COUNT(DISTINCT CASE WHEN type = 'ss' THEN user_id END) as new_signups,
COUNTIF(type = 's' AND connection = 'google-oauth2') as google_logins,
COUNTIF(type = 's' AND connection LIKE '%waad%') as enterprise_logins,
COUNTIF(type = 's') / NULLIF(COUNTIF(type IN ('s', 'f')), 0) as login_success_rate
FROM auth0_logs.events
WHERE DATE(timestamp) BETWEEN '{start_date}' AND '{end_date}'
GROUP BY 1
ORDER BY 1
""")
return {
"dau_avg": sum(r['dau'] for r in logs) / len(logs),
"total_signups": sum(r['new_signups'] for r in logs),
"google_adoption": sum(r['google_logins'] for r in logs) / sum(r['dau'] for r in logs),
"enterprise_adoption": sum(r['enterprise_logins'] for r in logs) / sum(r['dau'] for r in logs),
"login_success_rate": sum(r['login_success_rate'] for r in logs) / len(logs),
}
Ce bloc permet d'obtenir les métriques business clés sur la base des logs d'authentification et de création de compte.
---
> 📊 Analyse des logs Auth0 : nous mettons en place votre pipeline d'analyse (BigQuery/Snowflake/Splunk) avec dashboards métier et alertes sécurité en 1 semaine.
Autres articles
- Auth0 et OAuth 2.0 : architecture complète pour comprendre les flux d'autorisation
- OpenID Connect sur Auth0 : ID Token, UserInfo et discovery endpoint expliqués
- Configurer SAML 2.0 avec Auth0 : guide complet pour l'entreprise
- Migrer des Rules vers les Auth0 Actions : guide pas à pas
- Architecture multi-tenant avec Auth0 : organisations, isolation et bonnes pratiques
- Validation des JWT Auth0 : RS256 vs HS256, JWKS et pièges communs
- Concevoir son architecture de tenants Auth0 : dev, staging, prod
- Configurer un domaine personnalisé Auth0 : login.votredomaine.com étape par étape