Réputation IP et géolocalisation dans Auth0 : bloquer les connexions suspectes
Utiliser la réputation IP, la géolocalisation et l'enrichissement Threat Intelligence dans Auth0 Actions pour bloquer les connexions à risque.
Par Auth0.Expert · 2025-04-25 · 9 min de lecture
Réputation IP et géolocalisation dans Auth0
TL;DR
Auth0 Actions ont accès à la géolocalisation de l'IP via event.request.geoip. En ajoutant des APIs de Threat Intelligence (AbuseIPDB, Shodan, MaxMind), vous pouvez bloquer les connexions depuis des IPs malveillantes.
---
Données géographiques disponibles nativement
Ce code montre comment récupérer et afficher les informations de géolocalisation fournies par Auth0 lors d'une connexion utilisateur. Cela permet par exemple de monitorer la provenance des connexions.
exports.onExecutePostLogin = async (event, api) => {
const geo = event.request.geoip;
console.log({
ip: event.request.ip,
country_code: geo?.country_code, // "FR", "US", "CN"
country_name: geo?.country_name, // "France"
city: geo?.city_name, // "Paris"
latitude: geo?.latitude,
longitude: geo?.longitude,
time_zone: geo?.time_zone, // "Europe/Paris"
continent_code: geo?.continent_code, // "EU"
is_tor: geo?.is_tor, // true/false
is_datacenter: geo?.is_datacenter, // true/false
asn: geo?.autonomous_system_number, // "AS15169"
asn_name: geo?.autonomous_system_organization, // "GOOGLE"
});
};
---
Blocage géographique
Ici, nous configurons une action qui bloque ou restreint l'accès en fonction du pays d'origine détecté pour l'utilisateur. C'est utilisé pour respecter les exigences légales ou limiter certains risques.
// Action : blocage par pays
exports.onExecutePostLogin = async (event, api) => {
const BLOCKED_COUNTRIES = (event.secrets.BLOCKED_COUNTRIES || '').split(',');
const ALLOWED_COUNTRIES = (event.secrets.ALLOWED_COUNTRIES || '').split(',');
const country = event.request.geoip?.country_code;
// Blocage de pays spécifiques
if (BLOCKED_COUNTRIES.length > 0 && BLOCKED_COUNTRIES.includes(country)) {
api.access.deny(`Connexion non autorisée depuis ${country}`);
return;
}
// Allowlist pays uniquement
if (ALLOWED_COUNTRIES.length > 0 && !ALLOWED_COUNTRIES.includes(country)) {
api.multifactor.enable('any'); // MFA plutôt que blocage dur
}
};
Cette action applique des règles de sécurité personnalisées en fonction du pays pour renforcer le contrôle des accès.
---
Intégration AbuseIPDB
Ce code ajoute une vérification de la réputation de l'adresse IP de l'utilisateur auprès du service AbuseIPDB afin de bloquer ou renforcer la sécurité si un comportement malveillant est détecté.
// Vérifier la réputation IP avec AbuseIPDB
exports.onExecutePostLogin = async (event, api) => {
const ip = event.request.ip;
// Skip les IPs privées
if (ip.startsWith('10.') || ip.startsWith('192.168.') || ip === '127.0.0.1') return;
const response = await fetch(
`https://api.abuseipdb.com/api/v2/check?ipAddress=${ip}&maxAgeInDays=30`,
{
headers: {
Key: event.secrets.ABUSEIPDB_API_KEY,
Accept: 'application/json',
},
}
);
const data = await response.json();
const abuseScore = data.data?.abuseConfidenceScore || 0;
if (abuseScore > 75) {
// IP très suspecte → blocage
api.access.deny('Connexion refusée pour des raisons de sécurité');
} else if (abuseScore > 25) {
// IP suspecte → MFA obligatoire
api.multifactor.enable('any', { allowRememberBrowser: false });
}
};
Ce code protège votre application contre les IPs ayant un score de réputation élevé en automatisant le blocage ou l'activation du MFA selon le niveau de risque détecté.
---
Blocage des VPN / Proxy
Cette action cible les connexions suspectes provenant de VPN, proxys ou du réseau Tor, souvent utilisés pour contourner les restrictions ou masquer l'origine réelle de l'utilisateur.
// Certains services SaaS veulent bloquer les VPNs
// (Finance, Gaming, Compliance)
exports.onExecutePostLogin = async (event, api) => {
const geo = event.request.geoip;
// Tor
if (geo?.is_tor) {
api.access.deny('Connexion via Tor non autorisée');
return;
}
// Datacenter (probable VPN/proxy)
if (geo?.is_datacenter && event.client.metadata?.block_datacenters === 'true') {
// Demander MFA plutôt que bloquer (légitimes: utilisateurs d'entreprise)
api.multifactor.enable('any');
}
// Vérifier via IPHub
const hubResponse = await fetch(
`http://v2.api.iphub.info/ip/${event.request.ip}`,
{ headers: { 'X-Key': event.secrets.IPHUB_KEY } }
);
const hubData = await hubResponse.json();
if (hubData.block === 1) {
// Block = 1 → Proxy/VPN détecté
api.multifactor.enable('any');
}
};
Cette logique combine plusieurs signaux pour mieux détecter et filtrer les connexions anonymisées tout en s’adaptant selon les usages métier.
---
Rate Limiting par pays
Cette action met en place une limitation dynamique du nombre de connexions par pays, utile pour détecter et contrer les attaques ou abus ciblés sur une zone géographique précise.
// Limiter les tentatives par pays sur une période
// (pour éviter les campagnes géo-ciblées)
exports.onExecutePostLogin = async (event, api) => {
const country = event.request.geoip?.country_code;
// Récupérer le compteur depuis un KV Store externe (Upstash Redis)
const key = `auth_attempts:${country}:${new Date().toISOString().slice(0, 13)}`; // Par heure
const response = await fetch(`${event.secrets.UPSTASH_REDIS_URL}/incr/${key}`, {
method: 'POST',
headers: { Authorization: `Bearer ${event.secrets.UPSTASH_REDIS_TOKEN}` },
});
const { INCR: count } = await response.json();
if (count > 1000) {
// Plus de 1000 tentatives depuis ce pays en 1h → suspicious
api.multifactor.enable('any');
}
};
Cette mesure pro-active vous protège des attaques d’envergure issues d’un même pays en rendant l’accès plus difficile après un certain volume.
---
Dashboard géographique
Pour analyser et surveiller les activités Auth0 par pays, créez des dashboards afin de visualiser les tendances et détecter rapidement les anomalies par région.
-- Agrégation par pays sur les 24 dernières heures
SELECT
geoip_country_code,
COUNT(*) as total_attempts,
COUNT(CASE WHEN type = 's' THEN 1 END) as successes,
COUNT(CASE WHEN type = 'f' THEN 1 END) as failures,
ROUND(100.0 * COUNT(CASE WHEN type = 'f' THEN 1 END) / COUNT(*), 1) as failure_rate
FROM auth0_logs
WHERE timestamp > NOW() - INTERVAL '24 hours'
GROUP BY geoip_country_code
ORDER BY total_attempts DESC
LIMIT 20;
Cette requête SQL calcule le taux d’échec et d’accès par pays pour aider vos équipes sécurité à piloter et ajuster leur stratégie.
---
> 🌍 Protection géographique avancée : nous configurons votre politique de sécurité géographique adaptée à votre secteur et vos marchés cibles.
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