mirror of
https://github.com/Oxbian/SIDPS.git
synced 2025-07-07 04:14:46 +02:00
feat: config file + database connection / dockerfile
This commit is contained in:
5
sql/adduser.sql
Normal file
5
sql/adduser.sql
Normal file
@ -0,0 +1,5 @@
|
||||
CREATE DATABASE sidps DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
|
||||
CREATE USER 'sidps'@'localhost' IDENTIFIED BY 'SUPERPASSWORD';
|
||||
GRANT ALL PRIVILEGES ON sidps.* TO 'sidps'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
use sidps;
|
156
sql/cef-generator.py
Normal file
156
sql/cef-generator.py
Normal file
@ -0,0 +1,156 @@
|
||||
# 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, event_gravite, device_product,
|
||||
device_vendor, device_version, alerte_name, sourceAddress,
|
||||
destinationAddress, destinationPort, sourcePort, protocol,
|
||||
applicationProtocol, reason, action, commentaire
|
||||
) VALUES (
|
||||
%(cef_version)s, %(date_alerte)s, %(event_gravite)s, %(device_product)s,
|
||||
%(device_vendor)s, %(device_version)s, %(alerte_name)s, %(src)s,
|
||||
%(dst)s, %(destinationPort)s, %(sourcePort)s, %(protocol)s,
|
||||
%(applicationProtocol)s, %(reason)s, %(action)s, %(commentaire)s
|
||||
);
|
||||
"""
|
||||
|
||||
# Paramètres pour la requête SQL
|
||||
params = {
|
||||
"cef_version": merged["CEF"],
|
||||
"date_alerte": datetime.now(),
|
||||
"event_gravite": int(merged["agent_severity"]),
|
||||
"device_product": merged["Device Product"],
|
||||
"device_vendor": merged["Device Vendor"],
|
||||
"device_version": merged["Device Version"],
|
||||
"alerte_name": merged["name"],
|
||||
"src": merged["src"],
|
||||
"dst": merged["dst"],
|
||||
"destinationPort": None, # A définir si disponible
|
||||
"sourcePort": None, # A définir si disponible
|
||||
"protocol": "TCP", # Par défaut, à adapter si besoin
|
||||
"applicationProtocol": "N/A", # À ajuster en fonction des besoins
|
||||
"reason": "Suspicious activity detected", # Exemple, à adapter
|
||||
"action": "Alerted", # Exemple d'action
|
||||
"commentaire": "" # Optionnel
|
||||
}
|
||||
|
||||
# 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()
|
||||
|
||||
# En-têtes généraux
|
||||
CEF_version = 1
|
||||
Device_vendor = "ArKa"
|
||||
Device_product = "SIDPS"
|
||||
Device_version = "vAlpha"
|
||||
|
||||
main_headers = {
|
||||
"CEF": CEF_version,
|
||||
"Device Vendor": Device_vendor,
|
||||
"Device Product": Device_product,
|
||||
"Device Version": Device_version
|
||||
}
|
||||
|
||||
# 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()
|
29
sql/db-schema.sql
Normal file
29
sql/db-schema.sql
Normal file
@ -0,0 +1,29 @@
|
||||
#-----------------------------------------------
|
||||
# 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
|
||||
event_gravite INT CHECK (event_gravite >= 0 AND event_gravite <= 10), -- Niveau de gravité de l'alerte sur une échelle de 0 à 10
|
||||
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
|
||||
alerte_name VARCHAR(512), -- Nom descriptif de l'alerte
|
||||
destinationAddress VARCHAR(45), -- Adresse IP de destination impliquée dans l'alerte
|
||||
sourceAddress VARCHAR(45), -- Adresse IP source impliquée dans l'alerte
|
||||
destinationPort INT, -- Port de destination utilisé pour l'événement ou l'alerte
|
||||
sourcePort INT, -- Port source de l'événement ou de l'alerte
|
||||
protocol VARCHAR(10), -- Protocole réseau impliqué (ex : TCP, UDP)
|
||||
applicationProtocol VARCHAR(20), -- Protocole applicatif impliqué (ex : HTTP, FTP)
|
||||
reason TEXT, -- Description de la raison de l'alerte expliquant pourquoi elle a été générée
|
||||
action VARCHAR(50), -- Action entreprise en réponse à l'alerte (ex : bloqué, alerté uniquement, ...)
|
||||
commentaire TEXT -- Champ texte pour des notes ou commentaires additionnels concernant l'alerte
|
||||
);
|
35
sql/init.sql
Normal file
35
sql/init.sql
Normal file
@ -0,0 +1,35 @@
|
||||
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
|
||||
event_gravite INT CHECK (event_gravite >= 0 AND event_gravite <= 10), -- Niveau de gravité de l'alerte sur une échelle de 0 à 10
|
||||
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
|
||||
alerte_name VARCHAR(512), -- Nom descriptif de l'alerte
|
||||
destinationAddress VARCHAR(45), -- Adresse IP de destination impliquée dans l'alerte
|
||||
sourceAddress VARCHAR(45), -- Adresse IP source impliquée dans l'alerte
|
||||
destinationPort INT, -- Port de destination utilisé pour l'événement ou l'alerte
|
||||
sourcePort INT, -- Port source de l'événement ou de l'alerte
|
||||
protocol VARCHAR(10), -- Protocole réseau impliqué (ex : TCP, UDP)
|
||||
applicationProtocol VARCHAR(20), -- Protocole applicatif impliqué (ex : HTTP, FTP)
|
||||
reason TEXT, -- Description de la raison de l'alerte expliquant pourquoi elle a été générée
|
||||
action VARCHAR(50), -- Action entreprise en réponse à l'alerte (ex : bloqué, alerté uniquement, ...)
|
||||
commentaire TEXT -- Champ texte pour des notes ou commentaires additionnels concernant l'alerte
|
||||
);
|
Reference in New Issue
Block a user