Audit trails et SOC 2 avec Auth0 : logging, monitoring et preuves de conformité
Implémentez des audit trails complets pour votre certification SOC 2 Type II avec Auth0 : log streaming, alerting, et génération de preuves automatisée.
Par Auth0.Expert · 2025-05-26 · 13 min de lecture
Audit trails et SOC 2 avec Auth0
TL;DR
Auth0 est lui-même SOC 2 Type II certifié. Pour votre propre certification SOC 2, utilisez Auth0 Log Streaming pour alimenter votre SIEM et générer des preuves automatisées pour vos auditeurs.
Points de douleur
- CC6 (Logical Access) : prouver que seuls les utilisateurs autorisés accèdent aux systèmes
- CC7 (System Operations) : monitoring et détection d'anomalies
- A1 (Availability) : uptime et incidents Auth0
- Comment générer des preuves rapidement pour les auditeurs ?
- Alertes sur les événements de sécurité critiques
Architecture d'audit avec Auth0
Voici un schéma simplifié de l’architecture type pour collecter et conserver les logs Auth0 dans une démarche SOC 2. Cette architecture facilite la surveillance, l’alerte et la génération automatique de preuves.
Auth0 Logs
│
▼
Log Streaming ──────────────────────────────────────┐
│ │
├──▶ Datadog SIEM │
│ - Dashboards SOC2 │
│ - Alertes automatiques │
│ - Rétention 13 mois │
│ │
├──▶ Splunk / Elastic SIEM │
│ - Corrélation événements │
│ - Rapports auditeurs │
│ │
└──▶ S3 / GCS Archive │
- Rétention long terme (3 ans) │
- Preuve d'immuabilité │
Configuration Log Streaming
Ce code configure un Log Stream Auth0 vers Datadog, ce qui permet d'envoyer automatiquement tous les événements de sécurité critiques pertinents pour SOC 2 vers votre SIEM.
// Auth0 Log Stream vers Datadog (recommandé SOC2)
const logStreamConfig = {
name: "SOC2-Datadog-Stream",
type: "datadog",
sink: {
region: "eu1", // ou "us1", "us3", "us5"
apiKey: process.env.DATADOG_API_KEY
},
// Filtrer les événements pertinents SOC2
// Laisser vide = tous les événements (recommandé pour SOC2)
};
// Events critiques pour SOC2 :
const soc2CriticalEvents = {
// CC6 - Logical Access Controls
"s": "User signed up",
"slo": "User logged out",
"ssa": "Successful silent auth",
"f": "Failed login",
"fp": "Failed login - wrong password",
"fu": "Failed login - invalid user",
"frd": "Failed refresh token",
"limit_mu": "Rate limit - user",
"limit_wc": "Rate limit - connection",
"pwd_leak": "Leaked password detected",
// CC6 - Admin Operations
"scoa": "Successfully changed object access",
"sca": "Successfully changed application",
"scg": "Successfully changed generic",
"scu": "Successfully changed user",
"dcu": "Deleted connection user",
// CC7 - Anomaly Detection
"anomaly": "Anomaly detected",
"ip_limit": "IP rate limit",
"block": "User blocked",
"unblock": "User unblocked",
};
Dashboard SOC2 avec Datadog
Cette portion de code Python permet de créer automatiquement un dashboard Datadog, qui centralise les métriques et alertes clés pour vos preuves de conformité SOC2 avec Auth0.
# Script de création de dashboard Datadog pour SOC2 Auth0
import datadog
from datadog import api
datadog.initialize(
api_key=os.getenv("DD_API_KEY"),
app_key=os.getenv("DD_APP_KEY")
)
soc2_dashboard = {
"title": "Auth0 SOC2 Compliance Dashboard",
"description": "CC6/CC7 evidence collection for SOC2 Type II",
"layout_type": "ordered",
"widgets": [
{
"definition": {
"type": "timeseries",
"title": "Failed Login Attempts (CC6.1)",
"requests": [{
"q": "sum:auth0.logs{type:f}.as_count()",
"display_type": "bars"
}]
}
},
{
"definition": {
"type": "toplist",
"title": "Top Failed Login IPs (CC7.4)",
"requests": [{
"q": "sum:auth0.logs{type:f} by {ip}.as_count()",
"limit": 10
}]
}
},
{
"definition": {
"type": "query_value",
"title": "MFA Adoption Rate (CC6.1)",
"requests": [{
"q": "100 * (sum:auth0.users.mfa_enabled{*} / sum:auth0.users.total{*})"
}]
}
},
{
"definition": {
"type": "alert_graph",
"title": "Security Alerts (CC7.3)",
"alert_id": "your-monitor-id"
}
}
]
}
Ce script structure les visualisations essentielles pour suivre les connexions, l’adoption MFA et les alertes sécurité sur Datadog.
Alertes SOC2 automatiques
Ce bloc définit des règles d’alertes automatiques dans Datadog pour surveiller les attaques, les actions admin anormales, les incidents de sécurité et la disponibilité du service Auth0.
# Monitors Datadog pour SOC2 Auth0
monitors = [
{
"name": "[SOC2-CC6] Brute force attack detected",
"type": "metric alert",
"query": "sum(last_5m):sum:auth0.logs{type:f} by {ip}.as_count() > 10",
"message": "More than 10 failed logins from same IP. @pagerduty @security-team",
"tags": ["soc2", "cc6", "auth0"],
"options": {
"thresholds": {"critical": 10, "warning": 5},
"notify_no_data": False
}
},
{
"name": "[SOC2-CC6] Admin action by non-admin user",
"type": "log alert",
"query": "source:auth0 @type:(sca OR scu OR dcu) -@role:admin",
"message": "Admin action performed by non-admin user! @security-team",
"tags": ["soc2", "cc6", "auth0"]
},
{
"name": "[SOC2-CC7] Leaked credential detected",
"type": "log alert",
"query": "source:auth0 @type:pwd_leak",
"message": "Leaked password detected - immediate investigation required! @security-team",
"tags": ["soc2", "cc7", "auth0"]
},
{
"name": "[SOC2-A1] Auth0 API error rate spike",
"type": "metric alert",
"query": "sum(last_5m):sum:auth0.logs{type:fapi}.as_count() > 50",
"message": "Auth0 API error spike - potential availability issue",
"tags": ["soc2", "a1", "auth0"]
}
]
Grâce à ces alertes, vous bénéficiez d’une surveillance en temps réel sur les risques SOC2 clés liés à Auth0.
Génération automatique de preuves pour auditeurs
Ce script Python sert à produire un rapport mensuel SOC2 à partir des logs Auth0 et des métriques, formalisant les preuves pour vos auditeurs internes ou externes.
# Script de génération de rapport SOC2 mensuel
import requests
from datetime import datetime, timedelta
import json
class SOC2EvidenceGenerator:
def __init__(self, mgmt_token: str, domain: str, datadog_api_key: str):
self.auth0_headers = {"Authorization": f"Bearer {mgmt_token}"}
self.domain = domain
self.dd_api_key = datadog_api_key
def generate_monthly_report(self, month: int, year: int) -> dict:
report = {
"report_date": datetime.utcnow().isoformat(),
"period": f"{year}-{month:02d}",
"generated_by": "Auth0.Expert SOC2 Tool",
"controls": {}
}
# CC6.1 : Authentification et contrôle d'accès
report["controls"]["CC6.1"] = self._cc6_1_evidence(month, year)
# CC6.2 : Accès privilégiés
report["controls"]["CC6.2"] = self._cc6_2_evidence(month, year)
# CC7.2 : Monitoring des anomalies
report["controls"]["CC7.2"] = self._cc7_2_evidence(month, year)
return report
def _cc6_1_evidence(self, month: int, year: int) -> dict:
"""CC6.1 : Contrôle d'accès logique"""
# Stats utilisateurs
total_users = self._get_user_count()
mfa_users = self._get_mfa_enabled_count()
# Stats connexions
failed_logins = self._get_log_count("f", month, year)
successful_logins = self._get_log_count("s", month, year)
blocked_attempts = self._get_log_count("block", month, year)
return {
"control": "Logical access controls prevent unauthorized access",
"evidence": {
"total_users": total_users,
"mfa_adoption_rate": f"{(mfa_users/total_users*100):.1f}%",
"failed_login_attempts": failed_logins,
"successful_logins": successful_logins,
"blocked_accounts": blocked_attempts,
"mfa_policy": "Enforced for admin users via Auth0 Actions"
},
"conclusion": "PASS" if mfa_users/total_users > 0.9 else "REVIEW"
}
def _cc6_2_evidence(self, month: int, year: int) -> dict:
"""CC6.2 : Accès privilégiés"""
admin_actions = self._get_admin_actions_log(month, year)
return {
"control": "Privileged access is restricted and monitored",
"evidence": {
"admin_operations_count": len(admin_actions),
"operations": admin_actions[:10], # 10 dernières
"alert_configured": True,
"review_frequency": "Monthly"
}
}
def _cc7_2_evidence(self, month: int, year: int) -> dict:
"""CC7.2 : Évaluation des anomalies de sécurité"""
anomalies = self._get_security_events(month, year)
return {
"control": "Security anomalies are monitored and investigated",
"evidence": {
"anomalies_detected": len(anomalies),
"anomalies_investigated": len(anomalies), # toutes
"mean_time_to_detect": "< 5 minutes (automated alerts)",
"siem_configured": True
}
}
def export_pdf(self, report: dict, filename: str):
"""Export du rapport en PDF pour les auditeurs"""
# Utiliser reportlab ou weasyprint
pass
Ce générateur permet d'automatiser la preuve de conformité SOC 2, rassemblant statistiques d'accès, MFA, activités admin, et détection d'anomalies.
Checklist SOC2 × Auth0
Voici un tableau qui synthétise pour chaque contrôle SOC2 la feature Auth0 à utiliser, pour vérifier rapidement la couverture de conformité.
| Contrôle SOC2 | Description | Feature Auth0 | Status | |---|---|---|---| | CC6.1 | Authentification | MFA + Password Policy | ✅ | | CC6.2 | Accès privilégiés | RBAC + Admin Restrictions | ✅ | | CC6.3 | Revue des accès | User list + last_login | ✅ | | CC6.7 | Transmission chiffrée | TLS 1.2+ | ✅ | | CC7.2 | Anomalie monitoring | Log Streaming + Alerts | ✅ | | CC7.3 | Évaluation incidents | Log Streaming SIEM | ✅ | | CC7.4 | Réponse incidents | Actions + Webhooks | ✅ | | A1.1 | Disponibilité | SLA 99.9%+ Auth0 | ✅ | | A1.2 | Récupération | Backup Auth0 | ✅ |
Auth0.Expert fournit des packages SOC2 complets incluant dashboards, alertes et génération de rapports automatisée.
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