minancy commited on
Commit
892886a
·
1 Parent(s): 90f858e

Test chunk

Browse files
Files changed (2) hide show
  1. app.py +2 -1
  2. sections/test_filtre.py +92 -0
app.py CHANGED
@@ -37,6 +37,7 @@ analyze = st.Page("sections/analyze.py", title="🔍 Analyze")
37
  ml = st.Page("sections/ml.py", title="🤖 Machine Learning")
38
  alerts = st.Page("sections/alerts.py", title="🚨 Alerts")
39
  about = st.Page("sections/about.py", title="📄 About")
 
40
 
41
- pg = st.navigation([home, upload, statistics, analyze, ml, alerts, about])
42
  pg.run()
 
37
  ml = st.Page("sections/ml.py", title="🤖 Machine Learning")
38
  alerts = st.Page("sections/alerts.py", title="🚨 Alerts")
39
  about = st.Page("sections/about.py", title="📄 About")
40
+ test_filtre = st.Page("sections/test_filtre.py", title="test_filtre")
41
 
42
+ pg = st.navigation([home, upload, statistics, analyze, ml, alerts, test_filtre])
43
  pg.run()
sections/test_filtre.py ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import pandas as pd
3
+ import ipaddress
4
+ import plotly.express as px
5
+ import os
6
+
7
+ # 📌 Définition du plan d'adressage de l'Université
8
+ UNIVERSITY_IP_RANGES = [
9
+ "192.168.0.0/16",
10
+ "10.0.0.0/8",
11
+ "172.16.0.0/12"
12
+ ]
13
+
14
+ # 📌 Fichier cache pour accélérer les chargements suivants
15
+ CACHE_FILE = "logs_cache.parquet"
16
+
17
+ # 📌 Fonction optimisée pour lire un gros fichier .log par morceaux (chunks)
18
+ @st.cache_data
19
+ def load_logs(file, max_lines=1000000):
20
+ col_names = ["timestamp", "ipsource", "ipdestination", "protocole", "portsource", "portdest",
21
+ "regle1", "status", "interface", "inconnu", "regle2"]
22
+
23
+ logs_list = []
24
+ chunk_size = 50000 # Charger les logs par paquets de 50 000 lignes pour éviter de saturer la mémoire
25
+ total_loaded = 0
26
+
27
+ with st.spinner("⏳ Chargement des logs..."):
28
+ for chunk in pd.read_csv(file, sep=";", names=col_names, parse_dates=["timestamp"], dtype=str, chunksize=chunk_size):
29
+ chunk["portsource"] = pd.to_numeric(chunk["portsource"], errors='coerce')
30
+ chunk["portdest"] = pd.to_numeric(chunk["portdest"], errors='coerce')
31
+ logs_list.append(chunk)
32
+ total_loaded += chunk.shape[0]
33
+
34
+ if total_loaded >= max_lines:
35
+ break # On stoppe après max_lines lignes pour un chargement plus rapide
36
+
37
+ df = pd.concat(logs_list, ignore_index=True)
38
+ return df
39
+
40
+ # 📌 Traitement des logs pour extraire les statistiques demandées
41
+ def process_logs(df):
42
+ # 📊 1️⃣ TOP 5 des IP sources les plus émettrices
43
+ df_top_ips = df["ipsource"].value_counts().nlargest(5).reset_index()
44
+ df_top_ips.columns = ["ipsource", "count"]
45
+
46
+ # 📊 2️⃣ TOP 10 des ports < 1024 avec accès autorisé
47
+ df_ports = df[(df["portdest"] < 1024) & (df["status"] == "PERMIT")]
48
+ df_top_ports = df_ports["portdest"].value_counts().nlargest(10).reset_index()
49
+ df_top_ports.columns = ["portdest", "count"]
50
+
51
+ # 🚫 3️⃣ Lister les accès hors plan d’adressage universitaire
52
+ df["is_outside"] = df["ipsource"].apply(lambda ip: not any(ipaddress.ip_address(ip) in ipaddress.ip_network(net) for net in UNIVERSITY_IP_RANGES))
53
+ df_outside_university = df[df["is_outside"]]
54
+
55
+ return df_top_ips, df_top_ports, df_outside_university
56
+
57
+ # 🎨 Interface Streamlit
58
+ st.title("⚡ Analyse Optimisée des Logs Réseau")
59
+
60
+ # 📂 Upload du fichier log
61
+ uploaded_file = st.file_uploader("📂 Charger un fichier .log", type="log")
62
+
63
+ # 🚀 CHARGEMENT OPTIMISÉ
64
+ if uploaded_file:
65
+ if os.path.exists(CACHE_FILE):
66
+ st.info("📂 Chargement des logs depuis le cache...")
67
+ df_logs = pd.read_parquet(CACHE_FILE)
68
+ else:
69
+ df_logs = load_logs(uploaded_file) # Charger seulement 200 000 lignes pour un affichage rapide
70
+ df_logs.to_parquet(CACHE_FILE) # Stocker en cache pour éviter de recharger à chaque fois
71
+
72
+ # 📌 Traitement des logs
73
+ df_top_ips, df_top_ports, df_outside_university = process_logs(df_logs)
74
+
75
+ # 📊 TOP 5 des IP sources les plus émettrices
76
+ st.subheader("📊 TOP 5 des IP sources les plus émettrices")
77
+ fig_ips = px.bar(df_top_ips, x="ipsource", y="count", title="TOP 5 IP Sources")
78
+ st.plotly_chart(fig_ips, use_container_width=True)
79
+
80
+ # 📊 TOP 10 des ports < 1024 avec accès autorisé
81
+ st.subheader("📊 TOP 10 des ports < 1024 avec accès autorisé")
82
+ fig_ports = px.bar(df_top_ports, x="portdest", y="count", title="TOP 10 Ports Destinataires < 1024 Autorisés")
83
+ st.plotly_chart(fig_ports, use_container_width=True)
84
+
85
+ # 🚫 Liste des accès hors plan d’adressage universitaire
86
+ st.subheader("🚫 Accès hors plan d’adressage universitaire")
87
+ st.dataframe(df_outside_university)
88
+
89
+ # 💾 Télécharger les résultats filtrés
90
+ st.download_button("💾 Télécharger les IP hors plan d'adressage", df_outside_university.to_csv(index=False), file_name="ips_hors_universite.csv")
91
+
92
+ st.info("📌 Charge un fichier `.log` pour voir l'analyse.")