← Accueil

PCTAMALOU

Semaine 4 : L'Art de l'Automatisation – Python pour le Gardien Numérique

Par Platon-Y – pctamalou.fr & e-of-h.fr

🎯 Objectif de la semaine

Maîtriser les fondements de Python et écrire vos premiers scripts d'automatisation pour l'analyse de données de sécurité. Transformer des tâches manuelles fastidieuses en processus automatisés fiables.

Pourquoi Python en cybersécurité : 70% des outils de pentesting sont écrits en Python. Savoir programmer, c'est passer de consommateur d'outils à créateur d'outils.

flowchart TD A[📄 Données Brutes
Logs, captures, fichiers] --> B{Analyse Python} B --> C[🔍 Parsing
Lecture & extraction] B --> D[⚙️ Traitement
Filtrage, comptage] B --> E[🎯 Décision
Conditions & règles] C --> F[📊 Résultats
Stats, rapports] D --> F E --> F F --> G[🚀 Automatisation
Script réutilisable] G --> H[⚡ Gain de temps
Réduction d'erreurs] style A fill:#0a0e17,stroke:#00d4ff,stroke-width:2px style G fill:#11151f,stroke:#9d4edd,stroke-width:2px style H fill:#00f5a0,stroke:#000,stroke-width:2px

📚 Sujet – Théorie (1 heure)

Pourquoi Python est l'arme absolue du hacker

🚀 Les 7 super-pouvoirs de Python en sécurité :

  1. Simplicité lisible : Code presque comme du pseudo-code
  2. Écosystème gigantesque : 300,000+ packages PyPI
  3. Cross-platform : Même code sur Linux, Windows, macOS
  4. Scripting puissant : Automatisation réseau, fichiers, processus
  5. Librairies dédiées : Scapy (réseau), Requests (HTTP), Cryptography
  6. Intégration système : Appelle des commandes shell, APIs système
  7. Rapide prototypage : Testez des idées en minutes, pas en jours

L'anatomie d'un script Python de sécurité

#!/usr/bin/env python3
# ============================================
# PCTAMALOU - Script d'analyse de sécurité
# Auteur : [Votre Nom]
# Objectif : Analyser des logs pour détecter des menaces
# ============================================

import sys      # Arguments et sortie
import re       # Expressions régulières
import json     # Formatage JSON
from datetime import datetime  # Gestion temps

# ----------------------------------------------------
# CONSTANTES GLOBALES
# ----------------------------------------------------
LOG_FILE = "/var/log/auth.log"
THRESHOLD_FAILED = 5  # Seuil d'alerte

# ----------------------------------------------------
# FONCTIONS PRINCIPALES
# ----------------------------------------------------
def analyse_failed_logins(log_path):
    """Compte les échecs d'authentification"""
    # Implémentation...
    pass

def generate_report(results):
    """Génère un rapport structuré"""
    # Implémentation...
    pass

# ----------------------------------------------------
# POINT D'ENTRÉE
# ----------------------------------------------------
if __name__ == "__main__":
    print("[*] Démarrage de l'analyse...")
    # Logique principale
    print("[+] Analyse terminée")

Les concepts Python essentiels pour la sécurité

Concept Exemple Utilisation en sécurité Analogie
Variables ip = "192.168.1.1" Stockage d'adresses IP, ports, données sensibles 📦 Boîte étiquetée
Listes/Dictionnaires ports = [22, 80, 443] Collections d'éléments à scanner/analyser 🗃️ Collection organisée
Boucles for for line in log_file: Parcourir des logs ligne par ligne 🔁 Répétition précise
Conditions if/else if "FAILED" in line: Détection de patterns dans les données ❓ Prise de décision
Fonctions def scan_port(ip, port): Modules réutilisables pour différentes tâches 🛠️ Outil spécialisé
Gestion d'erreurs try: ... except: Robustesse face aux fichiers manquants, erreurs réseau 🛡️ Protection anticasse

L'indentation : la philosophie Python

⚠️ Attention : L'indentation est syntaxique en Python

Contrairement à la plupart des langages qui utilisent des accolades {}, Python utilise l'indentation pour délimiter les blocs.

# ❌ FAUX (erreur d'indentation)
if True:
print("Ceci échouera")  # Pas d'indentation

# ✅ CORRECT
if True:
    print("Ceci fonctionne")  # 4 espaces d'indentation

Convention professionnelle : 4 espaces (jamais de tabulations). Configurez votre éditeur en conséquence.

💡 Philosophie du scripteur :

"Si vous devez faire une tâche plus de deux fois, automatisez-la."

Un Gardien numérique ne perd pas son temps à des tâches répétitives. Il écrit un script qui le fait pour lui, plus vite et sans erreur.

🔬 Mission pratique – Laboratoire (2 heures)

Scénario : Création d'un analyseur de logs de sécurité

Vous êtes responsable de la surveillance d'un serveur. Vous devez créer un outil qui analyse automatiquement les logs à la recherche d'activités suspectes.

📝 Avant de commencer : Python3 est préinstallé sur Kali. Vérifiez avec python3 --version.

Étapes détaillées : De zéro à script fonctionnel

  1. Configuration de l'environnement
    Organisation professionnelle des dossiers :
    # Structure de projet professionnelle
    cd ~/mon_lab
    mkdir -p semaine4_python/{scripts,logs,tests,output}
    cd semaine4_python
    
    # Vérification Python
    python3 --version
    which python3
    
    # Création d'un environnement virtuel (bonne pratique)
    python3 -m venv venv  # Optionnel mais recommandé
    # source venv/bin/activate  # Pour activer
  2. Création de logs réalistes
    Générons des logs simulés mais réalistes pour notre analyse :
    # Fichier de logs d'authentification simulé
    cat > logs/auth.log << 'EOF'
    Jan 10 08:30:15 server sshd[1234]: Accepted password for kali from 192.168.1.100 port 54322
    Jan 10 08:31:22 server sshd[1235]: Failed password for invalid user admin from 192.168.1.200 port 54323
    Jan 10 08:31:25 server sshd[1235]: Failed password for invalid user admin from 192.168.1.200 port 54323
    Jan 10 08:31:28 server sshd[1235]: Failed password for invalid user admin from 192.168.1.200 port 54323
    Jan 10 08:32:10 server sshd[1236]: Accepted publickey for root from 10.0.0.5 port 54324
    Jan 10 08:33:45 server sshd[1237]: Failed password for kali from 192.168.1.150 port 54325
    Jan 10 08:34:20 server sudo:     kali : TTY=pts/0 ; PWD=/home/kali ; USER=root ; COMMAND=/bin/ls
    Jan 10 08:35:00 server sshd[1238]: Accepted password for www-data from 172.16.0.10 port 54326
    Jan 10 08:36:15 server sshd[1239]: Invalid user hacker from 203.0.113.5 port 54327
    Jan 10 08:36:18 server sshd[1239]: Failed password for invalid user hacker from 203.0.113.5 port 54327
    Jan 10 08:40:00 server CRON[1240]: (root) CMD (/usr/bin/updatedb)
    EOF
    
    # Fichier de logs système
    cat > logs/system.log << 'EOF'
    INFO: Service ssh started successfully
    ERROR: Disk usage at 95% on /dev/sda1
    WARNING: High memory usage detected (85%)
    INFO: Backup completed successfully
    ERROR: Could not connect to database server
    WARNING: CPU temperature above threshold
    INFO: Security scan started
    ERROR: Firewall rule failed to apply
    WARNING: Unusual network activity from 192.168.1.200
    INFO: System updated to latest version
    EOF
  3. Écriture du script d'analyse basique
    Créez votre premier script avec un éditeur (nano, vim, ou code) :
    #!/usr/bin/env python3
    """
    PCTAMALOU - Semaine 4 : Analyseur de logs de sécurité
    Script d'analyse de logs SSH pour détecter des tentatives de bruteforce
    """
    
    import sys
    import os
    from datetime import datetime
    from collections import defaultdict
    
    # ============================================================================
    # CONFIGURATION
    # ============================================================================
    LOG_FILE = "logs/auth.log"
    OUTPUT_FILE = "output/security_report.txt"
    FAILED_THRESHOLD = 3  # Nombre d'échecs avant alerte
    
    # ============================================================================
    # FONCTIONS D'ANALYSE
    # ============================================================================
    def analyse_ssh_logs(log_path):
        """
        Analyse les logs SSH pour détecter des patterns suspects
        Retourne un dictionnaire avec les statistiques
        """
        stats = {
            'total_lines': 0,
            'accepted_logins': 0,
            'failed_logins': 0,
            'invalid_users': 0,
            'suspicious_ips': defaultdict(int),
            'failed_by_user': defaultdict(int)
        }
        
        try:
            with open(log_path, 'r') as file:
                for line in file:
                    stats['total_lines'] += 1
                    
                    # Détection des connexions acceptées
                    if "Accepted" in line and "sshd" in line:
                        stats['accepted_logins'] += 1
                        
                    # Détection des échecs de connexion
                    if "Failed password" in line:
                        stats['failed_logins'] += 1
                        
                        # Extraction de l'IP source
                        import re
                        ip_match = re.search(r'from (\d+\.\d+\.\d+\.\d+)', line)
                        if ip_match:
                            ip = ip_match.group(1)
                            stats['suspicious_ips'][ip] += 1
                        
                        # Extraction du nom d'utilisateur
                        user_match = re.search(r'for (\w+) from', line)
                        if user_match:
                            user = user_match.group(1)
                            stats['failed_by_user'][user] += 1
                    
                    # Détection des utilisateurs invalides
                    if "Invalid user" in line:
                        stats['invalid_users'] += 1
                        
        except FileNotFoundError:
            print(f"[ERREUR] Fichier {log_path} non trouvé")
            return None
        except Exception as e:
            print(f"[ERREUR] Problème de lecture: {e}")
            return None
        
        return stats
    
    def generate_report(stats, output_path):
        """Génère un rapport d'analyse formaté"""
        if not stats:
            return False
        
        try:
            with open(output_path, 'w') as report:
                report.write("=" * 60 + "\n")
                report.write("RAPPORT D'ANALYSE DE SÉCURITÉ\n")
                report.write(f"Généré le: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
                report.write("=" * 60 + "\n\n")
                
                # Statistiques générales
                report.write("📊 STATISTIQUES GÉNÉRALES\n")
                report.write(f"  • Lignes analysées: {stats['total_lines']}\n")
                report.write(f"  • Connexions acceptées: {stats['accepted_logins']}\n")
                report.write(f"  • Échecs de connexion: {stats['failed_logins']}\n")
                report.write(f"  • Utilisateurs invalides: {stats['invalid_users']}\n\n")
                
                # IPs suspectes
                report.write("🔍 IPS SUSPECTES (plus de 2 échecs)\n")
                suspicious_count = 0
                for ip, count in stats['suspicious_ips'].items():
                    if count >= 2:
                        report.write(f"  • {ip}: {count} échecs\n")
                        suspicious_count += 1
                if suspicious_count == 0:
                    report.write("  Aucune IP suspecte détectée\n")
                report.write("\n")
                
                # Utilisateurs avec échecs
                report.write("👤 UTILISATEURS AVEC ÉCHECS\n")
                for user, count in stats['failed_by_user'].items():
                    report.write(f"  • {user}: {count} échecs\n")
                
                # Recommandations
                report.write("\n💡 RECOMMANDATIONS\n")
                if stats['failed_logins'] > 10:
                    report.write("  ⚠️  Nombre élevé d'échecs - Vérifier les règles firewall\n")
                if stats['invalid_users'] > 5:
                    report.write("  ⚠️  Nombre élevé d'utilisateurs invalides - Possible scan\n")
                if suspicious_count > 0:
                    report.write(f"  ⚠️  {suspicious_count} IP(s) suspectes détectées\n")
                
                report.write("\n" + "=" * 60 + "\n")
            
            return True
            
        except Exception as e:
            print(f"[ERREUR] Échec génération rapport: {e}")
            return False
    
    # ============================================================================
    # FONCTION PRINCIPALE
    # ============================================================================
    def main():
        print("[*] PCTAMALOU - Analyseur de logs de sécurité")
        print(f"[*] Analyse du fichier: {LOG_FILE}")
        
        # Analyse des logs
        stats = analyse_ssh_logs(LOG_FILE)
        if not stats:
            print("[!] Échec de l'analyse")
            sys.exit(1)
        
        # Génération du rapport
        print(f"[*] Génération du rapport: {OUTPUT_FILE}")
        if generate_report(stats, OUTPUT_FILE):
            print("[+] Rapport généré avec succès")
            
            # Affichage des points clés
            print(f"\n📋 RÉSUMÉ:")
            print(f"  • Échecs de connexion: {stats['failed_logins']}")
            print(f"  • IPs uniques avec échecs: {len(stats['suspicious_ips'])}")
            
            # Détection d'IPs très suspectes
            high_risk_ips = [ip for ip, count in stats['suspicious_ips'].items() if count >= FAILED_THRESHOLD]
            if high_risk_ips:
                print(f"  ⚠️  IPs à haut risque: {', '.join(high_risk_ips)}")
        else:
            print("[!] Échec génération rapport")
            sys.exit(1)
    
    # ============================================================================
    # POINT D'ENTRÉE
    # ============================================================================
    if __name__ == "__main__":
        main()
  4. Exécution et test du script
    Testez votre création :
    # Rendre le script exécutable
    chmod +x scripts/log_analyzer.py
    
    # Exécution
    python3 scripts/log_analyzer.py
    
    # Vérification du rapport
    cat output/security_report.txt
    
    # Test avec un fichier manquant (gestion d'erreur)
    mv logs/auth.log logs/auth.log.backup
    python3 scripts/log_analyzer.py  # Doit afficher une erreur
    mv logs/auth.log.backup logs/auth.log
  5. Améliorations et extensions
    Ajoutez des fonctionnalités avancées :
    # Extension 1: Ajout d'arguments en ligne de commande
    import argparse
    
    parser = argparse.ArgumentParser(description="Analyseur de logs de sécurité")
    parser.add_argument("-f", "--file", help="Fichier log à analyser", default="logs/auth.log")
    parser.add_argument("-o", "--output", help="Fichier de sortie", default="output/report.txt")
    parser.add_argument("-t", "--threshold", type=int, help="Seuil d'alerte", default=3)
    args = parser.parse_args()
    
    # Extension 2: Export JSON pour intégration avec d'autres outils
    import json
    
    def export_json(stats, filename):
        with open(filename, 'w') as f:
            json.dump(stats, f, indent=2)
    
    # Extension 3: Envoi d'alertes par email (simulé)
    def send_alert(ip, count):
        print(f"[ALERTE] IP {ip} a {count} échecs de connexion")
  6. Création d'un deuxième script : analyseur de logs système
    Pour pratiquer, créez un script complémentaire :
    #!/usr/bin/env python3
    """
    Analyseur de logs système - Détection de problèmes
    """
    
    def analyse_system_logs(log_file):
        errors = []
        warnings = []
        
        with open(log_file, 'r') as f:
            for line in f:
                if "ERROR" in line:
                    errors.append(line.strip())
                elif "WARNING" in line:
                    warnings.append(line.strip())
        
        return {
            'errors': errors,
            'warnings': warnings,
            'total_errors': len(errors),
            'total_warnings': len(warnings)
        }
    
    # Testez ce script sur logs/system.log

🎯 Défi de programmation avancé

Créez un script qui :

  1. Lit plusieurs fichiers logs dans un dossier
  2. Détecte les IPs qui apparaissent dans plusieurs fichiers
  3. Génère un rapport avec les timelines d'attaque
  4. Exporte les résultats en CSV pour analyse dans un tableur

Indice : Utilisez os.listdir(), datetime.strptime(), et le module csv.

📋 Objectif de la semaine – Checklist de validation

✅ Compétences techniques acquises

  • Créer et exécuter un script Python avec shebang correct
  • Lire et écrire des fichiers avec gestion d'erreurs
  • Utiliser des boucles et conditions pour analyser des données
  • Extraire des informations avec des expressions régulières simples
  • Structurer un script avec fonctions et documentation
  • Générer des rapports formatés automatiquement

🧠 Changement mental accompli

  • Penser en termes d'automatisation : "Comment scriptifier cette tâche ?"
  • Voir les logs comme des données structurées, pas du texte opaque
  • Comprendre qu'un bon script est un multiplicateur de force
  • Adopter la philosophie DRY (Don't Repeat Yourself)

🐍 Bonne pratique Python à adopter :

Toujours utiliser python3 et non python (Python 2 est obsolète depuis 2020).

Utilisez des docstrings (triples guillemets) pour documenter vos fonctions.

📚 Ressources gratuites recommandées

Pour approfondir Python en sécurité :

⚠️ Pièges courants à éviter

  • Oublier le shebang #!/usr/bin/env python3
  • Ne pas gérer les exceptions (fichier manquant, permissions)
  • Écrire des scripts sans documentation ni commentaires
  • Utiliser Python 2 (obsolète et non sécurisé)
  • Ne pas valider les entrées utilisateur (injection de commandes)

🔮 Frère d'armes,

Tu viens d'acquérir l'arme la plus puissante du Gardien numérique : le pouvoir de l'automatisation.

Jusqu'à présent, tu as appris à :

• Communiquer avec la machine (terminal - S01)
• Contrôler l'accès (permissions - S02)
• Observer ce qui se passe (processus - S03)
• Automatiser l'analyse (Python - S04)

Cette semaine marque un tournant. Tu n'es plus seulement un opérateur qui utilise des outils. Tu deviens un créateur d'outils.

Ton script d'analyse de logs n'est qu'un début. Bientôt, tu pourras :

  • Scanner automatiquement des réseaux
  • Analyser des captures réseau
  • Détecter des vulnérabilités
  • Répondre à des incidents
  • Créer tes propres outils de pentest

Python est le multiplicateur de force qui transforme un bon analyste en excellent analyste.

Dans la semaine 5, nous combinerons tout ce que nous avons appris pour aborder le monde des réseaux. Nous verrons comment les machines communiquent, comment capturer ce trafic, et comment l'analyser pour y détecter des menaces.

Pratique. Code. Améliore. Chaque script que tu écris est une compétence qui te rapproche de la maîtrise.

Tu n'es plus un simple utilisateur. Tu es devenu un artisan du code.

— Platon-Y