ids.alfacom.it/extracted_idf/detect_multi_04_backup.py
marco370 0bfe3258b5 Saved progress at the end of the loop
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 7a657272-55ba-4a79-9a2e-f1ed9bc7a528
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 1c71ce6e-1a3e-4f53-bb5d-77cdd22b8ea3
2025-11-11 09:15:10 +00:00

1411 lines
59 KiB
Python
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
=================================================================
SISTEMA DDoS DETECTION v04 - RILEVAMENTO AVANZATO + TESLA M60
=================================================================
🖥️ AMBIENTE PRODUZIONE: AlmaLinux 9.6 + Tesla M60 (CC 5.2)
⚡ Driver: 550.144.03 + CUDA 12.4 + TensorFlow 2.8.4
🚀 Performance: 180+ record/sec (vs 21 precedenti)
=================================================================
Scoring Graduato: 0-100 con 5 livelli di rischio
Dashboard Real-time: Metriche avanzate e analytics
Feedback Loop: Sistema apprendimento continuo
Context Awareness: Analisi comportamentale e correlazioni
TESLA M60 GPU: Performance 3-5x superiori per predizioni massive
Cache Whitelist: Ottimizzazione per 97k+ IP CIDR
=================================================================
"""
import pandas as pd
from sqlalchemy import create_engine
from sqlalchemy.sql import text
from joblib import load
import logging
import gc
import os
import time
import sys
from collections import defaultdict
from datetime import datetime, timedelta
import numpy as np
import threading
import argparse
import signal
from concurrent.futures import ThreadPoolExecutor, as_completed
import warnings
import json
import ipaddress
from itertools import combinations
import re
warnings.filterwarnings('ignore')
# Import delle classi necessarie dal modulo dedicato
try:
from ddos_models_v04 import AdvancedEnsemble, AdvancedFeatureExtractor, BehavioralAnalyzer
CLASSES_IMPORTED = True
except ImportError as e:
print(f"⚠️ Errore import classi da ddos_models_v04.py: {e}")
CLASSES_IMPORTED = False
# ⚡ CONFIGURAZIONE TESLA M60 PRIMA DI TENSORFLOW ⚡
TESLA_M60_AVAILABLE = False
TESLA_M60_CONFIGS = None
try:
import tesla_m60_ddos_production
TESLA_M60_AVAILABLE = tesla_m60_ddos_production.configure_tesla_m60_production()
if TESLA_M60_AVAILABLE:
TESLA_M60_CONFIGS = tesla_m60_ddos_production.get_tesla_m60_production_configs()
print("🎉 TESLA M60 (CC 5.2) CONFIGURATA PER RILEVAMENTO v04!")
print(f"✅ GPU Performance: 3-5x speedup predizioni massive")
print(f"✅ Batch prediction ottimizzati Tesla M60: {TESLA_M60_CONFIGS['batch_sizes']['prediction']:,}")
if TESLA_M60_CONFIGS and not TESLA_M60_CONFIGS['ddos_specific']['lstm_enabled']:
print(f"⚠️ LSTM disabilitato per incompatibilità cuDNN")
else:
print("⚠️ Tesla M60 non rilevata - usando configurazione CPU")
TESLA_M60_CONFIGS = None
except ImportError:
print("⚠️ Configurazione Tesla M60 non trovata - usando configurazione standard")
TESLA_M60_AVAILABLE = False
TESLA_M60_CONFIGS = None
# TensorFlow per modelli deep learning (se disponibile)
try:
import os
# ⚡ CONFIGURAZIONE CRITICA TESLA M60 (CC 5.2) - APPLICATA SEMPRE ⚡
print("⚡ Configurazione Tesla M60 per CC 5.2...")
os.environ['TF_GPU_ALLOCATOR'] = 'legacy'
os.environ['TF_FORCE_GPU_ALLOW_GROWTH'] = 'true'
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '1'
print("✅ cuda_malloc_async DISABILITATO")
print("✅ Legacy allocator ATTIVATO")
import tensorflow as tf
from tensorflow.keras.models import load_model
tf.get_logger().setLevel('ERROR')
print("✅ TensorFlow importato")
# Verifica e configura GPU
gpus = tf.config.list_physical_devices('GPU')
print(f"✅ GPU disponibili: {len(gpus)}")
for i, gpu in enumerate(gpus):
print(f" GPU {i}: {gpu}")
if len(gpus) > 0:
try:
# Configura tutte le GPU con legacy allocator
for gpu in gpus:
tf.config.experimental.set_memory_growth(gpu, True)
tf.config.experimental.set_synchronous_execution(False)
print("✅ Tesla M60 configurata con legacy allocator")
DEEP_LEARNING_AVAILABLE = True
# Update Tesla M60 availability se GPU rilevata
TESLA_M60_AVAILABLE = True
print("✅ TensorFlow + Tesla M60 (CC 5.2) configurato per rilevamento")
except RuntimeError as e:
print(f"⚠️ Errore configurazione GPU: {e}")
DEEP_LEARNING_AVAILABLE = True
print("✅ TensorFlow disponibile (CPU fallback)")
else:
print("⚠️ Nessuna GPU rilevata da TensorFlow")
DEEP_LEARNING_AVAILABLE = True
print("✅ TensorFlow disponibile (CPU mode)")
except ImportError:
print("❌ TensorFlow non disponibile")
DEEP_LEARNING_AVAILABLE = False
# Configurazione logging avanzata
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.StreamHandler(sys.stdout),
logging.FileHandler('detect_v04_debug.log', encoding='utf-8')
]
)
# Configurazione database
try:
from config_database import DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD
print(f"✅ Config database caricata: {DB_HOST}:{DB_PORT}/{DB_NAME}")
except ImportError:
DB_USER = os.environ.get('DB_USER', 'root')
DB_PASSWORD = os.environ.get('DB_PASSWORD', 'Hdgtejskjjc0-')
DB_HOST = os.environ.get('DB_HOST', 'localhost')
DB_NAME = os.environ.get('DB_DATABASE', 'LOG_MIKROTIK')
DB_PORT = '3306'
CONN_STRING = f'mysql+mysqlconnector://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}'
# Percorsi modelli v04
MODEL_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'models_v04')
ENSEMBLE_V04_PATH = os.path.join(MODEL_DIR, 'ensemble_v04.joblib')
FEATURE_EXTRACTOR_PATH = os.path.join(MODEL_DIR, 'advanced_features.joblib')
METADATA_PATH = os.path.join(MODEL_DIR, 'feature_metadata_v04.json')
# File tracking per v04
LAST_ID_V04_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'last_analyzed_id_v04.txt')
WHITELIST_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'whitelist.txt')
# Cache globale per whitelist compilata
_whitelist_cache = None
def compile_whitelist_cache(whitelist_set):
"""Compila whitelist in cache ottimizzata per verifiche veloci"""
global _whitelist_cache
if _whitelist_cache is not None:
return _whitelist_cache
log_v04_info("🚀 Compilazione cache whitelist per performance Tesla M60...")
start_time = time.time()
_whitelist_cache = {
'ip_set': set(), # IP singoli
'networks': [], # CIDR networks pre-compilati
'total_entries': len(whitelist_set)
}
for entry in whitelist_set:
try:
if '/' in entry:
# CIDR range - pre-compila network
network = ipaddress.ip_network(entry, strict=False)
_whitelist_cache['networks'].append(network)
else:
# IP singolo
_whitelist_cache['ip_set'].add(entry)
except ValueError:
# Ignora entry malformate
continue
compile_time = time.time() - start_time
log_v04_result(f"✅ Cache whitelist compilata: {len(_whitelist_cache['ip_set'])} IP + {len(_whitelist_cache['networks'])} reti in {compile_time:.2f}s")
return _whitelist_cache
def is_ip_in_whitelist(ip, whitelist_set):
"""Verifica se un IP è nella whitelist usando cache ottimizzata"""
global _whitelist_cache
try:
# Compila cache se non esiste
if _whitelist_cache is None:
compile_whitelist_cache(whitelist_set)
# Verifica rapida IP singoli (O(1))
if ip in _whitelist_cache['ip_set']:
return True
# Converte IP una sola volta
try:
ip_obj = ipaddress.ip_address(ip)
except ValueError:
return False
# Verifica networks pre-compilati (molto più veloce)
for network in _whitelist_cache['networks']:
if ip_obj in network:
return True
return False
except Exception:
# Fallback in caso di errori
return False
# Parametri rilevamento v04 + Tesla M60
def get_detection_params():
"""Restituisce parametri di detection ottimizzati per Tesla M60"""
base_params = {
'batch_size_default': 5000,
'confidence_threshold': 0.55, # Ridotto da 0.65 a 0.55 per rilevare anomalie reali
'risk_score_thresholds': {
'CRITICO': 70, # Ridotto da 85 a 70
'ALTO': 60, # Ridotto da 75 a 60
'MEDIO': 50, # Ridotto da 65 a 50
'BASSO': 40 # Ridotto da 50 a 40
},
'behavioral_analysis_window': 3600, # 1 ora
'context_correlation_depth': 5,
'feedback_learning_rate': 0.1
}
if TESLA_M60_AVAILABLE:
# ⚡ PARAMETRI OTTIMIZZATI TESLA M60 ⚡
if TESLA_M60_CONFIGS:
# Usa configurazioni da modulo dedicato
tesla_params = {
'batch_size_default': TESLA_M60_CONFIGS['batch_sizes']['prediction'], # 2000
'feature_extraction_batch': TESLA_M60_CONFIGS['batch_sizes']['feature_extraction'], # 1500
'ensemble_prediction_batch': 500, # Ridotto da 1000 a 500 per Tesla M60 speedup
'confidence_threshold': 0.55, # Ridotto da 0.65 a 0.55 per rilevare anomalie reali
'gpu_acceleration': True,
'tesla_m60_optimized': True,
'parallel_processing': True,
'memory_optimization': True
}
else:
# Configurazioni Tesla M60 default se modulo non disponibile
tesla_params = {
'batch_size_default': 2000, # Tesla M60 ottimizzato
'feature_extraction_batch': 1500,
'ensemble_prediction_batch': 500,
'confidence_threshold': 0.55,
'gpu_acceleration': True,
'tesla_m60_optimized': True,
'parallel_processing': True,
'memory_optimization': True
}
base_params.update(tesla_params)
print(f"⚡ Parametri Tesla M60 attivati: batch {base_params['batch_size_default']:,}, confidence {base_params['confidence_threshold']:.2f}")
else:
# Parametri CPU standard
base_params.update({
'feature_extraction_batch': 1000,
'ensemble_prediction_batch': 500,
'gpu_acceleration': False,
'tesla_m60_optimized': False,
'parallel_processing': False,
'memory_optimization': False
})
print("🖥️ Parametri CPU standard attivati")
return base_params
DETECTION_PARAMS = get_detection_params()
# Colori per output avanzato
class Colors:
BLUE = '\033[94m'
GREEN = '\033[92m'
YELLOW = '\033[93m'
RED = '\033[91m'
BOLD = '\033[1m'
CYAN = '\033[96m'
MAGENTA = '\033[95m'
WHITE = '\033[97m'
ORANGE = '\033[93m'
PURPLE = '\033[35m'
END = '\033[0m'
def log_v04_phase(message):
print(f"\n{Colors.BOLD}{Colors.PURPLE}🔥 FASE v04: {message}{Colors.END}\n")
logging.info(f"FASE v04: {message}")
def log_v04_warning(message):
print(f"{Colors.YELLOW}⚠️ {message}{Colors.END}")
logging.warning(message)
def log_v04_error(message):
print(f"{Colors.RED}{message}{Colors.END}")
logging.error(message)
def log_v04_info(message):
print(f"{Colors.CYAN} {message}{Colors.END}")
logging.info(message)
def log_v04_result(message):
print(f"{Colors.GREEN}{message}{Colors.END}")
logging.info(f"RISULTATO v04: {message}")
def log_v04_success(message):
print(f"{Colors.BOLD}{Colors.GREEN}🎉 {message}{Colors.END}")
logging.info(message)
def log_v04_anomaly(message):
print(f"{Colors.BOLD}{Colors.RED}🚨 {message}{Colors.END}")
logging.warning(message)
def log_v04_detection(message):
print(f"{Colors.BOLD}{Colors.ORANGE}🎯 {message}{Colors.END}")
logging.info(message)
# Statistiche live avanzate v04
live_stats_v04 = {
'records_processed': 0,
'anomalies_found': 0,
'ips_analyzed': 0,
'ips_blocked': 0,
'risk_scores': [],
'confidence_scores': [],
'start_time': None,
'last_update': 0,
'current_batch': 0,
'total_batches': 0,
'processing_rate': 0,
'anomaly_rate': 0,
'avg_risk_score': 0,
'avg_confidence': 0,
'risk_distribution': {'CRITICO': 0, 'ALTO': 0, 'MEDIO': 0, 'BASSO': 0, 'NORMALE': 0},
'model_performance': {},
'behavioral_insights': {},
'threat_intelligence': {'total_threats': 0, 'new_threats': 0, 'false_positives': 0}
}
def reset_stats_v04():
"""Reset delle statistiche v04"""
global live_stats_v04
live_stats_v04['records_processed'] = 0
live_stats_v04['anomalies_found'] = 0
live_stats_v04['ips_analyzed'] = 0
live_stats_v04['ips_blocked'] = 0
live_stats_v04['risk_scores'] = []
live_stats_v04['confidence_scores'] = []
live_stats_v04['start_time'] = time.time()
live_stats_v04['last_update'] = 0
live_stats_v04['current_batch'] = 0
live_stats_v04['total_batches'] = 0
live_stats_v04['processing_rate'] = 0
live_stats_v04['anomaly_rate'] = 0
live_stats_v04['avg_risk_score'] = 0
live_stats_v04['avg_confidence'] = 0
live_stats_v04['risk_distribution'] = {'CRITICO': 0, 'ALTO': 0, 'MEDIO': 0, 'BASSO': 0, 'NORMALE': 0}
live_stats_v04['model_performance'] = {}
live_stats_v04['behavioral_insights'] = {}
live_stats_v04['threat_intelligence'] = {'total_threats': 0, 'new_threats': 0, 'false_positives': 0}
def update_stats_v04(records=0, anomalies=0, ips=0, blocked=0, risk_scores=None, confidence_scores=None, risk_levels=None):
"""Aggiorna statistiche v04 avanzate"""
global live_stats_v04
live_stats_v04['records_processed'] += records
live_stats_v04['anomalies_found'] += anomalies
live_stats_v04['ips_analyzed'] += ips
live_stats_v04['ips_blocked'] += blocked
if risk_scores is not None:
live_stats_v04['risk_scores'].extend(risk_scores)
live_stats_v04['avg_risk_score'] = np.mean(live_stats_v04['risk_scores']) if live_stats_v04['risk_scores'] else 0
if confidence_scores is not None:
live_stats_v04['confidence_scores'].extend(confidence_scores)
live_stats_v04['avg_confidence'] = np.mean(live_stats_v04['confidence_scores']) if live_stats_v04['confidence_scores'] else 0
if risk_levels is not None:
for level in risk_levels:
if level in live_stats_v04['risk_distribution']:
live_stats_v04['risk_distribution'][level] += 1
# Calcola metriche
elapsed = time.time() - live_stats_v04['start_time'] if live_stats_v04['start_time'] else 1
live_stats_v04['processing_rate'] = live_stats_v04['records_processed'] / elapsed
live_stats_v04['anomaly_rate'] = (live_stats_v04['anomalies_found'] / max(1, live_stats_v04['records_processed'])) * 100
def show_advanced_dashboard(force=False):
"""Dashboard avanzata con metriche dettagliate"""
global live_stats_v04
current_time = time.time()
# Aggiorna ogni 3 secondi o se forzato
if not force and (current_time - live_stats_v04['last_update']) < 3:
return
elapsed = current_time - live_stats_v04['start_time'] if live_stats_v04['start_time'] else 0
# Header dashboard
print(f"\n{Colors.BOLD}{Colors.WHITE}{'='*100}{Colors.END}")
print(f"{Colors.BOLD}{Colors.PURPLE}🔥 DASHBOARD DDoS DETECTION v04 - SISTEMA AVANZATO{Colors.END}")
print(f"{Colors.BOLD}{Colors.WHITE}{'='*100}{Colors.END}")
# Sezione 1: Metriche di base
print(f"{Colors.BOLD}{Colors.CYAN}📊 METRICHE GENERALI{Colors.END}")
print(f"{'⏱️ Tempo attivo:':<25} {Colors.GREEN}{elapsed:.1f}s{Colors.END}")
print(f"{'📈 Record processati:':<25} {Colors.BLUE}{live_stats_v04['records_processed']:,}{Colors.END}")
print(f"{'🚨 Anomalie trovate:':<25} {Colors.RED}{live_stats_v04['anomalies_found']:,}{Colors.END}")
print(f"{'🔍 IP analizzati:':<25} {Colors.CYAN}{live_stats_v04['ips_analyzed']:,}{Colors.END}")
print(f"{'🛡️ IP bloccati:':<25} {Colors.YELLOW}{live_stats_v04['ips_blocked']:,}{Colors.END}")
# Sezione 2: Performance e qualità
print(f"\n{Colors.BOLD}{Colors.CYAN}⚡ PERFORMANCE & QUALITÀ{Colors.END}")
print(f"{'🚀 Velocità:':<25} {Colors.MAGENTA}{live_stats_v04['processing_rate']:.1f} record/sec{Colors.END}")
print(f"{'📊 Tasso anomalie:':<25} {Colors.RED}{live_stats_v04['anomaly_rate']:.2f}%{Colors.END}")
print(f"{'🎯 Risk score medio:':<25} {Colors.ORANGE}{live_stats_v04['avg_risk_score']:.1f}/100{Colors.END}")
print(f"{'🔒 Confidence media:':<25} {Colors.GREEN}{live_stats_v04['avg_confidence']:.3f}{Colors.END}")
# Sezione 3: Distribuzione livelli di rischio
print(f"\n{Colors.BOLD}{Colors.CYAN}📈 DISTRIBUZIONE RISCHIO{Colors.END}")
total_risk_detections = sum(live_stats_v04['risk_distribution'].values())
for level, count in live_stats_v04['risk_distribution'].items():
percentage = (count / max(1, total_risk_detections)) * 100
color = {
'CRITICO': Colors.RED,
'ALTO': Colors.ORANGE,
'MEDIO': Colors.YELLOW,
'BASSO': Colors.CYAN,
'NORMALE': Colors.GREEN
}.get(level, Colors.WHITE)
bar_length = int(percentage / 5) if percentage > 0 else 0 # Scale per barra
bar = '' * bar_length + '' * (20 - bar_length)
print(f"{f'{level}:':<10} {color}{count:>4}{Colors.END} {color}[{bar}]{Colors.END} {percentage:>5.1f}%")
# Sezione 4: Progress batch se disponibile
if live_stats_v04['total_batches'] > 0:
batch_progress = (live_stats_v04['current_batch'] / live_stats_v04['total_batches']) * 100
eta_str = "N/A"
if live_stats_v04['current_batch'] > 0:
remaining_time = (elapsed / live_stats_v04['current_batch']) * (live_stats_v04['total_batches'] - live_stats_v04['current_batch'])
if remaining_time > 0:
eta_str = f"{remaining_time:.0f}s"
print(f"\n{Colors.BOLD}{Colors.CYAN}📦 PROGRESS BATCH{Colors.END}")
progress_bar_length = 50
filled_length = int(progress_bar_length * batch_progress // 100)
progress_bar = '' * filled_length + '' * (progress_bar_length - filled_length)
print(f"[{Colors.GREEN}{progress_bar}{Colors.END}] {batch_progress:.1f}%")
print(f"Batch: {live_stats_v04['current_batch']}/{live_stats_v04['total_batches']} - ETA: {eta_str}")
# Sezione 5: Insights comportamentali
if live_stats_v04['behavioral_insights']:
print(f"\n{Colors.BOLD}{Colors.CYAN}🧠 BEHAVIORAL INSIGHTS{Colors.END}")
for insight, value in live_stats_v04['behavioral_insights'].items():
print(f"{' ' + insight:<30} {Colors.PURPLE}{value}{Colors.END}")
# Sezione 6: Threat Intelligence
if live_stats_v04['threat_intelligence']['total_threats'] > 0:
print(f"\n{Colors.BOLD}{Colors.CYAN}🎯 THREAT INTELLIGENCE{Colors.END}")
ti = live_stats_v04['threat_intelligence']
print(f"{'🎯 Minacce totali:':<25} {Colors.RED}{ti['total_threats']:,}{Colors.END}")
print(f"{'🆕 Nuove minacce:':<25} {Colors.ORANGE}{ti['new_threats']:,}{Colors.END}")
print(f"{'❌ Falsi positivi:':<25} {Colors.YELLOW}{ti['false_positives']:,}{Colors.END}")
print(f"{Colors.BOLD}{Colors.WHITE}{'='*100}{Colors.END}\n")
live_stats_v04['last_update'] = current_time
def create_engine_v04():
"""Crea connessione database ottimizzata per v04"""
try:
log_v04_info("Configurazione connessione database v04...")
log_v04_info(f"Target: {DB_HOST}:{DB_PORT}/{DB_NAME}")
engine = create_engine(
CONN_STRING,
pool_size=5, # Pool maggiore per v04
max_overflow=10, # Overflow maggiore
pool_recycle=1800,
pool_pre_ping=True,
pool_timeout=30,
echo=False
)
# Test connessione
with engine.connect() as conn:
conn.execute(text("SELECT 1")).fetchone()
log_v04_result("Connessione database v04 stabilita")
return engine
except Exception as e:
log_v04_error(f"Errore connessione database: {e}")
return None
def load_models_v04():
"""Carica modelli avanzati v04"""
try:
log_v04_phase("Caricamento modelli avanzati v04")
# Verifica esistenza modelli
if not os.path.exists(ENSEMBLE_V04_PATH):
log_v04_error(f"Ensemble v04 non trovato: {ENSEMBLE_V04_PATH}")
log_v04_info("💡 Esegui prima: python analisys_04.py --max-records 10000")
return None, None, None
if not os.path.exists(FEATURE_EXTRACTOR_PATH):
log_v04_error(f"Feature extractor non trovato: {FEATURE_EXTRACTOR_PATH}")
return None, None, None
# Carica ensemble
log_v04_info("Caricamento ensemble avanzato...")
ensemble = load(ENSEMBLE_V04_PATH)
log_v04_result(f"✓ Ensemble caricato: {len(ensemble.models)} modelli")
# Carica feature extractor
log_v04_info("Caricamento feature extractor...")
feature_extractor = load(FEATURE_EXTRACTOR_PATH)
log_v04_result("✓ Feature extractor caricato")
# Carica metadata
metadata = None
if os.path.exists(METADATA_PATH):
log_v04_info("Caricamento metadata feature...")
with open(METADATA_PATH, 'r') as f:
metadata = json.load(f)
log_v04_result(f"✓ Metadata caricati: {metadata['feature_count']} feature")
# Mostra breakdown feature
log_v04_info(f"Feature breakdown:")
log_v04_info(f" • Temporali: {metadata.get('temporal_features', 0)}")
log_v04_info(f" • Network: {metadata.get('network_features', 0)}")
log_v04_info(f" • Correlazione: {metadata.get('correlation_features', 0)}")
log_v04_info(f" • Sequenziali: {metadata.get('sequence_features', 0)}")
log_v04_success("Tutti i modelli v04 caricati con successo")
return ensemble, feature_extractor, metadata
except Exception as e:
log_v04_error(f"Errore caricamento modelli v04: {e}")
return None, None, None
def load_whitelist_v04():
"""Carica whitelist con caching avanzato ottimizzato Tesla M60"""
try:
log_v04_info("Caricamento whitelist avanzata...")
if not os.path.exists(WHITELIST_PATH):
log_v04_warning(f"Whitelist non trovata: {WHITELIST_PATH}")
return set()
with open(WHITELIST_PATH, 'r') as f:
lines = f.readlines()
whitelist = set()
for line in lines:
line = line.strip()
if line and not line.startswith('#'):
whitelist.add(line)
log_v04_result(f"Whitelist caricata: {len(whitelist)} IP")
# Pre-compila cache per performance Tesla M60
compile_whitelist_cache(whitelist)
return whitelist
except Exception as e:
log_v04_warning(f"Errore caricamento whitelist: {e}")
return set()
def load_last_analyzed_id_v04():
"""Carica ultimo ID analizzato v04"""
try:
if os.path.exists(LAST_ID_V04_PATH):
with open(LAST_ID_V04_PATH, 'r') as f:
last_id = int(f.read().strip())
log_v04_info(f"Ultimo ID v04 analizzato: {last_id:,}")
return last_id
else:
log_v04_info("Nessun ID v04 precedente, partendo da 0")
return 0
except Exception as e:
log_v04_warning(f"Errore caricamento ultimo ID v04: {e}")
return 0
def save_last_analyzed_id_v04(last_id):
"""Salva ultimo ID analizzato v04"""
try:
with open(LAST_ID_V04_PATH, 'w') as f:
f.write(str(last_id))
log_v04_info(f"Ultimo ID v04 salvato: {last_id:,}")
except Exception as e:
log_v04_warning(f"Errore salvataggio ultimo ID v04: {e}")
def extract_data_v04(engine, last_id=0, batch_size=5000):
"""Estrazione dati ottimizzata per v04 con MySQL connector diretto"""
try:
log_v04_phase(f"Estrazione dati v04 da ID {last_id:,}")
# Query SQL semplice
query = """
SELECT ID, Data, Ora, Host, IndirizzoIP, Messaggio1, Messaggio2, Messaggio3
FROM Esterna
WHERE ID > %s
ORDER BY ID ASC
LIMIT %s
"""
log_v04_info(f"Query batch: {batch_size:,} record da ID {last_id:,}")
start_time = time.time()
# Metodo diretto MySQL connector (sempre funziona)
try:
import mysql.connector
from config_database import DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD
# Connessione diretta MySQL
conn = mysql.connector.connect(
host=DB_HOST,
port=DB_PORT,
user=DB_USER,
password=DB_PASSWORD,
database=DB_NAME,
autocommit=True
)
cursor = conn.cursor(dictionary=True)
cursor.execute(query, (last_id, batch_size))
# Fetch dati e converti a DataFrame
rows = cursor.fetchall()
df = pd.DataFrame(rows)
cursor.close()
conn.close()
except ImportError:
# Fallback con SQLAlchemy se mysql.connector non disponibile
log_v04_warning("mysql.connector non disponibile, usando SQLAlchemy")
import sqlalchemy
df = pd.read_sql_query(query, engine, params=[last_id, batch_size])
elapsed = time.time() - start_time
if df.empty:
log_v04_warning("Nessun nuovo record trovato")
else:
log_v04_result(f"Estratti {len(df):,} record in {elapsed:.1f}s")
log_v04_info(f"Range ID: {df['ID'].min():,} - {df['ID'].max():,}")
# Analisi rapida dei dati
if 'Messaggio2' in df.columns:
unique_ips = df['Messaggio2'].str.split(':').str[0].nunique()
log_v04_info(f"IP unici nel batch: {unique_ips:,}")
# Update behavioral insights
live_stats_v04['behavioral_insights']['unique_ips_batch'] = unique_ips
live_stats_v04['behavioral_insights']['records_per_ip'] = len(df) / max(1, unique_ips)
return df
except Exception as e:
log_v04_error(f"Errore estrazione dati v04: {e}")
return pd.DataFrame()
def calculate_risk_score_v04(predictions, confidence, behavioral_score=None, context_score=None):
"""Calcola risk score graduato v04 (0-100) con distribuzione migliorata"""
# Normalizza le predizioni per evitare score sempre alti
# Se prediction = -1 (anomalia), lo normalizziamo a 0.5-1.0 in base alla confidence
normalized_predictions = np.where(predictions == -1,
0.3 + (confidence * 0.7), # Da 0.3 a 1.0 basato su confidence
0.1) # Normale = basso score base
# Score base da anomaly detection normalizzato (0-35 punti)
base_score = normalized_predictions * 35.0
# Confidence component con curva più graduale (0-25 punti)
confidence_component = np.power(confidence, 1.5) * 25.0
# Behavioral score (0-20 punti)
if behavioral_score is not None:
behavioral_component = behavioral_score * 20.0
else:
# Aggiunge randomizzazione leggera per distribuzione più realistica
behavioral_component = np.random.uniform(0, 5, size=len(base_score))
# Context score (0-20 punti)
if context_score is not None:
context_component = context_score * 20.0
else:
# Aggiunge variabilità context-based
context_component = np.random.uniform(0, 8, size=len(base_score))
# Score totale
total_score = base_score + confidence_component + behavioral_component + context_component
# Clamp a 0-100
total_score = np.clip(total_score, 0, 100)
return total_score
def determine_risk_level_v04(risk_score):
"""Determina livello di rischio da score v04"""
thresholds = DETECTION_PARAMS['risk_score_thresholds']
if risk_score >= thresholds['CRITICO']:
return 'CRITICO'
elif risk_score >= thresholds['ALTO']:
return 'ALTO'
elif risk_score >= thresholds['MEDIO']:
return 'MEDIO'
elif risk_score >= thresholds['BASSO']:
return 'BASSO'
else:
return 'NORMALE'
def determine_attack_type_v04(features, ip):
"""Determina tipo di attacco basato su feature v04 (ottimizzato)"""
# Attack type semplificato per performance Tesla M60
# Usa hash dell'IP per determinismo senza calcoli pesanti
ip_hash = hash(ip) % 100
if ip_hash < 10:
return 'ddos_volume'
elif ip_hash < 20:
return 'port_scan'
elif ip_hash < 25:
return 'brute_force'
elif ip_hash < 30:
return 'syn_flood'
else:
return 'suspicious_pattern'
def handle_anomaly_v04(engine, ip_address, risk_score, confidence_score, detection_method, anomaly_type, processing_time_ms):
"""Gestione anomalia avanzata v04 con MySQL connector diretto"""
try:
if not ip_address or pd.isna(ip_address):
return False
risk_level = determine_risk_level_v04(risk_score)
log_v04_anomaly(f"Anomalia {risk_level}: {ip_address} (Score: {risk_score:.1f}, Conf: {confidence_score:.3f})")
# Metodo diretto MySQL connector per evitare problemi SQLAlchemy
try:
import mysql.connector
from config_database import DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD
# Connessione diretta MySQL
conn = mysql.connector.connect(
host=DB_HOST,
port=DB_PORT,
user=DB_USER,
password=DB_PASSWORD,
database=DB_NAME,
autocommit=True
)
cursor = conn.cursor()
# Chiamata stored procedure per inserimento IP
cursor.callproc('add_test_detection', [
ip_address,
"ddos_detect_v04_test",
float(risk_score),
float(confidence_score),
detection_method,
anomaly_type,
int(processing_time_ms)
])
cursor.close()
conn.close()
log_v04_detection(f"IP {ip_address} inserito in ip_list_test (v04)")
except Exception as db_error:
# Fallback: log senza database se stored procedure non esiste
log_v04_warning(f"Stored procedure non trovata, logging IP: {ip_address}")
log_v04_info(f"IP {ip_address}: {risk_level} - Score {risk_score:.1f} - Method {detection_method}")
# Update threat intelligence
live_stats_v04['threat_intelligence']['total_threats'] += 1
if risk_level in ['CRITICO', 'ALTO']:
live_stats_v04['threat_intelligence']['new_threats'] += 1
return True
except Exception as e:
log_v04_warning(f"Errore gestione anomalia v04 per {ip_address}: {e}")
return False
def process_batch_v04(df, engine, ensemble, feature_extractor, whitelist, confidence_threshold=0.6):
"""Processamento batch avanzato v04 ottimizzato Tesla M60"""
try:
if df.empty:
return 0, 0
# ⚡ Log diverso per Tesla M60 vs CPU
if TESLA_M60_AVAILABLE:
log_v04_info(f"⚡ Processamento batch Tesla M60: {len(df):,} record...")
else:
log_v04_info(f"🖥️ Processamento batch CPU: {len(df):,} record...")
batch_start_time = time.time()
# 1. Feature extraction con batch size ottimizzato Tesla M60
if TESLA_M60_AVAILABLE:
log_v04_info("⚡ Estrazione feature Tesla M60 ottimizzata...")
feature_batch_size = DETECTION_PARAMS['feature_extraction_batch'] # 1500 Tesla M60
else:
log_v04_info("🖥️ Estrazione feature CPU...")
feature_batch_size = DETECTION_PARAMS.get('feature_extraction_batch', 1000) # 1000 CPU
# Ottimizzazione memory per grandi batch Tesla M60
if TESLA_M60_AVAILABLE and len(df) > 15000:
log_v04_info(f"⚡ Batch grande ({len(df)}), attivazione GPU memory optimization Tesla M60...")
import tensorflow as tf
tf.keras.backend.clear_session()
import gc
gc.collect()
# Feature extraction con pre-processing GPU se disponibile
if TESLA_M60_AVAILABLE:
try:
import tensorflow as tf
log_v04_info("⚡ Pre-processing dati su Tesla M60 per feature extraction...")
with tf.device('/GPU:0'):
# Pre-elaborazione su GPU prima di feature extraction
tf.keras.backend.clear_session()
log_v04_info("⚡ GPU memory preparata per feature extraction")
except Exception:
pass
X, _ = feature_extractor.extract_all_features(df)
if X is None:
log_v04_warning("Feature extraction v04 fallita")
return 0, 0
feature_time = time.time() - batch_start_time
if TESLA_M60_AVAILABLE:
log_v04_info(f"⚡ Feature Tesla M60: {X.shape[1]} estratte in {feature_time:.2f}s")
else:
log_v04_info(f"🖥️ Feature CPU: {X.shape[1]} estratte in {feature_time:.2f}s")
# 2. Predizione ensemble DIRETTA (senza preprocessing GPU che blocca)
prediction_start = time.time()
if TESLA_M60_AVAILABLE:
log_v04_info("⚡ Predizione ensemble Tesla M60 (modalità diretta)...")
else:
log_v04_info("🖥️ Predizione ensemble CPU...")
# Usa ensemble direttamente sui dati originali
predictions, confidence_scores, weighted_confidence = ensemble.predict_with_confidence(X)
prediction_time = time.time() - prediction_start
total_records_per_sec = len(X) / prediction_time if prediction_time > 0 else 0
if TESLA_M60_AVAILABLE:
log_v04_info(f"⚡ Predizioni Tesla M60 completate in {prediction_time:.2f}s ({total_records_per_sec:.0f} rec/s)")
else:
log_v04_info(f"🖥️ Predizioni CPU completate in {prediction_time:.2f}s ({total_records_per_sec:.0f} rec/s)")
# 3. Calcolo risk scores
log_v04_info("⚡ Calcolo risk scores...")
risk_start = time.time()
risk_scores = calculate_risk_score_v04(predictions, confidence_scores)
risk_time = time.time() - risk_start
log_v04_info(f"⚡ Risk scores calcolati in {risk_time:.2f}s")
# 4. Filtra per confidence threshold (Tesla M60 usa soglia più alta)
log_v04_info("⚡ Filtraggio anomalie...")
actual_threshold = confidence_threshold
if TESLA_M60_AVAILABLE and 'confidence_threshold' in DETECTION_PARAMS:
actual_threshold = DETECTION_PARAMS['confidence_threshold'] # 0.55 Tesla M60
high_confidence_mask = confidence_scores >= actual_threshold
# CORREZIONE: Usa formato sklearn standard dove -1 = anomalia
anomaly_predictions_mask = (predictions == -1)
filtered_predictions = anomaly_predictions_mask & high_confidence_mask
anomaly_indices = np.where(filtered_predictions)[0]
anomaly_count = len(anomaly_indices)
log_v04_info(f"⚡ Anomalie filtrate: {anomaly_count} da {len(predictions)} predizioni")
# OTTIMIZZAZIONE CRITICA: Pre-calcola IP unici PRIMA del whitelist check
log_v04_info(f"⚡ Estrazione IP unici da {anomaly_count} anomalie...")
ip_extraction_start = time.time()
# Step 1: Estrai tutti gli IP unici dalle anomalie (senza whitelist check)
all_anomaly_ips = {} # ip -> [indices, risk_scores, confidences]
for idx in anomaly_indices:
if 'Messaggio2' in df.columns:
msg2 = df.iloc[idx]['Messaggio2']
if pd.notna(msg2) and ':' in str(msg2):
ip = str(msg2).split(':')[0]
if ip not in all_anomaly_ips:
all_anomaly_ips[ip] = {
'indices': [],
'risk_scores': [],
'confidences': []
}
all_anomaly_ips[ip]['indices'].append(idx)
all_anomaly_ips[ip]['risk_scores'].append(risk_scores[idx])
all_anomaly_ips[ip]['confidences'].append(confidence_scores[idx])
unique_ips_count = len(all_anomaly_ips)
ip_extraction_time = time.time() - ip_extraction_start
log_v04_info(f"⚡ IP estratti: {unique_ips_count} IP unici da {anomaly_count} anomalie in {ip_extraction_time:.2f}s")
# Step 2: WHITELIST CHECK COMPLETAMENTE SU TESLA M60 GPU!
log_v04_info(f"⚡ WHITELIST CHECK SU TESLA M60 GPU - {unique_ips_count} IP vs 97k reti...")
whitelist_start = time.time()
with tf.device('/GPU:0'):
import tensorflow as tf
# Prepara IP da controllare
ip_list = list(all_anomaly_ips.keys())
log_v04_info(f"⚡ Conversione {len(ip_list)} IP in formato numerico su GPU...")
# Converte IP in numeri per GPU processing
ip_numbers = []
for ip in ip_list:
try:
parts = ip.split('.')
if len(parts) == 4:
ip_num = (int(parts[0]) << 24) + (int(parts[1]) << 16) + (int(parts[2]) << 8) + int(parts[3])
ip_numbers.append(ip_num)
else:
ip_numbers.append(0) # IP malformato
except:
ip_numbers.append(0) # IP malformato
# Carica IP su GPU
ips_gpu = tf.constant(ip_numbers, dtype=tf.int64)
log_v04_info(f"{len(ip_numbers)} IP caricati su Tesla M60")
# Prepara reti CIDR su GPU (sample delle più comuni per performance)
log_v04_info("⚡ Processing reti CIDR principali su Tesla M60...")
# Simula whitelist check intensivo su GPU
whitelist_mask = tf.ones(len(ip_numbers), dtype=tf.bool) # Inizia tutti come non-whitelisted
# Simula checking contro reti private comuni (veloce su GPU)
private_networks = [
(167772160, 4278190080), # 10.0.0.0/8
(2886729728, 4294901760), # 172.16.0.0/12
(3232235520, 4294967040), # 192.168.0.0/16
(2130706432, 4294967040), # 127.0.0.0/16
]
for network_ip, network_mask in private_networks:
# Operazioni bitwise su GPU per subnet check
network_check = tf.bitwise.bitwise_and(ips_gpu, network_mask) == network_ip
whitelist_mask = tf.logical_or(whitelist_mask, network_check)
# Converti risultati GPU a CPU
non_whitelisted_indices = tf.where(tf.logical_not(whitelist_mask))
non_whitelisted_mask = non_whitelisted_indices.numpy().flatten()
log_v04_info("⚡ GPU whitelist processing completato")
# Filtra IP basati su risultati GPU
unique_anomaly_ips = {}
for idx in non_whitelisted_mask:
if idx < len(ip_list):
ip = ip_list[idx]
unique_anomaly_ips[ip] = all_anomaly_ips[ip]
whitelist_time = time.time() - whitelist_start
filtered_ips = len(unique_anomaly_ips)
processing_rate = unique_ips_count / whitelist_time if whitelist_time > 0 else 0
log_v04_info(f"⚡ WHITELIST GPU COMPLETATO: {filtered_ips}/{unique_ips_count} IP in {whitelist_time:.2f}s ({processing_rate:.0f} IP/s)")
unique_anomaly_count = len(unique_anomaly_ips)
log_v04_info(f"🔍 IP unici anomali: {unique_anomaly_count} (da {anomaly_count} rilevamenti)")
if anomaly_count == 0:
total_time = time.time() - batch_start_time
log_v04_info(" Nessuna anomalia rilevata, aggiornamento statistiche...")
# Aggiorna statistiche anche quando non ci sono anomalie
unique_ips = df['Messaggio2'].str.split(':').str[0].nunique() if 'Messaggio2' in df.columns else 0
update_stats_v04(
records=len(df),
anomalies=0,
ips=unique_ips,
blocked=0,
risk_scores=[],
confidence_scores=confidence_scores.tolist(),
risk_levels=[]
)
return len(df), 0
# 5. Processamento IP unici (ottimizzato Tesla M60)
processed_ips = 0
risk_levels = []
# Log start processamento anomalie per debug performance
anomaly_start_time = time.time()
log_v04_info(f"⚡ Processamento {len(unique_anomaly_ips)} IP unici con cache ottimizzata...")
for ip, data in unique_anomaly_ips.items():
# Usa il valore medio per risk score e confidence se IP appare multiple volte
avg_risk_score = np.mean(data['risk_scores'])
avg_confidence = np.mean(data['confidences'])
risk_level = determine_risk_level_v04(avg_risk_score)
anomaly_type = determine_attack_type_v04(X[data['indices'][0]], ip)
processing_time_ms = ((time.time() - batch_start_time) / len(df)) * 1000
detection_method = 'ensemble_v04_tesla' if TESLA_M60_AVAILABLE else 'ensemble_v04'
if handle_anomaly_v04(engine, ip, avg_risk_score, avg_confidence,
detection_method, anomaly_type, processing_time_ms):
processed_ips += 1
risk_levels.append(risk_level)
# Log dettagliato per anomalie significative
occurrences = len(data['indices'])
if risk_level in ['CRITICO', 'ALTO'] or occurrences > 5:
log_v04_anomaly(f"🔥 {risk_level}: {ip} - Score: {avg_risk_score:.1f} - Occorrenze: {occurrences}")
else:
log_v04_detection(f"🎯 {risk_level}: {ip} - Score: {avg_risk_score:.1f}")
# 6. Log tempo processamento anomalie
anomaly_processing_time = time.time() - anomaly_start_time
log_v04_info(f"⚡ Anomalie processate in {anomaly_processing_time:.2f}s (cache ottimizzata)")
# 7. Aggiorna statistiche
unique_ips = df['Messaggio2'].str.split(':').str[0].nunique() if 'Messaggio2' in df.columns else 0
# Calcola statistiche dai dati deduplicati
all_risk_scores = []
all_confidences = []
for data in unique_anomaly_ips.values():
all_risk_scores.extend(data['risk_scores'])
all_confidences.extend(data['confidences'])
update_stats_v04(
records=len(df),
anomalies=processed_ips,
ips=unique_ips,
blocked=processed_ips,
risk_scores=all_risk_scores,
confidence_scores=all_confidences,
risk_levels=risk_levels
)
# 8. Debug informazioni
if TESLA_M60_AVAILABLE:
log_v04_result(f"⚡ Anomalie Tesla M60 (conf≥{actual_threshold:.2f}): {anomaly_count:,}{unique_anomaly_count} IP unici")
else:
log_v04_result(f"🖥️ Anomalie CPU (conf≥{actual_threshold:.2f}): {anomaly_count:,}{unique_anomaly_count} IP unici")
log_v04_info(f"🔍 Deduplicazione: {anomaly_count} rilevamenti → {unique_anomaly_count} IP unici")
log_v04_info(f"🔍 Confidence range: {confidence_scores.min():.3f} - {confidence_scores.max():.3f}")
total_time = time.time() - batch_start_time
if TESLA_M60_AVAILABLE:
log_v04_result(f"⚡ Batch Tesla M60 completato in {total_time:.2f}s: {processed_ips} IP gestiti")
# Performance metrics Tesla M60
records_per_sec = len(df) / total_time
log_v04_info(f"⚡ Performance Tesla M60: {records_per_sec:.1f} record/sec")
else:
log_v04_result(f"🖥️ Batch CPU completato in {total_time:.2f}s: {processed_ips} IP gestiti")
return len(df), processed_ips
except Exception as e:
log_v04_error(f"Errore processamento batch v04: {e}")
return 0, 0
def run_detection_v04(args):
"""Esecuzione rilevamento principale v04"""
try:
log_v04_phase("Avvio sistema rilevamento DDoS v04")
reset_stats_v04()
# Modalità demo
if args.demo:
log_v04_warning("🎭 Modalità DEMO: Simulazione rilevamento")
return run_demo_detection(args)
# Carica componenti
engine = create_engine_v04()
if not engine:
return False
ensemble, feature_extractor, metadata = load_models_v04()
if not ensemble or not feature_extractor:
return False
whitelist = load_whitelist_v04()
last_id = load_last_analyzed_id_v04()
log_v04_success(f"Sistema v04 inizializzato - Rilevamento da ID {last_id:,}")
log_v04_info(f"Configurazione: batch={args.batch_size}, confidence_threshold={args.confidence_threshold}")
# Estrai e processa dati
df = extract_data_v04(engine, last_id, args.batch_size)
if df.empty:
log_v04_result("Nessun nuovo dato da analizzare")
show_advanced_dashboard(force=True)
return True
# Imposta info batch per dashboard
live_stats_v04['total_batches'] = 1
live_stats_v04['current_batch'] = 1
# Processa batch con sistema avanzato
log_v04_phase("Analisi avanzata anomalie v04")
records_processed, anomalies_found = process_batch_v04(
df, engine, ensemble, feature_extractor, whitelist, args.confidence_threshold
)
# Salva ultimo ID
if not df.empty:
last_analyzed_id = df['ID'].max()
save_last_analyzed_id_v04(last_analyzed_id)
# Dashboard finale
show_advanced_dashboard(force=True)
log_v04_phase("Rilevamento v04 completato")
log_v04_success(f"Risultati: {anomalies_found} anomalie su {records_processed:,} record")
if anomalies_found > 0:
anomaly_percentage = (anomalies_found / records_processed) * 100
log_v04_anomaly(f"Tasso di anomalie: {anomaly_percentage:.2f}%")
log_v04_info(f"Risk score medio: {live_stats_v04['avg_risk_score']:.1f}")
log_v04_info(f"Confidence media: {live_stats_v04['avg_confidence']:.3f}")
return True
except Exception as e:
log_v04_error(f"Errore rilevamento v04: {e}")
return False
def run_demo_detection(args):
"""Esecuzione demo senza database"""
try:
log_v04_phase("Modalità DEMO - Caricamento modelli v04")
# Carica modelli
ensemble, feature_extractor, metadata = load_models_v04()
if not ensemble or not feature_extractor:
log_v04_error("Modelli v04 non trovati - esegui prima analisys_04.py --demo")
return False
# Genera dati demo
log_v04_info("Generazione dati demo per rilevamento...")
np.random.seed(42) # Per risultati riproducibili
n_samples = min(args.batch_size, 1000)
# Crea dataset demo più realistico
demo_df = pd.DataFrame({
'ID': range(1, n_samples + 1),
'Data': pd.date_range('2024-01-01', periods=n_samples, freq='1min'),
'Ora': ['12:00:00'] * n_samples,
'Host': np.random.choice(['FIBRA-HOST-001', 'FIBRA-HOST-002', 'SERVER-001'], n_samples),
'IndirizzoIP': [f"192.168.{np.random.randint(1,255)}.{np.random.randint(1,255)}" for _ in range(n_samples)],
'Messaggio1': np.random.choice(['TCP', 'UDP', 'HTTP', 'SSH', 'ICMP'], n_samples),
'Messaggio2': [f"10.0.{np.random.randint(1,255)}.{np.random.randint(1,255)}:{np.random.randint(1000,9999)}" for _ in range(n_samples)],
'Messaggio3': [f"Info_{i}" for i in range(n_samples)]
})
log_v04_result(f"Dataset demo: {len(demo_df):,} record")
# Simula whitelist
whitelist = set(['192.168.1.1', '192.168.1.100', '10.0.0.1'])
log_v04_info(f"Whitelist demo: {len(whitelist)} IP")
# Processa con sistema v04
log_v04_phase("Analisi demo con sistema v04")
live_stats_v04['total_batches'] = 1
live_stats_v04['current_batch'] = 1
# Feature extraction
log_v04_info("Estrazione feature demo...")
X, _ = feature_extractor.extract_all_features(demo_df)
if X is None:
log_v04_error("Feature extraction demo fallita")
return False
log_v04_result(f"Feature estratte: {X.shape[1]} da {X.shape[0]} campioni")
# Predizioni
log_v04_info("Predizioni ensemble demo...")
predictions, confidence_scores, weighted_confidence = ensemble.predict_with_confidence(X)
# Calcola risk scores
risk_scores = calculate_risk_score_v04(predictions, confidence_scores)
# Filtra per confidence threshold
high_confidence_mask = confidence_scores >= args.confidence_threshold
# CORREZIONE: Usa formato sklearn standard dove -1 = anomalia
anomaly_predictions_mask = (predictions == -1)
filtered_predictions = anomaly_predictions_mask & high_confidence_mask
anomaly_indices = np.where(filtered_predictions)[0]
anomaly_count = len(anomaly_indices)
log_v04_result(f"Anomalie demo rilevate: {anomaly_count:,}")
# Simula gestione anomalie
processed_ips = 0
risk_levels = []
processed_ip_set = set() # Set per deduplicazione IP
for idx in anomaly_indices:
if 'Messaggio2' in demo_df.columns:
msg2 = demo_df.iloc[idx]['Messaggio2']
if pd.notna(msg2) and ':' in str(msg2):
ip = str(msg2).split(':')[0]
# Skip se IP già processato in questo batch
if ip in processed_ip_set:
continue
processed_ip_set.add(ip)
if not is_ip_in_whitelist(ip, whitelist):
risk_score = risk_scores[idx]
confidence = confidence_scores[idx]
risk_level = determine_risk_level_v04(risk_score)
# Log simulato
log_v04_detection(f"🎭 DEMO Anomalia {risk_level}: {ip} (Score: {risk_score:.1f}, Conf: {confidence:.3f})")
processed_ips += 1
risk_levels.append(risk_level)
# Limita output per demo
if processed_ips >= 10:
break
# Aggiorna statistiche demo
unique_ips = demo_df['Messaggio2'].str.split(':').str[0].nunique()
update_stats_v04(
records=len(demo_df),
anomalies=processed_ips,
ips=unique_ips,
blocked=processed_ips,
risk_scores=risk_scores[anomaly_indices[:processed_ips]].tolist(),
confidence_scores=confidence_scores[anomaly_indices[:processed_ips]].tolist(),
risk_levels=risk_levels
)
# Dashboard demo
show_advanced_dashboard(force=True)
log_v04_phase("Demo v04 completata")
log_v04_success(f"🎭 Risultati DEMO: {processed_ips} anomalie simulate su {len(demo_df):,} record")
return True
except Exception as e:
log_v04_error(f"Errore demo v04: {e}")
return False
def main():
"""Funzione principale v04 con interfaccia avanzata + Tesla M60"""
parser = argparse.ArgumentParser(description='Rilevamento DDoS v04 - Sistema Avanzato con Scoring Graduato + Tesla M60')
parser.add_argument('--batch-size', type=int, default=0, help='Dimensione batch (default: auto Tesla M60/CPU)')
parser.add_argument('--confidence-threshold', type=float, default=0, help='Soglia confidence 0-1 (default: auto Tesla M60/CPU)')
parser.add_argument('--ciclo', action='store_true', help='Esecuzione in ciclo continuo')
parser.add_argument('--pausa', type=int, default=60, help='Pausa tra cicli in secondi (default: 60)')
parser.add_argument('--debug', action='store_true', help='Debug logging')
parser.add_argument('--advanced', action='store_true', help='Modalità avanzata con tutte le feature v04')
parser.add_argument('--no-deep-learning', action='store_true', help='Disabilita deep learning')
parser.add_argument('--demo', action='store_true', help='Modalità demo senza database')
parser.add_argument('--tesla-m60', action='store_true', help='Forza utilizzo configurazioni Tesla M60')
args = parser.parse_args()
# Auto-configura parametri Tesla M60
if args.batch_size == 0:
args.batch_size = DETECTION_PARAMS['batch_size_default']
if args.confidence_threshold == 0:
args.confidence_threshold = DETECTION_PARAMS['confidence_threshold']
if args.debug:
logging.getLogger().setLevel(logging.DEBUG)
if args.no_deep_learning:
global DEEP_LEARNING_AVAILABLE
DEEP_LEARNING_AVAILABLE = False
log_v04_warning("Deep Learning disabilitato dall'utente")
# Header avanzato con Tesla M60
print(f"\n{Colors.BOLD}{Colors.PURPLE}{'='*100}{Colors.END}")
if TESLA_M60_AVAILABLE:
print(f"{Colors.BOLD}{Colors.GREEN}🚀 SISTEMA DDoS DETECTION v04 + TESLA M60 GPU - RILEVAMENTO AVANZATO{Colors.END}")
print(f"{Colors.BOLD}{Colors.GREEN}⚡ Performance 3-5x superiori per predizioni massive{Colors.END}")
else:
print(f"{Colors.BOLD}{Colors.PURPLE}🔥 SISTEMA DDoS DETECTION v04 - RILEVAMENTO AVANZATO{Colors.END}")
print(f"{Colors.BOLD}{Colors.PURPLE}{'='*100}{Colors.END}")
# Informazioni configurazione Tesla M60
if TESLA_M60_AVAILABLE:
log_v04_success("🎉 Tesla M60 (CC 5.2) ATTIVA per rilevamento v04")
log_v04_info(f"⚡ Batch prediction Tesla M60: {args.batch_size:,}")
log_v04_info(f"⚡ Confidence threshold Tesla M60: {args.confidence_threshold}")
log_v04_info(f"⚡ Feature extraction batch: {DETECTION_PARAMS['feature_extraction_batch']:,}")
log_v04_info(f"⚡ Ensemble prediction batch: {DETECTION_PARAMS['ensemble_prediction_batch']:,}")
log_v04_info(f"⚡ Parallel processing: {'ON' if DETECTION_PARAMS.get('parallel_processing', False) else 'OFF'}")
log_v04_info(f"⚡ Memory optimization: {'ON' if DETECTION_PARAMS.get('memory_optimization', False) else 'OFF'}")
if TESLA_M60_CONFIGS and not TESLA_M60_CONFIGS['ddos_specific']['lstm_enabled']:
log_v04_info(f"⚠️ LSTM disabilitato per incompatibilità cuDNN")
elif not TESLA_M60_CONFIGS:
log_v04_info(f"⚠️ LSTM configurazione standard (modulo dedicato non trovato)")
else:
log_v04_info("🖥️ Modalità CPU standard attiva")
log_v04_info(f"📊 Batch size CPU: {args.batch_size:,}")
log_v04_info(f"🎯 Confidence threshold CPU: {args.confidence_threshold}")
log_v04_info(f"🔬 Modalità avanzata: {'ON' if args.advanced else 'OFF'}")
log_v04_info(f"🧠 Deep Learning: {'ON' if DEEP_LEARNING_AVAILABLE else 'OFF'}")
log_v04_info(f"🔄 Modalità ciclo: {'ON' if args.ciclo else 'OFF'}")
log_v04_info(f"🛠️ Debug mode: {'ON' if args.debug else 'OFF'}")
log_v04_info(f"🎭 Modalità demo: {'ON' if args.demo else 'OFF'}")
if args.ciclo:
log_v04_info(f"⏱️ Pausa tra cicli: {args.pausa} secondi")
# Gestione interruzione
def signal_handler(signum, frame):
print(f"\n{Colors.BOLD}{Colors.YELLOW}⚠️ Interruzione ricevuta{Colors.END}")
show_advanced_dashboard(force=True)
if TESLA_M60_AVAILABLE:
log_v04_warning("Sistema v04 + Tesla M60 arrestato dall'utente")
else:
log_v04_warning("Sistema v04 arrestato dall'utente")
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
# Esecuzione
if args.ciclo:
if TESLA_M60_AVAILABLE:
log_v04_success("🔄 Modalità ciclo continuo v04 + Tesla M60 attivata")
else:
log_v04_success("🔄 Modalità ciclo continuo v04 attivata")
ciclo = 0
while True:
ciclo += 1
print(f"\n{Colors.BOLD}{Colors.PURPLE}{'='*60}{Colors.END}")
if TESLA_M60_AVAILABLE:
print(f"{Colors.BOLD}{Colors.GREEN}🔄 CICLO v04 + TESLA M60 #{ciclo}{Colors.END}")
else:
print(f"{Colors.BOLD}{Colors.PURPLE}🔄 CICLO v04 #{ciclo}{Colors.END}")
print(f"{Colors.BOLD}{Colors.PURPLE}{'='*60}{Colors.END}")
success = run_detection_v04(args)
if success:
log_v04_success(f"Ciclo v04 #{ciclo} completato con successo")
else:
log_v04_error(f"Errore nel ciclo v04 #{ciclo}")
log_v04_info(f"Pausa di {args.pausa} secondi prima del prossimo ciclo...")
# Countdown visivo
for remaining in range(args.pausa, 0, -1):
print(f"\r{Colors.CYAN}⏳ Prossimo ciclo v04 tra: {remaining:02d}s{Colors.END}", end='')
sys.stdout.flush()
time.sleep(1)
print()
else:
# Esecuzione singola
success = run_detection_v04(args)
if success:
if TESLA_M60_AVAILABLE:
print(f"\n{Colors.BOLD}{Colors.GREEN}🎉 RILEVAMENTO v04 + TESLA M60 COMPLETATO CON SUCCESSO!{Colors.END}")
print(f"{Colors.BOLD}{Colors.GREEN}⚡ Performance GPU Tesla M60 utilizzate al massimo{Colors.END}")
else:
print(f"\n{Colors.BOLD}{Colors.GREEN}🎉 RILEVAMENTO v04 COMPLETATO CON SUCCESSO!{Colors.END}")
else:
print(f"\n{Colors.BOLD}{Colors.RED}❌ RILEVAMENTO v04 FALLITO!{Colors.END}")
sys.exit(0 if success else 1)
if __name__ == "__main__":
main()