README ------------------------------------------------ PARTIE 0: Le projet ------------------------------------------------ 1. Le code ce trouve dans le folder Django_Rendu.zip pour l'ouvrir: • Télécharger le folder Django_Rendu.zip • Extraire le folder Django_Rendu du zip (unzip) • Ouvrir préferablement dans visual studio code si vou svoulez regarder l'entierté du projet • Lancer dans visual studio avec python manage.py runserver ou touts simplement dans le command prompt ou console en fonction de votre OS 2. Les données extraite et enrichies en format CSV se trouve dans Donnees_consolidees_et_enrichies.csv 3. Le jupyter notebook en HTML se trouve dans Notebook_HTML.html 4. La video de 3 minutes est Video_Projet_Python.mp4 ------------------------------------------------ PARTIE 1 : Introduction et lancement du projet ------------------------------------------------ 1. Présentation du projet: ------------------------------------------------ Ce projet Django permet d’automatiser : 1. Extraction des flux RSS Le projet récupère automatiquement les derniers flux RSS (Avis et Alertes) depuis le site de l’ANSSI. 2. Enrichissement des CVE Chaque CVE collectée est enrichie via des appels API vers des sources telles que MITRE et EPSS, ajoutant des informations essentielles comme les scores CVSS ou les probabilités d'exploitation. 3. Transformation des données Les données collectées sont organisées dans un DataFrame, facilitant leur export au format Excel. 4. Processus synchronisé : détection, notification et mise à jour des graphiques Lors de chaque enrichissement du DataFrame (tous les jours à 8:00), trois actions sont exécutées simultanément : • Détection des nouvelles vulnérabilités : Le système identifie les CVE ajoutées depuis la dernière mise à jour. • Notification des utilisateurs : Des e-mails journaliers sont envoyés aux abonnés en fonction de leurs critères personnalisés (seuils CVSS, scores EPSS, listes de vendeurs, etc.). • Mise à jour des graphiques : Les visualisations statistiques sont automatiquement actualisées pour refléter les nouvelles données. Cela garantit des graphiques dynamiques et constamment alignés sur l'état des vulnérabilités à jour. Plusieurs fichiers interviennent, les plus importants sont dans le folder core: • utils.py : contient l’essentiel des fonctions d’extraction, d’appel API, de transformation des données et d’envoi de courriels. • scheduler.py : permet de planifier (Cron) l’exécution automatique de la vérification quotidienne des nouvelles vulnérabilités. • visws.py : gère les vues Django (affichage, formulaire d’inscription, redirection, etc.). • models.py : contient les modèles de données utilisés par Django, notamment le modèle Client. • forms.py : définit le formulaire Django pour l’inscription des utilisateurs (ClientForm). • visualisation.html, client_signup.html, signup_success.html. : sont des templates HTML utilisés par Django pour l’interface web. 2. Prérequis: ------------------------------------------------ 1. Python >= 3.8 2. Django >= 3.2 3. Pip: gestionnaire de paquets python 4. Bibliothèques Python : Vous pouvez installer l’ensemble des dépendances via le fichier requirements.txt, ou manuellement. 5. Accès internet: requis pour les appels API (mitre, EPSS) et le flux RSS ANSII 6. Serveur SMTP configuré: si vous souhaitez envoyer des e-mails vous devres mettre vos propres identifiants et adapter le code 3. Installation et configuration: ------------------------------------------------ 1. Télécharger ce depot 2. Installer les dépendances: pip install -r requirements.txt 3. Configurer les identifiants SMTP: dans la fonction send_email (fichier utils.py) si necessaire (nous avons laisser les idéntifiants de l’email que nous avons créer pour ce projet par simplicité) 4. Changer les path en haut de utils.py à ceux sur votre machine 4. Lancement de l'application: ------------------------------------------------ 1. Démarrer le serveur de développement Django : python manage.py runserver 2. Accéder à l’application dans votre navigateur 3. Interface : /signup/ : permet à l’utilisateur de s’inscrire au newsletter et de définir ses seuils (CVSS, EPSS) ainsi qu’une liste de vendeurs. /signup_success/: confirmation d'inscription /visualisation/: affiche les graphiques de statistiques (top vendeurs, distribution des vulnérabilités, etc.). ------------------------------------------------- PARTIE 2 : Fonctionnement des fichiers importants ------------------------------------------------- 1. Le fichier utils.py: ------------------------------------------------- Le fichier utils.py est le cœur logique de l’application. Il contient toutes les fonctions nécessaires à l’extraction, l’enrichissement et la préparation des données, ainsi que la logique d’envoi d’e-mail. Dans ce projet, les étapes 1 à 4 (correspondant à l’extraction initiale du flux RSS de l’ANSSI, l’enrichissement des CVE, puis la conversion en DataFrame) ont été utilisées en tout début de projet pour constituer la base de données historique complète. Cette première phase (Étapes 1 à 4) est donc principalement destinée à initialiser le projet. Par la suite, ces étapes 1 à 4 ne sont plus exécutées quotidiennement. Le code a été adapté dans la l'etape 6 afin de ne plus relancer une extraction massive du flux RSS à chaque fois (ce qui rechargerait inutilement toutes les anciennes données). Au lieu de cela, les fonctions ont été modifiées pour ne récupérer que les nouveautés Voici un aperçu détaillé des principales sections : 1. Les Bibliothéques: ont importe tous les bibliothéques nécessaire ETAPE 1 A 4: 2. Extraction du flux RSS (fonctions Étape 1) extraction_flux_RSS(): Récupère les derniers avis et dernières alertes du site ANSSI. • Retourne deux listes : listavis (avis) et listalerte (alertes). • Utilise feedparser.parse(url) pour transformer l’URL RSS en objets Python. modification_basic(l1, l2) :Attribue un champ "Type" à chaque entrée (ex. "Avis" ou "Alerte") et concatène les listes en une seule. 3. Extraction et enrichissement des CVE (fonctions Etape 2 et 3) extraction_CVE(url) : • Pour chaque alerte/avis, on construit l’URL JSON (ajout de json/), puis on récupère les CVE mentionnées • Retourne la liste des CVE trouvées. api_cve(cve_id) : • Interroge l’API MITRE (https://cveawg.mitre.org/api/cve/{cve_id}) pour récupérer les métadonnées liées à la CVE (description, baseScore, baseSeverity, CWE, produits affectés, etc.). • Organise ces données dans un dictionnaire Python (cve_data) qui sera ensuite ajouté au DataFrame. api_epss(cve_id) : • Interroge l’API EPSS de FIRST.org pour récupérer la probabilité d’exploitation (EPSS score). • Retourne un score (parfois très bas) ; gère le cas où aucune donnée n’est disponible (score = 0). 4. Fonction principale d’agrégation (Étape 1 à 3) creation_liste_donnee() : • Combine l’extraction RSS et l’extraction de chaque CVE. • Pour chaque CVE, appelle api_cve et api_epss afin de constituer une structure de données finalisée (liste de dictionnaires). • Retourne cette liste prête à être convertie en DataFrame. tester1() : • Variante de test rapide (sur seulement 5 entrées) pour vérifier le bon fonctionnement des appels. 5. Conversion en DataFrame (Etape 4): convertire_en_df(l) : • Transforme la liste de dictionnaires en un DataFrame Pandas. • Gère l’explosion des données : plusieurs CVE par alerte/avis se retrouvent sur plusieurs lignes du DataFrame. • Renomme les colonnes (Titre ANSSI, Description CVE, etc.) pour plus de clarté. • Nettoie éventuellement la colonne des versions affectées, du vendeur, etc. convert_date_format(df, date_column) : • Convertit la colonne date du format RSS ("Thu, 12 Jan 2023 12:34:56 +0000") vers un format plus lisible ("YYYY-MM-DD HH:MM:SS"). exporter_df_en_excel(df, output_file) : • Enregistre le DataFrame au format .xlsx. etape_1_a_4() : • Enchaîne creation_liste_donnee() puis convertire_en_df(l) pour renvoyer la liste + le DataFrame final. FONCTIONS EXECUTEE QUATIDIENNEMENT (Etape 6) 6. Mécanisme d'envoi de mails df_principale_de_excel(folder_path) : • Récupère le dernier fichier Excel (plus récent) correspondant à la base de données (ex. dfmodif_YYYY-MM-DD.xlsx). • Renvoie un DataFrame. df_clients_de_excel() : • Exemple de lecture d’un fichier Excel contenant la liste des clients (abandonné comme on utilise le modèle Django). prendre_l_en_fonction_date(df) : • Vérifie si de nouvelles alertes/avis sont parus après la dernière date présente dans df. • Retourne la liste filtrée des nouvelles alertes. nouveau_df(l) : • Gère l’extraction CVE, l’appel d’API, et la construction d’un DataFrame pour ces nouvelles alertes. vérifier_besoin_envoyer_mail(dfnew, dfclients) : • Compare pour chaque client ses seuils cvss_min, epss_min et la liste de vendeurs. • Si la CVE dépasse ces seuils, un message est ajouté au corps de l’e-mail. • Appelle ensuite send_email() si des correspondances sont trouvées. send_email(to_email, subject, body) : • Implémente l’envoi d’e-mail via SMTP (ex. Gmail) avec un identifiant et mot de passe. fetch_client_from_Client() : • Récupère la liste de clients depuis la base de données (modèle Django Client). • Transforme la colonne vendors pour avoir une liste. verifier_tous_les_jours() : • Fonction clé appelée par le scheduler qui : 1. Charge le fichier Excel principal (historique). 2. Recherche de nouvelles alertes (via prendre_l_en_fonction_date()). 3. Crée un nouveau DataFrame pour ces nouvelles alertes (nouveau_df()). 4. Récupère la liste de clients (fetch_client_from_Client()), 5. Lance l’envoi d’e-mails (vérifier_besoin_envoyer_mail()) si besoin. 6. Fusionne l’historique et les nouvelles données, puis ré-enregistre (Excel). 7. Fonctions de visualisation et de debug count_non_none_cvss(df) / exclude_all_non_CVSS(df) : • petites fonctions de contrôle pour compter ou filtrer selon la présence d’un score CVSS. visualisation_view(request=None) : • Construit différents graphiques (matplotlib, seaborn). • Convertit chaque figure en base64 pour pouvoir les afficher dans les templates Django. save_plot_as_base64() : • Sauvegarde la figure matplotlib en mémoire, puis la convertit en base64 pour l’injection dans les templates. clean_vendeur_column(df) : • Convertit la colonne Vendeur en texte « propre » (récupère uniquement le premier élément si c’est une liste). En résumé, utils.py gère la quasi-totalité de la logique métier : • Extraction des alertes/avis et des CVE, • Appels aux API externes, • Construction du DataFrame, • Filtrage des CVE pour chaque client, • Envoi d’e-mails automatiques, • Préparation et génération de graphiques. C’est grâce à ces fonctions que l’automatisation quotidienne est possible, particulièrement combinées à la planification via le scheduler. 2. Planification des tâches (scheduler.py): -------------------------------------------- • Le script scheduler.py utilise apscheduler pour déclencher une tâche quotidienne : • Fonction appelée : verifier_tous_les_jours (dans utils.py) • Heure configurée : 8h00 du matin (vous pouvez ajuster la CronTrigger selon vos besoins). • Le scheduler fonctionnera en tâche de fond tant que le serveur Django est actif. 3. Modéle Django Client (models.py): -------------------------------------------- 1. Champs : • email : stocke l’e-mail de l’utilisateur (champ unique). • cvss_min : valeur seuil pour le score CVSS (float), afin de filtrer les alertes/avis qui intéressent réellement l’utilisateur. • epss_min : valeur seuil pour le score EPSS (float). • vendors : texte pouvant contenir une liste de vendeurs (au format JSON ou séparés par des virgules). 2. Usage : • Lorsqu’un utilisateur s’inscrit (via le formulaire ClientForm), une entrée est créée dans la base de données. • Ces informations sont ensuite utilisées pour envoyer les e-mails uniquement lorsque les nouvelles alertes/avis correspondent aux critères de l’utilisateur. • Chaque client peut ainsi recevoir des notifications personnalisées en fonction de ses seuils de criticité (CVSS, EPSS) et de ses vendeurs préférés. 4. Les fichiers HTML (dans templates\core): -------------------------------------------- 1. client_signup.html • Objectif principal : permettre à l’utilisateur de s’abonner au newsletter, en indiquant son e-mail ainsi que ses critères (CVSS, EPSS, liste de vendeurs). • Formulaire Django : il affiche le ClientForm pour recueillir ces informations, puis redirige vers une page de confirmation (ou de visualisation) si l’abonnement réussit. • Navigation : inclut un lien/bouton vers la page de visualisation (/visualisation/). 2. signup_success.html: • Objectif principam : signaler à l'utilisateur que l'inscription a été éffectuer • Navigation: inclut un lien/bouton vers la page de visualisation 3. visualisation.html • Objectif principal : afficher tous les graphiques générés par les fonctions de visualisation (dans utils.py). • Base64 : chaque graphique est converti en chaîne Base64 et inséré dans la page via la balise . • Navigation : inclut un bouton renvoyant vers la page de souscription (/signup/) pour ceux qui souhaiteraient s’inscrire ou modifier leurs paramètres. -------------------------------------------- PARTIE 3: Points de vigilance / Limitations: -------------------------------------------- 1. API MITRE / EPSS : • Les champs retournés peuvent varier. Il faut gérer les cas où certains scores (CVSS, baseSeverity, etc.) ne sont pas disponibles. • Les limites de requête / quotas peuvent provoquer des erreurs si vous effectuez trop d’appels successifs. 2. Envoi d’e-mails : • Vous devez disposer d’un compte autorisant l’envoi SMTP (Gmail, Outlook, etc.). • Faites attention à la sécurité (ne mettez jamais d’identifiants sensibles en clair sur un dépôt public). 3. Création / Utilisation du DataFrame : • Certaines colonnes (CVSS, EPSS, etc.) peuvent être NaN s’il n’y a pas de score récupérable. • Les dates sont converties dans un format standard (YYYY-MM-DD HH:MM:SS) mais parfois l’extraction peut échouer si le format RSS change. 4. Visualisations : • Les graphiques peuvent être gourmands en mémoire si le DataFrame est volumineux. • Les librairies comme matplotlib et seaborn nécessitent un environnement graphique adéquat. 5. Sécurité Django : • En production, configurez les variables d’environnement (SECRET_KEY, DEBUG=False, ALLOWED_HOSTS, etc.). • Générez un SECRET_KEY unique et ne le partagez pas publiquement. 6. Exécution continue : • Vérifiez régulièrement les logs pour repérer d’éventuelles erreurs (API indisponible, etc.). • Mettez en place un monitoring afin de vous assurer que les tâches programmées (scheduler) tournent correctement.