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
84 lines
3.7 KiB
SQL
84 lines
3.7 KiB
SQL
-- 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 |