Merge branch 'main' into web

This commit is contained in:
2024-11-26 10:17:12 -05:00
35 changed files with 1467 additions and 135 deletions

150
sql/cef-generator.py Normal file
View File

@ -0,0 +1,150 @@
# Générateur d'alertes CEF (Common Event Format)
# Pratique pour le moteur de corrélation et le site web
# Une alerte CEF est formattée de cette façon:
# CEF:Version|Device Vendor|Device Product|Device Version|Device Event Class ID|Name|Severity|[Extension]
import mysql.connector
import time
import random
from datetime import datetime
def generate_alert(alert_type):
# Dictionnaire pour différents types d'alertes réseau et fichiers
alert_templates = {
"network": {
"Syn Flood": {
"Device_event_class_id": "1001",
"name": "Syn Flood Detected",
"src": f"{generate_ip()}",
"dst": f"{generate_ip()}",
"agent_severity": "8"
},
"Port Scanning": {
"Device_event_class_id": "1002",
"name": "Port Scanning Activity",
"src": f"{generate_ip()}",
"dst": f"{generate_ip()}",
"cs1": f"{generate_ports()}",
"agent_severity": "5"
}
},
"file": {
"Suspicious File Creation": {
"Device_event_class_id": "2001",
"name": "Suspicious File Created",
"fname": f"{generate_filename()}",
"fsize": f"{random.randint(10, 1000)}kb",
"agent_severity": "7"
},
"Critical File Deletion Attempt": {
"Device_event_class_id": "2002",
"name": "Critical File Deletion Attempt",
"fname": f"{generate_filename()}",
"agent_severity": "9"
}
}
}
# Sélectionner le bon template en fonction du type d'alerte
category = "network" if alert_type in alert_templates["network"] else "file"
alert_info = alert_templates[category].get(alert_type, {})
if not alert_info:
raise ValueError(f"Unknown alert type: {alert_type}")
return alert_info
def generate_ip():
# Générer une adresse IP aléatoire
return ".".join(str(random.randint(0, 255)) for _ in range(4))
def generate_ports():
# Générer une liste de ports scannés
return ",".join(str(random.randint(20, 1024)) for _ in range(5))
def generate_filename():
# Générer un nom de fichier aléatoire
filenames = ["config.txt", "database.db", "system32.dll", "passwd", "shadow", "sensitive_data.doc"]
return random.choice(filenames)
def generate_alerts(conn, cursor, main_headers):
# Récupérer ces données depuis une fonction
alertes = ["Syn Flood", "Port Scanning"] #, "Suspicious File Creation", "Critical File Deletion Attempt"]
while True:
data = generate_alert(random.choice(alertes))
merged = main_headers.copy()
merged.update(data)
# Préparer la requête SQL d'insertion
sql_query = """
INSERT INTO alertes (
cef_version, date_alerte, agent_severity, device_event_class_id,
device_product, device_vendor, device_version, name, dst, src,
dpt, spt, msg, proto, bytesin, bytesout, reason, act
) VALUES (
%(cef_version)s, %(date_alerte)s, %(agent_severity)s, %(device_event_class_id)s,
%(device_product)s, %(device_vendor)s, %(device_version)s, %(name)s, %(dst)s,
%(src)s, %(dpt)s, %(spt)s, %(msg)s, %(proto)s, %(bytesin)s, %(bytesout)s,
%(reason)s, %(act)s
);
"""
# Paramètres pour la requête SQL
params = {
"cef_version": merged["CEF"],
"date_alerte": datetime.now(),
"agent_severity": int(merged["agent_severity"]),
"device_event_class_id": None,
"device_product": merged["Device Product"],
"device_vendor": merged["Device Vendor"],
"device_version": merged["Device Version"],
"name": merged["name"],
"src": merged["src"],
"dst": merged["dst"],
"dpt": None,
"spt": None,
"msg": "Message",
"proto": "TCP",
"bytesin": None,
"bytesout": None,
"reason": "Activité suspecte",
"act": "Alert"
}
# Exécution de la requête d'insertion
cursor.execute(sql_query, params)
conn.commit()
# Attente avant de générer la prochaine alerte
time.sleep(random.randint(1, 10))
def main():
# Connexion à la base de données MySQL/MariaDB
conn = mysql.connector.connect(
host="172.20.2.10", # À adapter selon votre configuration
database="sidps", # Nom de la base de données
user="sidps", # Nom d'utilisateur
password="SUPERPASSWORD", # Mot de passe
port=3306 # Port MySQL par défaut (peut être 3306 ou autre selon la configuration)
)
cursor = conn.cursor()
main_headers = {
"CEF": 1,
"Device Vendor": "ArKa",
"Device Product": "SIDPS",
"Device Version": "vAlpha"
}
# Lancer la génération d'alertes
generate_alerts(conn, cursor, main_headers)
# Fermer la connexion à la base de données
cursor.close()
conn.close()
if __name__ == "__main__":
main()

32
sql/db-schema.sql Normal file
View File

@ -0,0 +1,32 @@
#-----------------------------------------------
# Nettoyage des tables dans la base de données
#-----------------------------------------------
DROP TABLE IF EXISTS alertes;
#-----------------------------------------------
# Table: alertes
#----------------------------------------------
CREATE TABLE alertes (
id SERIAL PRIMARY KEY, -- Identifiant unique pour chaque alerte
cef_version VARCHAR(10) DEFAULT 'CEF:1', -- Version du format CEF utilisé
date_alerte TIMESTAMP(3) NOT NULL, -- Date et heure de l'alerte avec une précision de millisecondes
agent_severity INT CHECK (agent_severity >= 0 AND agent_severity <= 10), -- Niveau de gravité de l'alerte sur une échelle de 0 à 10
device_event_class_id VARCHAR(1023), -- Identifiant de la signature permettant d'aider les moteurs de corrélations
device_product VARCHAR(63), -- Nom du produit à l'origine de l'alerte
device_vendor VARCHAR(63), -- Nom du fournisseur ou fabricant du produit
device_version VARCHAR(31), -- Version du produit ou dispositif ayant généré l'alerte
name VARCHAR(512), -- Nom descriptif de l'alerte
-- Champ d'extension du CEF
dst VARCHAR(45), -- Adresse IP de destination impliquée dans l'alerte
src VARCHAR(45), -- Adresse IP source impliquée dans l'alerte
dpt INT, -- Port de destination utilisé pour l'événement ou l'alerte
spt INT, -- Port source de l'événement ou de l'alerte
msg VARCHAR(1023), -- Champ texte pour des notes ou commentaires additionnels concernant l'alerte
proto VARCHAR(10), -- Protocole réseau impliqué (ex : TCP, UDP)
bytesin INT, -- Quantité de bytes (8 bits ici) entrant (cas de flood ou DOS)
bytesout INT, -- Quantité des bytes (8 bits ici) sortants
reason VARCHAR(1023), -- Description de la raison de l'alerte expliquant pourquoi elle a été générée
act VARCHAR(50) -- Action entreprise en réponse à l'alerte (ex : bloqué, alerté uniquement, ...)
);

37
sql/init.sql Normal file
View File

@ -0,0 +1,37 @@
CREATE DATABASE IF NOT EXISTS sidps DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'sidps'@'%' IDENTIFIED BY 'SUPERPASSWORD';
GRANT ALL PRIVILEGES ON sidps.* TO 'sidps'@'%';
FLUSH PRIVILEGES;
use sidps;
#-----------------------------------------------
# Nettoyage des tables dans la base de données
#-----------------------------------------------
DROP TABLE IF EXISTS alertes;
#-----------------------------------------------
# Table: alertes
#----------------------------------------------
CREATE TABLE alertes (
id SERIAL PRIMARY KEY, -- Identifiant unique pour chaque alerte
cef_version VARCHAR(10) DEFAULT 'CEF:1', -- Version du format CEF utilisé
date_alerte TIMESTAMP(3) NOT NULL, -- Date et heure de l'alerte avec une précision de millisecondes
agent_severity INT CHECK (agent_severity >= 0 AND agent_severity <= 10), -- Niveau de gravité de l'alerte sur une échelle de 0 à 10
device_event_class_id VARCHAR(1023), -- Identifiant de la signature permettant d'aider les moteurs de corrélations
device_product VARCHAR(63), -- Nom du produit à l'origine de l'alerte
device_vendor VARCHAR(63), -- Nom du fournisseur ou fabricant du produit
device_version VARCHAR(31), -- Version du produit ou dispositif ayant généré l'alerte
name VARCHAR(512), -- Nom descriptif de l'alerte
dst VARCHAR(45), -- Adresse IP de destination impliquée dans l'alerte
src VARCHAR(45), -- Adresse IP source impliquée dans l'alerte
dpt INT, -- Port de destination utilisé pour l'événement ou l'alerte
spt INT, -- Port source de l'événement ou de l'alerte
msg VARCHAR(1023), -- Champ texte pour des notes ou commentaires additionnels concernant l'alerte
proto VARCHAR(10), -- Protocole réseau impliqué (ex : TCP, UDP)
bytesin INT, -- Quantité de bits entrant (cas de flood ou DOS)
bytesout INT, -- Quantité des bits sortants
reason VARCHAR(1023), -- Description de la raison de l'alerte expliquant pourquoi elle a été générée
act VARCHAR(50) -- Action entreprise en réponse à l'alerte (ex : bloqué, alerté uniquement, ...)
);