import { countRecentBans } from './fail2banDb'; import { sendEmail } from './_core/emailSender'; import { ENV } from './_core/env'; // Seuil de déclenchement de l'alerte (nombre d'IPs bannies par heure) const ALERT_THRESHOLD = 10; // Intervalle de vérification (en millisecondes) - toutes les 15 minutes const CHECK_INTERVAL = 15 * 60 * 1000; // Dernière alerte envoyée (timestamp) let lastAlertTime = 0; // Délai minimum entre deux alertes (1 heure) const MIN_ALERT_INTERVAL = 60 * 60 * 1000; /** * Vérifie s'il y a une attaque massive et envoie une alerte email si nécessaire */ async function checkAndSendAlert() { try { const recentBans = await countRecentBans(1); // Dernière heure console.log(`[Fail2Ban Alert] ${recentBans} bannissements dans la dernière heure`); // Vérifier si le seuil est atteint if (recentBans >= ALERT_THRESHOLD) { const now = Date.now(); // Vérifier si on n'a pas déjà envoyé une alerte récemment if (now - lastAlertTime >= MIN_ALERT_INTERVAL) { console.log(`[Fail2Ban Alert] Seuil atteint (${recentBans} >= ${ALERT_THRESHOLD}), envoi de l'alerte...`); await sendAlertEmail(recentBans); lastAlertTime = now; console.log('[Fail2Ban Alert] Alerte envoyée avec succès'); } else { console.log('[Fail2Ban Alert] Alerte déjà envoyée récemment, pas de nouvel envoi'); } } } catch (error) { console.error('[Fail2Ban Alert] Erreur lors de la vérification:', error); } } /** * Envoie un email d'alerte pour une attaque massive */ async function sendAlertEmail(banCount: number) { const ownerEmail = ENV.ownerName; // Utiliser l'email du propriétaire if (!ownerEmail || !ownerEmail.includes('@')) { console.error('[Fail2Ban Alert] Email du propriétaire non configuré'); return; } const subject = `🚨 Alerte Sécurité: Attaque SSH massive détectée`; const htmlContent = `

🚨 Alerte Sécurité SSH

Attaque massive détectée sur votre serveur

⚠️ Attention !
Une activité suspecte importante a été détectée sur votre serveur SSH.

Statistiques de l'attaque

IPs bannies (dernière heure) ${banCount}
Seuil d'alerte ${ALERT_THRESHOLD}
Date de détection ${new Date().toLocaleString('fr-FR')}

Actions recommandées

Voir le tableau de bord Fail2Ban

Note: Cette alerte est automatiquement déclenchée lorsque plus de ${ALERT_THRESHOLD} IPs sont bannies en moins d'une heure. Fail2Ban continue de protéger votre serveur en bannissant automatiquement les adresses IP suspectes.

`; const textContent = ` 🚨 ALERTE SÉCURITÉ SSH Une attaque massive a été détectée sur votre serveur. STATISTIQUES: - IPs bannies (dernière heure): ${banCount} - Seuil d'alerte: ${ALERT_THRESHOLD} - Date de détection: ${new Date().toLocaleString('fr-FR')} ACTIONS RECOMMANDÉES: 1. Vérifiez le tableau de bord Fail2Ban 2. Examinez les logs SSH 3. Renforcez les règles Fail2Ban si nécessaire 4. Vérifiez la robustesse de vos mots de passe Fail2Ban continue de protéger votre serveur automatiquement. --- Gestion des Formations Manager Itinova `; await sendEmail({ to: ownerEmail, subject, html: htmlContent, text: textContent, }); } /** * Initialise le système d'alertes Fail2Ban */ export function initFail2BanAlertSystem() { console.log('[Fail2Ban Alert] Initialisation du système d\'alertes'); console.log(`[Fail2Ban Alert] Seuil: ${ALERT_THRESHOLD} IPs/heure, Vérification toutes les ${CHECK_INTERVAL / 60000} minutes`); // Première vérification immédiate checkAndSendAlert(); // Vérifications périodiques setInterval(checkAndSendAlert, CHECK_INTERVAL); console.log('[Fail2Ban Alert] Système d\'alertes initialisé'); }