From ed2ce209dffcd71ea35a56e2c24d8a29df47f020 Mon Sep 17 00:00:00 2001 From: Oxbian Date: Mon, 4 Nov 2024 17:47:31 -0500 Subject: [PATCH] feat: redis fake data script --- .gitignore | 2 + README.md | 33 +++++++++++-- requirements.txt | 2 + tests/cef-generator.py | 102 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 .gitignore create mode 100644 requirements.txt create mode 100644 tests/cef-generator.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7b67ede --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.venv +.venv/* diff --git a/README.md b/README.md index d454725..fd414b4 100644 --- a/README.md +++ b/README.md @@ -30,9 +30,36 @@ docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 redis/redis-stack:lat *Installation interface web & noyau de l'IDS* +## Structure de la base de données Redis + +La base de données Redis est structurée de la façon suivante: +- stream `logs:alertes` contenant toutes les alertes envoyés par le noyau de l'IDPS +- stream `logs:correlations` contenant toutes les corrélations d'alertes, avec un message de corrélation et les alertes corrélées + +Ces deux streams suivent la norme CEF, mais sont structurées sous la forme d'objet et non d'une seule chaine de caractère. Afin de faciliter le parsing par la suite. + +## Interface de tests d'alertes + +Un script python `tests/cef-generator.py` permet de générer des alertes CEF dans la base de données Redis. +Ce script peut être utile pour le développement d'interface d'affichage des alertes. Pour l'utiliser il faut une base de donnée redis, et mettre les identifiants dans le script. +De plus, ce script à besoin de la librairie `redis` pour pouvoir ajouter / faire des requêtes à la base de données Redis. + +Pour cela, utiliser les commandes suivantes: + +```bash +python3 -m venv .venv +source .venv/bin/activate +pip install -r requirements.txt +``` + +Puis executer le script `tests/cef-generator.py` avec le python3 du l'environnement virtuel. + +```bash +.venv/bin/python3 tests/cef-generator.py +``` + ## TODO -- Choix du format d'enregistrement des données dans Redis -- Noyau d'analyse de l'IDS -- Interface web pour visualiser les alertes / rechercher dedans +- Noyau d'analyse de l'IDS +- Interface web pour visualiser les alertes / rechercher dedans - Moteur de corrélation des alertes (récupération + renvoi dans Redis). diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..f6832c6 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +hiredis==3.0.0 +redis==5.2.0 diff --git a/tests/cef-generator.py b/tests/cef-generator.py new file mode 100644 index 0000000..b228105 --- /dev/null +++ b/tests/cef-generator.py @@ -0,0 +1,102 @@ +# 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 redis +import time +import random + +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(db, main_headers): + # Récupérer ces données depuis une fonction + alertes = ["Syn Flood", "Port Scanning", "Suspicious File Creation", "Critical File Deletion Attempt"] + + while (1): + data = generate_alert(random.choice(alertes)) + merged = main_headers.copy() + merged.update(data) + + # Ajout dans redis + response = db.xadd("logs:alertes", merged) + time.sleep(random.randint(1, 10)) + + +def main(): + + # Connexion à Redis (si besoin changer l'host et le port) + db = redis.Redis(host='localhost', port=6379, decode_responses=True) + + # Pour une db en production (https://redis.io/docs/latest/operate/oss_and_stack/management/security/acl/) + #db = redis.Redis(host="my-redis.cloud.redislabs.com", port=6379, username="default", password="secret", ssl=True, ssl_certfile="./redis_user.crt", ssl_keyfile="./redis_user_private.key", ssl_ca_certs="./redis_ca.pem") + + 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} + + generate_alerts(db, main_headers) + +if __name__ == "__main__": + main()