Spaces:
Sleeping
Sleeping
Test chunk
Browse files- app.py +2 -1
- 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,
|
| 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.")
|