Portfolio / Projets / network-threat-detection

Cybersécurité × Data · Projet académique en équipe

Peut-on repérer de façon fiable les attaques dans des flux réseau ?

Le projet construit un détecteur d’intrusions à partir de statistiques de flux : exploration et nettoyage des données, comparaison de trois modèles, choix d’un seuil d’alerte, puis application de démonstration utilisant le même artefact que l’évaluation.

91,6 %Attaques détectéesjeu de données de test
16,7 %Flux bénins signalésfausses alertes
0,877Macro F1jeu de données de test
≥ 99,9 %Familles d’attaqueshors Infiltration

Outils & technologies

Pythonpandasscikit-learnFlask

Démonstrateur Flask pour analyser des flux réseau.

01 / Contexte & question

Un système de détection doit alerter sur les attaques sans noyer les analystes sous les fausses alertes.

Les outils à signatures reconnaissent bien les attaques connues, mais pas leurs variantes. Un modèle de machine learning peut apprendre des comportements : volume de paquets, rythme des échanges, durée, drapeaux TCP.

Réalisé en équipe de trois étudiants ESAIP dans le cours Technical Project en 2024, le projet a obtenu 15/20. Le travail présenté couvre l’analyse des données, la modélisation, l’évaluation et l’application de démonstration, sans attribuer publiquement à une seule personne des contributions qui relèvent du travail d’équipe.

Flux réseau : chaque ligne représente un échange décrit par 64 statistiques CICFlowMeter (paquets, délais, drapeaux TCP, activité). Le modèle joue ici le rôle d’un IDS : il classe chaque flux comme bénin ou attaque.

Question : à partir de ces seules statistiques, peut-on distinguer un flux bénin d’une attaque tout en limitant les attaques manquées et les fausses alertes ?

02 / Ce qu’il faut retenir

Le modèle détecte bien les attaques connues du jeu de données, mais la vraie difficulté reste la frontière entre trafic bénin et Infiltration.

Attaques détectées91,6 %

14 540 des 15 872 flux d’attaque du test sont signalés.

Fausses alertes16,7 %

1 781 des 10 642 flux bénins sont signalés à tort : encore trop pour un usage direct sans tri complémentaire.

Point faibleInfiltration · 75 %

Les autres familles sont presque toutes reconnues à 99,9 % ou plus ; Infiltration ressemble davantage au trafic normal.

Lecture opérationnelle : le score global est bon, mais il masque une asymétrie importante. Le modèle serait surtout utile comme couche de priorisation pour analystes, pas comme décision automatique.

03 / Exploration & contrôle qualité (EDA)

L’EDA explique déjà où l’évaluation pourrait mentir et où le modèle risque d’échouer.

Ce qui a été vérifié
  1. la répartition des classes : trafic bénin et dix types d’attaques (force brute FTP et SSH ; dénis de service Hulk, GoldenEye, Slowloris, SlowHTTPTest ; DDoS HOIC et LOIC-UDP ; botnet ; Infiltration) ;
  2. les colonnes constantes et les valeurs impossibles (durées négatives) ;
  3. les lignes exactement identiques ;
  4. les flux identiques portant des étiquettes différentes ;
  5. les ports de destination de chaque classe.
Flux bruts246 730

Effectifs ronds par classe : 70 % d’attaques.

Doublons exacts66 935

27 % des lignes.

Étiquettes contradictoires3 036

Mêmes valeurs, étiquettes différentes.

Lignes de l’échantillon et flux distincts conservés, par classe
Certaines attaques ne sont presque que de la répétition : FTP-BruteForce compte 15 000 lignes mais seulement 31 flux distincts.
Ports de destination du trafic bénin et de l’Infiltration
La plupart des attaques visent un seul service (port 80, 21, 22 ou 8080). Infiltration, elle, utilise les mêmes services que le trafic normal : DNS, HTTPS, RDP.
Ce que ces constats changent pour la suite

Les doublons doivent disparaître avant le découpage : sinon un même flux serait appris puis « reconnu » au test, et le score serait gonflé. La forte proportion d’attaques (bien plus qu’en réalité) interdit de juger sur la seule exactitude (accuracy). Et la ressemblance entre Infiltration et trafic normal laisse prévoir où se concentreront les erreurs.

04 / Nettoyage

Retirer ce qui fausserait l’évaluation, garder ce qui a un sens.

Les décisions de nettoyage
  1. suppression des 66 935 doublons exacts ;
  2. suppression des 3 036 lignes dont les mêmes valeurs portent des étiquettes différentes : aucun modèle ne peut avoir raison sur les deux ;
  3. suppression d’une ligne à durée de flux négative (erreur de mesure) ;
  4. suppression de 8 colonnes constantes, qui n’apportent aucune information ;
  5. conservation de la valeur −1 de Init Bwd Win Byts, qui signifie « fenêtre TCP non observée » et reste une information utile.
Flux conservés176 758

Après nettoyage complet.

Variables64

Statistiques de flux.

Part d’attaques60 %

Toujours bien plus qu’en réalité.

Sur ces données propres, il fallait organiser l’évaluation avant d’entraîner le moindre modèle.

05 / Découpage apprentissage, validation, test

Trois jeux séparés, chacun avec un rôle précis.

Apprentissage · 123 730les modèles apprennent
Validation · 26 514choix du modèle et du seuil
Test · 26 514évaluation finale, une seule fois

La validation sert à comparer les modèles et choisir le seuil sans toucher au test. Le test est gardé intact jusqu’à la fin. Le découpage est stratifié pour conserver les proportions des familles d’attaque.

Un contrôle par empreinte confirme qu’aucun flux n’apparaît dans deux jeux à la fois.

06 / Trois modèles, une même règle de jugement

Un modèle linéaire, une forêt d’arbres et du gradient boosting.

Référence linéaireRégression logistique

Pondère les statistiques pour séparer bénin et attaque par une frontière simple. Les durées allant de la microseconde à la minute, une transformation logarithmique puis une normalisation sont appliquées.

Ensemble d’arbresRandom Forest

De nombreux arbres de décision, appris sur des tirages différents des données, qui votent.

BoostingGradient boosting

Des arbres construits les uns après les autres, chacun corrigeant les erreurs des précédents.

Les modèles sont comparés avec trois mesures complémentaires : taux de détection pour les attaques trouvées, taux de fausses alertes pour le trafic bénin signalé à tort, et Macro F1 pour équilibrer les deux classes.

Les transformations et les modèles ne voient que les 123 730 flux d’apprentissage ; leurs réglages sont jugés uniquement sur la validation.

ModèleDétectionFausses alertesMacro F1
Gradient boosting90,8 %15,2 %0,879
Random Forest87,0 %17,7 %0,846
Régression logistique79,8 %17,6 %0,804
Macro F1 des trois modèles sur la validation
Résultats en validation, au seuil par défaut de 0,5 : le gradient boosting est devant sur toutes les métriques.

07 / Choix du seuil d’alerte

Le seuil traduit le compromis qu’une équipe de sécurité doit assumer.

Le seuil d’alerte est la probabilité à partir de laquelle un flux est déclaré attaque. Le baisser augmente la détection mais aussi les fausses alertes ; le monter fait l’inverse.

Taux de détection et de fausses alertes selon le seuil, en validation
À 0,30, 98 % des attaques sont détectées mais 30 % du trafic bénin est signalé ; à 0,70, seuls 4 % du bénin sont signalés mais une attaque sur cinq passe.

Le seuil retenu est 0,48, le seuil qui maximise le Macro F1 sur la validation. Il a été figé avant toute évaluation sur le test.

08 / Évaluation finale sur le jeu de données de test

Sur des flux jamais vus, le modèle détecte 91,6 % des attaques, mais génère encore 16,7 % de fausses alertes.

Détection91,6 %

14 540 attaques détectées sur 15 872

Fausses alertes16,7 %

1 781 flux bénins signalés à tort sur 10 642

Macro F10,877

équilibre global entre trafic bénin et attaques

Matrice de confusion du modèle de détection de menaces sur le jeu de données de test
La matrice rend le compromis concret : 1 332 attaques passent encore sous le radar et 1 781 flux bénins deviennent de fausses alertes.

La précision des alertes est de 89,1 % : environ une alerte sur neuf est fausse. Le ROC-AUC atteint 0,964, ce qui montre que le modèle classe généralement les attaques au-dessus du trafic bénin, mais ce score global ne dit pas quelles familles restent difficiles.

09 / Comprendre les erreurs

Le principal problème n’est pas une famille bruyante : c’est Infiltration, parce qu’elle se confond davantage avec le trafic normal.

Taux de détection par famille d’attaque
La plupart des familles sont reconnues à 99,9 % ou plus, alors qu’Infiltration tombe à environ 75 %. C’est elle qui concentre l’essentiel de l’incertitude.

C’est cohérent avec l’exploration initiale : les attaques visant des services très caractéristiques sont faciles à séparer, tandis qu’Infiltration utilise des services également présents dans le trafic normal. Des travaux publiés sur CSE-CIC-IDS2018 signalent aussi des problèmes d’étiquetage ; une partie de l’erreur peut donc venir du jeu de données lui-même.

Contrôle

Le modèle ne dépend pas seulement du port

Sans le port de destination, le Macro F1 de validation baisse de moins de 0,01. Le modèle exploite donc surtout le comportement des flux.

Prudence

Certaines familles sont minuscules

FTP-BruteForce et SlowHTTPTest ne comptent que 4 et 6 flux de test : un taux de 100 % sur ces classes reste très fragile.

10 / Application de démonstration

Une interface locale pour tester le même modèle et le même seuil que dans l’évaluation.

L’application charge un artefact de modèle contenant le modèle entraîné, l’ordre des 64 variables et le seuil 0,48. Un fichier CSV peut être analysé ligne par ligne, ou le jeu de données de démonstration de 44 flux peut être lancé directement depuis l’interface.

Comment l’application a été vérifiée
  1. le modèle rechargé depuis le disque reproduit les mêmes verdicts lorsque les colonnes du fichier sont réordonnées ;
  2. des contrôles bloquent les colonnes manquantes, valeurs non numériques ou fichiers vides avant la prédiction ;
  3. l’exécution locale sur les 44 flux de démonstration affiche 38 alertes, 6 flux bénins et 95,5 % d’accord avec les labels fournis.
Capture authentique de l’écran d’accueil ThreatLens : téléversement CSV ou analyse de 44 flux de démonstration.
ThreatLens : écran d’accueil avec chargement d’un CSV et accès aux 44 flux de démonstration.
Résumé ThreatLens de 44 flux de démonstration : 38 alertes et 6 flux bénins
Résumé des résultats : 44 flux évalués, 38 signalés comme attaques, 6 jugés bénins ; deux verdicts diffèrent des étiquettes du fichier.
Étapes de fonctionnement et carte du modèle dans ThreatLens
L’interface rappelle le parcours d’analyse, le modèle utilisé, le seuil 0,48 et les métriques observées sur le jeu de données de test.
Synthèse des résultats de ThreatLens sur 44 flux de démonstration
Sur les 44 flux de démonstration : 38 sont signalés comme attaques, 6 comme bénins et 2 verdicts diffèrent des labels fournis.
Détail des flux, probabilités et verdicts dans ThreatLens
Chaque ligne expose le service destination, la durée, le nombre de paquets, la probabilité d’attaque et le verdict. La première erreur visible concerne justement un flux Infiltration, la famille identifiée comme la plus difficile.
Périmètre.

La démonstration Flask fonctionne en local : elle permet de charger des flux CSV et de tester 44 exemples, sans authentification, sans exposition réseau ni surveillance continue du trafic.

11 / Valeur réelle, limites & apprentissages

Un outil de tri pour aider les analystes à interpréter les alertes.

Dans un SOC (centre de surveillance de la sécurité), ce type de modèle servirait de couche de tri : il signale des flux à examiner, en complément des détections à signatures. Le seuil se réglerait selon la tolérance de l’équipe aux fausses alertes, mesurée sur des volumes de trafic réels.

  • Flux de référence publics utilisés dans un laboratoire contrôlé.
  • Part d’attaques artificielle (60 %) : la précision réelle serait différente.
  • Étiquettes d’Infiltration discutables.
  • Les statistiques de flux n’existent qu’une fois le flux terminé : pas de détection au paquet près.
  • Le trafic n’est pas spécifique aux objets connectés, malgré le cas d’usage IoT envisagé au départ.
Enseignement principal

Un score n’a de valeur que si les données sont propres et si l’application sert exactement ce qui a été évalué. Cette discipline (contrôler, séparer, valider avant de livrer) est la même qu’en analytics engineering, où une transformation qui s’exécute différemment en production produit des chiffres faux que personne ne remarque.

Pour aller plus loin

Pistes d’amélioration : tester le modèle sur un autre jour de capture ou un autre jeu de données, recalibrer le seuil sur un ratio bénin/attaque réaliste et suivre la dérive une fois en service. Le notebook détaille chaque étape et ses résultats.

Projet suivant

Machine learning adversarial : tester ce qu’un modèle conserve de sa performance sous perturbation.