Projet : Optimisation algo machine learning / data mining pour configurer automatiquement des pare-feux
Projet en 3 étapes :
- Machine Learning à partir de logs (journaux d'évènements) de pare-feu afin de déterminer un modèle pour traiter automatiquement de nouveaux flux (prise de décision automatique)
- Data Mining à partir des logs (journaux d'évènements) pour déterminer des règles de pare-feu les plus efficaces possibles. Développements inspirés de la méthode proposée dans l'article Analysis of Firewall Policy Rules Using data Mining Techniques
- Envoi des règles à l'API Cisco
Etapes clés pour l'algorithme FRG :
- Génération des clusters
- Regroupement @IP SRC qui ont les mêmes @IP DST et PORT
- Regroupement @IP DST qui ont les mêmes @IP SRC et PORT
- Regroupement PORT qui ont les mêmes @IP SRC et @IP DST
- Suppresion des redondances
- Généralisation des clusters
Pseudo code pour la généralisation des clusters
(code dans filtering_rule_generation.py
)
MIN_LENGTH_CLUSTER = 10 # Minimum 10 IP dans un cluster (éviter masque trop précis)
Pour chaque cluster d'IP SRC et d'IP DST:
Si longeur cluster>MIN_LENGTH_CLUSTER :
new_cluster_IP = adresse IP sous-réseau à partir du 1er et du dernier élément du cluster
Pour chaque cluster de PORTS DST :
Si cluster_PORT_dst[0]>1024 et cluster_PORT_dst[last]<=49151 :
Si cluster_PORT_dst[0] == cluster_PORT_dst[last]:
new_cluster_PORT = cluster_PORT_dst[0]
Sinon :
new_cluster_PORT = cluster_PORT_dst[0] + "-" + cluster_PORT_dst[last]
Si cluster_PORT_dst[0]>49151 :
new_cluster_PORT = "49152-65535"
# Sinon (ports < 1024) : Ne rien faire (pas de cluster car "Well Known Ports")
Etapes pour la génération des clusters par évaluation des distances CAGA
(code dans clustering_algo_gap_analysis.py
)
Entrée : Liste d'éléments
Sortie : Liste de clusters
-
Trier la liste dans l'ordre croissant
-
Calculer l'écart (distance 2 à 2 par soustraction)
Seuil fixé arbitrairement à 128 pour les adresses IP et à 1 pour les ports
-
Création des clusters basés sur l'écart, pour chaque élement e de la liste initiale :
Si écart[e] == 0 :
# Ne rien faire pour éviter les répétitions
Si écart[e] < seuil :
Ajout de l'élément e dans cluster actuel
Sinon :
Création d'un nouveau cluster
Ajout de l'élément dans le nouveau cluster
Ordonnancement des règles
- Regroupement des règles qui partagent les mêmes IP sources et destination : création de listes de ports (en tenant compte du protocole)
- Regroupement des listes d'IP (src ou dst) afin d'éviter les répétitions (lorsque le champ port est le même)
- Ordonnancement basé sur la fréquence d'occurence (COUNT)
- Création d'une policy (nom passé en argument)
- Envoi de toutes les règles (lecture fichier
xlsx
passé en argument)
//
Contient les codes permettant de convertir des logs en règles par le processus présenté plus haut.
clustering_algo_gap_analysis.py
: contient l'algorithme de génération des clusters qui est basé sur un seuil et qui sert pour les listes d'@IP et les listes de portscreate_primitive_rule_list.py
: contient l'algorithme pour détecter les redondances et éviter d'avoir 2 lignes identiques (ne tient pas compte du champ compteur / COUNT)filtering_rule_generation.py
: contient toute l'architecture et l'intelligence du bloc FRGgroup_list_ip.py
: contient l'algorithme qui permet de regourper les listes d'IP (src ou dst) lorsque la cluterisation n'a pas été possible afin d'éviter les répétitionsgroup_proto_ports.py
: contient l'algorithme qui permet de regrouper les protocoles / ports dans le même champs et de concaténer tous les logs qui ont les mêmes @IP src et @IP dstlogs_test_simple.csv
: exemple de fichier de logs qui doit être donné en entrée au main.pyprint.log
: log de toutes les actions effectuées par l'algo sauvegarder dans ce fichier (permet de rentrer dans les détails)main.py
: point d'entrée de tout l'algorithme de data miningtools.py
: diverses fonctions basiques + variables globalesprepare_file.py
: contient l'algo qui permet d'extraire les données brut vers un fichier csv facilement exploitable
Contient les codes permettant de communiquer avec l'API FirePower de Cisco.
base_request.json
: JSON template pour données à envoyer à l'API (ajout d'ACL)complete_json.py
: contient la fonction qui permet de transférer les ACL d'un fichier xlsx au format JSON imposé par l'APIfmc_post_policy.py
: point d'entrée (scirpt) pour poster une nouvelle polocy et des ACL associées
Utilisation
python fmc_post_policy.py <rule_file.xlsx> <policy_name> <FMC_USERNAME> <FMC_PASSWORD>
/!\ WARNING : Le nom de la policy doit être unique. Dans script (ligne 50) Exemple :
post_data = {
"type": "AccessPolicy",
"name": "TEST", # UNIQUE NAME
"defaultAction": {
"action": "BLOCK"
}
}
/!\ WARNING : l'URL de l'API doit être modifée ligne 10 du fichier fmc_post_policy.py
- Python 3 (3.8 utilisé pour les développements)
- Pip
- Requests (used for API requests)
- Xlrd (used for read XLSX files)
- Numpy
-
python-weka-wrapper3 prérequis (from here) :
- Numpy
- Javabridge
- Graphviz
- Matplotlib
- Microsoft Build Tools 2015
-
python-weka-wrapper3 (doc)
- Python 3
-
Préparation des données sources : mise en forme des données pour qu'elles soient compréhensibles par l'algo
- Extract des données depuis un pare-feu (uniquement des logs où la décision est PERMIT) au format csv. Une première ligne est souvent à supprimer car pas des données bruts.
- Utilisation (si nécessaire) de scirpt de préparation des fichiers
python prepare_file.py <path_file_src> <path_file_dst>
. La modification du script peut être nécessaire pour s'adapter aux données en entrées :# Variables to be defined ip_src_i = 2 ip_dst_i = 5 port_dst_i = 6 proto_i = 7
-
Lancement de l'algo
python main.py <path_file_src.csv>
-
Envoi des règles à l''API
python fmc_post_policy.py <rule_file.xlsx> <policy_name> <FMC_USERNAME> <FMC_PASSWORD>
/!\ WARNING :
- Utilisation d'un chemain relatif vers le fichier source (structure obligatoire voir logs_test_simple.csv)
- l'URL de l'API doit être modifée ligne 10 du fichier fmc_post_policy.py