-- File SQL per la creazione della tabella known_attackers -- Ottimizzata per gestire traffico di rete di un router con 2000+ utenti e traffico datacenter -- Eliminazione della tabella se esiste (commenta questa riga per evitare la cancellazione dei dati esistenti) -- DROP TABLE IF EXISTS known_attackers; -- Creazione della tabella known_attackers CREATE TABLE IF NOT EXISTS known_attackers ( id INT AUTO_INCREMENT PRIMARY KEY, ip_address VARCHAR(45) NOT NULL COMMENT 'Indirizzo IP del potenziale attaccante (supporta IPv4 e IPv6)', first_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'Prima volta che l\'IP è stato rilevato', last_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Ultima volta che l\'IP è stato rilevato', attack_count INT DEFAULT 1 COMMENT 'Numero di volte che l\'IP è stato rilevato come anomalo', risk_level VARCHAR(20) DEFAULT 'MEDIO' COMMENT 'Livello di rischio: BASSO, MEDIO, ALTO, CRITICO', ports_used TEXT COMMENT 'Elenco delle porte utilizzate, separate da virgole', attack_patterns TEXT COMMENT 'Pattern di attacco rilevati', network_segment VARCHAR(50) DEFAULT NULL COMMENT 'Segmento di rete di appartenenza dell\'IP', is_blocked TINYINT(1) DEFAULT 0 COMMENT 'Flag che indica se l\'IP è attualmente bloccato', notes TEXT DEFAULT NULL COMMENT 'Note e commenti aggiuntivi', last_update_user VARCHAR(50) DEFAULT 'sistema' COMMENT 'Utente che ha effettuato l\'ultimo aggiornamento', -- Indici per migliorare le prestazioni UNIQUE KEY unique_ip (ip_address), INDEX idx_risk_level (risk_level), INDEX idx_last_seen (last_seen), INDEX idx_is_blocked (is_blocked) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Tabella che tiene traccia degli IP con comportamenti anomali'; -- Creazione di una vista per gli IP ad alto rischio CREATE OR REPLACE VIEW high_risk_attackers AS SELECT * FROM known_attackers WHERE risk_level IN ('ALTO', 'CRITICO') ORDER BY last_seen DESC; -- Creazione di una vista per statistiche aggregate CREATE OR REPLACE VIEW attacker_stats AS SELECT risk_level, COUNT(*) AS num_attackers, MIN(first_seen) AS earliest_detection, MAX(last_seen) AS latest_detection, SUM(attack_count) AS total_attacks, AVG(attack_count) AS avg_attacks_per_ip FROM known_attackers GROUP BY risk_level ORDER BY CASE WHEN risk_level = 'CRITICO' THEN 1 WHEN risk_level = 'ALTO' THEN 2 WHEN risk_level = 'MEDIO' THEN 3 WHEN risk_level = 'BASSO' THEN 4 ELSE 5 END; -- Creazione di un trigger per aggiornare automaticamente il campo ports_used DELIMITER // CREATE TRIGGER IF NOT EXISTS update_ports_used BEFORE UPDATE ON known_attackers FOR EACH ROW BEGIN IF NEW.ports_used IS NULL AND NEW.ports_used <> OLD.ports_used THEN SET NEW.ports_used = OLD.ports_used; END IF; END // DELIMITER ; -- Creazione di una procedura per pulizia dati vecchi DELIMITER // CREATE PROCEDURE IF NOT EXISTS cleanup_old_attackers(IN days_threshold INT) BEGIN -- Elimina record vecchi con rischio BASSO che non sono stati visti recentemente DELETE FROM known_attackers WHERE risk_level = 'BASSO' AND last_seen < DATE_SUB(NOW(), INTERVAL days_threshold DAY); SELECT CONCAT('Rimossi ', ROW_COUNT(), ' record vecchi.') AS message; END // DELIMITER ; -- Commento finale: -- Questa tabella è progettata per gestire grandi volumi di traffico di rete. -- Per mantenere la tabella gestibile nel tempo, eseguire periodicamente: -- CALL cleanup_old_attackers(30); -- Rimuove record a basso rischio vecchi di 30+ giorni