import json import os import time import requests from datetime import datetime from modules.logger import log_event LOG_FILE = "aethas_ip_logs.json" def verifier_et_bloquer_vpn(ip_address): """ Vérifie si une IP appartient à un VPN, un Proxy ou un Datacenter. Utilise l'API publique gratuite blackbox.ipinfo.app (Renvoie 'Y' si VPN, 'N' si clean). """ # On ne bloque jamais les requêtes locales du serveur (localhost) if ip_address in ["127.0.0.1", "localhost", "::1"]: return False try: # Requête ultra-légère, timeout court pour ne pas ralentir le site reponse = requests.get(f"https://blackbox.ipinfo.app/lookup/{ip_address}", timeout=3) if reponse.text.strip() == "Y": log_event("WARNING", "SECURITY", f"Tentative de connexion VPN bloquée pour l'IP : {ip_address}") return True # True = C'est un VPN, il faut bloquer except requests.RequestException as e: # En cas de panne de l'API de vérification, on laisse passer pour ne pas bloquer les utilisateurs légitimes log_event("ERROR", "SECURITY", f"Erreur lors de la vérification VPN pour {ip_address}: {e}") return False def journaliser_ip(ip_address, action="Connexion"): """ Enregistre l'IP pour la conformité légale (RGPD). Purge automatique des logs vieux de plus de 365 jours. """ logs = [] # 1. Chargement de l'historique existant if os.path.exists(LOG_FILE): with open(LOG_FILE, 'r', encoding='utf-8') as f: try: logs = json.load(f) except json.JSONDecodeError: logs = [] # 2. Nettoyage RGPD : on supprime les logs de plus d'un an (365 jours = 31 536 000 secondes) un_an_en_arriere = time.time() - 31536000 logs = [log for log in logs if log.get("timestamp", 0) > un_an_en_arriere] # 3. Ajout de la nouvelle entrée logs.append({ "ip": ip_address, "action": action, "date": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "timestamp": time.time() }) # 4. Sauvegarde with open(LOG_FILE, 'w', encoding='utf-8') as f: json.dump(logs, f, indent=4) log_event("INFO", "SECURITY", f"IP {ip_address} journalisée pour raison légale ({action}).")