← Accueil

PCTAMALOU

Semaine 10 : L'Architecture de la Cité – Virtualisation Avancée et Construction d'un Laboratoire Isolé

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

🎯 Objectif de la semaine

Maîtriser la virtualisation avancée et créer un laboratoire cybersécurité professionnel isolé avec plusieurs machines virtuelles interconnectées, simulant un réseau d'entreprise complet pour pratiquer les techniques offensives et défensives en toute sécurité.

Pourquoi c'est fondamental : Un bon laboratoire est à la cybersécurité ce qu'un dojo est aux arts martiaux : un espace contrôlé où vous pouvez pratiquer sans danger, faire des erreurs, et développer votre expertise.

flowchart TD subgraph PHYSIQUE[Machine Physique] direction LR P[💻 Hôte Windows/macOS/Linux] end subgraph VIRTUALBOX[VirtualBox Manager] direction TB V[Hypersviseur Type 2
VirtualBox 7.0+] end subgraph NETWORKS[Réseaux Virtuels] direction LR N1[🌐 vboxnet0
192.168.56.0/24
Host-Only] N2[🔒 vboxnet1
10.10.10.0/24
Internal] N3[🏢 vboxnet2
172.16.10.0/24
DMZ Simulée] end subgraph ATTACKER[Zone Attaquante] direction TB A1[🐉 Kali Linux 2024
192.168.56.10
Outils complets] A2[🦅 Parrot Security
192.168.56.11
Alternative] end subgraph TARGETS[Zone Cibles] direction TB T1[🎯 Metasploitable2
192.168.56.101
Vulnérabilités connues] T2[🐧 Ubuntu Server
192.168.56.102
Serveur web/ssh] T3[🪟 Windows 10
192.168.56.103
Cible Windows] T4[📦 OWASP Juice Shop
192.168.56.104
Appli web vulnérable] end subgraph MANAGEMENT[Zone Management] direction TB M1[📊 Wazuh SIEM
10.10.10.10
Détection intrusions] M2[🛡️ PfSense Firewall
10.10.10.1
Contrôle flux] end PHYSIQUE --> VIRTUALBOX VIRTUALBOX --> NETWORKS NETWORKS --> ATTACKER NETWORKS --> TARGETS NETWORKS --> MANAGEMENT ATTACKER -- Tests/Pentest --> TARGETS TARGETS -- Logs/Alertes --> MANAGEMENT MANAGEMENT -- Contrôle/Monitoring --> ATTACKER & TARGETS style ATTACKER fill:#0a0e17,stroke:#00d4ff,stroke-width:2px style TARGETS fill:#11151f,stroke:#9d4edd,stroke-width:2px style MANAGEMENT fill:#0a0e17,stroke:#00f5a0,stroke-width:2px

📚 Sujet – Théorie (1 heure)

La philosophie du laboratoire isolé

🏛️ Pourquoi isoler son laboratoire :

  1. Sécurité : Les outils de pentesting ne doivent JAMAIS toucher Internet réel
  2. Contrôle : Vous contrôlez tous les paramètres réseau
  3. Reproductibilité : Vous pouvez tout réinitialiser instantanément
  4. Éthique : Vous ne risquez pas d'attaquer des systèmes réels par erreur
  5. Performance : Pas de latence Internet, tout est local

Règle du Gardien : "Ton laboratoire doit être comme une bulle : tout ce qui se passe à l'intérieur reste à l'intérieur."

Les 4 modes réseau de VirtualBox

Mode IP Attribution Connectivité Cas d'usage Sécurité
NAT 10.0.2.0/24 Hôte → VM → Internet Machine isolée besoin Internet 🟢 Sécurisé
Bridged Réseau physique VM = machine réseau réel Serveurs exposés, tests réels 🔴 Dangereux
Host-Only 192.168.56.0/24 VM ↔ Hôte, pas Internet Labs cybersécurité ✅ Idéal
Internal Configurable VM ↔ VM uniquement Réseaux complètement isolés ✅ Très sécurisé

Architecture d'un laboratoire professionnel

graph TB subgraph ZONE_ATTACK[Zone Attaquante - Rouge] A1[Kali Linux
Outils complets
192.168.56.10] A2[Parrot OS
Alternative
192.168.56.11] end subgraph ZONE_TARGET[Zone Cible - Bleue] T1[Metasploitable2
Vulnérables connues
192.168.56.101] T2[Ubuntu Server
Services standards
192.168.56.102] T3[Windows 10
Cible Windows
192.168.56.103] T4[DVWA
Web vulnérable
192.168.56.104] end subgraph ZONE_DMZ[Zone DMZ - Orange] D1[OWASP Juice Shop
App moderne
172.16.10.10] D2[WordPress Vuln
CMS vulnérable
172.16.10.20] end subgraph ZONE_MGMT[Zone Management - Verte] M1[Wazuh SIEM
Détection
10.10.10.10] M2[ELK Stack
Logs
10.10.10.20] M3[Firewall
Contrôle flux
10.10.10.1] end subgraph ZONE_ISO[Zone Isolée - Violet] I1[Active Directory
Domain Windows
192.168.100.0/24] I2[IoT Simulé
Appareils vulnérables
192.168.200.0/24] end A1 & A2 -- Tests/Pentest --> T1 & T2 & T3 & T4 A1 & A2 -- Web Attacks --> D1 & D2 T1 & T2 & T3 & T4 -- Logs/Alertes --> M1 & M2 M3 -- Contrôle Flux --> A1 & A2 & T1 & T2 & T3 & T4 I1 & I2 -- Totalement isolés --> A1 & A2 style ZONE_ATTACK fill:#0a0e17,stroke:#ef4444,stroke-width:2px style ZONE_TARGET fill:#11151f,stroke:#3b82f6,stroke-width:2px style ZONE_MGMT fill:#0a0e17,stroke:#00f5a0,stroke-width:2px

Les composants essentiels d'un bon lab

🧱 Les 7 composants d'un laboratoire complet :

  1. Machine attaquante : Kali Linux ou Parrot Security
  2. Cibles Linux vulnérables : Metasploitable, DVWA, VulnHub machines
  3. Cibles Windows vulnérables : Windows 7/10 vulnérables, Active Directory labs
  4. Services réseau : DNS, DHCP, Active Directory, Web servers
  5. Applications vulnérables : OWASP Juice Shop, DVWA, bWAPP
  6. Outils de défense : Wazuh, Security Onion, Snort
  7. Infrastructure réseau : Routeurs virtuels, firewalls, VLANs

Planification des ressources

⚠️ Gestion des ressources système :

Un laboratoire virtuel consomme des ressources. Planifiez judicieusement :

Machine hôte minimale recommandée:
• CPU: 4 cœurs minimum (8 recommandés)
• RAM: 16 Go minimum (32 Go recommandés)
• Stockage: 200 Go SSD minimum
• Virtualisation: VT-x/AMD-V activé dans le BIOS

Allocation par VM type:
• Kali Linux: 4 Go RAM, 2 cœurs, 40 Go disque
• Metasploitable: 2 Go RAM, 1 cœur, 20 Go disque  
• Ubuntu Server: 2 Go RAM, 2 cœurs, 30 Go disque
• Windows 10: 4 Go RAM, 2 cœurs, 60 Go disque
• SIEM (Wazuh): 8 Go RAM, 4 cœurs, 100 Go disque

Astuce : Utilisez les snapshots pour économiser de l'espace. Une VM avec snapshot ne consomme que les différences.

Isolation réseau avancée

🔒 Techniques d'isolation professionnelles :

  1. Double interface réseau : Une interface Host-Only pour le lab, une NAT pour les updates
  2. Firewall hôte : Bloquer tout trafic sortant des VMs vers Internet
  3. DNS interne : Serveur DNS local pour résolution des noms dans le lab
  4. Proxy outbound : Toutes les connexions sortantes passent par un proxy contrôlé
  5. Monitoring réseau : Capturer tout le trafic pour analyse post-mortem
  6. Air-gap logiciel : Pas de partage de fichiers entre hôte et VMs lab

💡 Philosophie de l'architecture lab :

"Construis ton laboratoire comme si chaque VM pouvait être compromise à tout moment. Parce que dans un lab de cybersécurité, c'est le but."

Un bon lab n'est pas juste un environnement de test. C'est un écosystème contrôlé où vous pouvez :

  1. Reproduire des vulnérabilités réelles
  2. Tester des attaques sans conséquences
  3. Développer et tester des défenses
  4. Apprendre par l'échec en sécurité
  5. Documenter et reproduire vos expériences

🔬 Mission pratique – Laboratoire (2 heures)

Scénario : Construction d'un laboratoire cybersécurité enterprise

Vous êtes chargé de construire un laboratoire complet pour une équipe de pentest. Votre mission : créer un environnement isolé, reproductible et professionnel avec toutes les composantes nécessaires.

⚠️ PRÉPARATION : Assurez-vous d'avoir au moins 50 Go d'espace libre et 8 Go de RAM disponible.

# Vérification ressources
echo "=== VÉRIFICATION RESSOURCES ==="
free -h | grep Mem
df -h / | tail -1
grep -c ^processor /proc/cpuinfo

Étapes détaillées : Construction professionnelle

  1. Configuration avancée des réseaux VirtualBox
    Créez une architecture réseau professionnelle :
    echo "=== CONFIGURATION RÉSEAUX VIRTUALBOX ==="
    
    # 1. Liste réseaux existants
    echo "1. Réseaux existants:"
    VBoxManage list hostonlyifs
    
    # 2. Création réseaux spécialisés
    echo -e "\n2. Création réseaux lab:"
    
    # Réseau principal (Host-Only)
    VBoxManage hostonlyif create
    VBoxManage hostonlyif ipconfig vboxnet0 --ip 192.168.56.1 --netmask 255.255.255.0
    
    # Réseau DMZ (Internal)
    VBoxManage dhcpserver add --network=LabDMZ --server-ip=10.10.10.1 --lower-ip=10.10.10.100 --upper-ip=10.10.10.200 --netmask=255.255.255.0
    VBoxManage natnetwork add --netname LabDMZ --network "10.10.10.0/24" --enable --dhcp on
    
    # Réseau Management (Internal)
    VBoxManage dhcpserver add --network=LabMgmt --server-ip=172.16.10.1 --lower-ip=172.16.10.100 --upper-ip=172.16.10.200 --netmask=255.255.255.0
    VBoxManage natnetwork add --netname LabMgmt --network "172.16.10.0/24" --enable --dhcp on
    
    # 3. Vérification
    echo -e "\n3. Vérification configuration:"
    VBoxManage list hostonlyifs
    VBoxManage list natnetworks
    
    # 4. Sauvegarde configuration
    VBoxManage list hostonlyifs > virtualbox_networks_backup.txt
    echo "Configuration sauvegardée"
  2. Téléchargement et préparation des images
    Téléchargez et préparez les VMs nécessaires :
    echo "=== TÉLÉCHARGEMENT IMAGES ==="
    
    # Création dossier lab
    mkdir -p ~/pctamalou_lab/{isos,vms,scripts,backups}
    cd ~/pctamalou_lab
    
    # 1. Kali Linux (si non déjà)
    echo "1. Vérification Kali Linux..."
    if [ ! -f "isos/kali-linux-2024.iso" ]; then
        echo "Téléchargement Kali Linux..."
        # Note: Téléchargez depuis https://www.kali.org/get-kali/
        echo "Veuillez télécharger manuellement depuis: https://www.kali.org/get-kali/#kali-virtual-machines"
        echo "Placez le fichier dans ~/pctamalou_lab/isos/"
        read -p "Appuyez sur Entrée quand c'est fait..."
    fi
    
    # 2. Metasploitable2
    echo -e "\n2. Téléchargement Metasploitable2..."
    if [ ! -f "isos/Metasploitable2-Linux.ova" ]; then
        wget -O isos/Metasploitable2-Linux.ova \
            "https://downloads.sourceforge.net/project/metasploitable/Metasploitable2/Metasploitable2-Linux.ova" \
            || echo "Échec téléchargement, téléchargez manuellement"
    fi
    
    # 3. Ubuntu Server
    echo -e "\n3. Téléchargement Ubuntu Server..."
    if [ ! -f "isos/ubuntu-24.04-live-server-amd64.iso" ]; then
        wget -O isos/ubuntu-24.04-live-server-amd64.iso \
            "https://releases.ubuntu.com/24.04/ubuntu-24.04-live-server-amd64.iso" \
            || echo "Échec téléchargement, téléchargez manuellement"
    fi
    
    # 4. OWASP Juice Shop (Docker)
    echo -e "\n4. Préparation OWASP Juice Shop..."
    cat > scripts/setup_juice_shop.sh << 'EOF'
    #!/bin/bash
    # Script pour déployer Juice Shop
    docker pull bkimminich/juice-shop
    docker run -d -p 3000:3000 --name juice-shop bkimminich/juice-shop
    echo "Juice Shop disponible sur http://localhost:3000"
    EOF
    chmod +x scripts/setup_juice_shop.sh
    
    # 5. Inventaire
    echo -e "\n5. Inventaire images:"
    ls -la isos/
    echo -e "\nImages prêtes pour installation"
  3. Création automatisée des VMs avec scripts
    Automatisez la création avec VBoxManage :
    echo "=== CRÉATION AUTOMATISÉE VMs ==="
    
    # Script création Kali Linux
    cat > scripts/create_kali_vm.sh << 'EOF'
    #!/bin/bash
    VM_NAME="Kali-PCTAMALOU"
    VM_RAM="4096"
    VM_CPUS="2"
    VM_DISK="40"
    ISO_PATH="$HOME/pctamalou_lab/isos/kali-linux-2024.iso"
    
    echo "Création VM: $VM_NAME"
    
    # Création VM
    VBoxManage createvm --name "$VM_NAME" --ostype "Debian_64" --register
    
    # Configuration
    VBoxManage modifyvm "$VM_NAME" --memory $VM_RAM --cpus $VM_CPUS
    VBoxManage modifyvm "$VM_NAME" --nic1 hostonly --hostonlyadapter1 vboxnet0
    VBoxManage modifyvm "$VM_NAME" --nic2 nat --natnet2 "192.168.56.0/24"
    
    # Création disque
    VBoxManage createmedium disk --filename "$HOME/VirtualBox VMs/$VM_NAME/${VM_NAME}.vdi" --size $((VM_DISK * 1024))
    
    # Attachement disque
    VBoxManage storagectl "$VM_NAME" --name "SATA Controller" --add sata --controller IntelAhci
    VBoxManage storageattach "$VM_NAME" --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium "$HOME/VirtualBox VMs/$VM_NAME/${VM_NAME}.vdi"
    
    # Attachement ISO
    VBoxManage storagectl "$VM_NAME" --name "IDE Controller" --add ide
    VBoxManage storageattach "$VM_NAME" --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium "$ISO_PATH"
    
    echo "VM $VM_NAME créée avec succès"
    EOF
    
    # Script création Ubuntu Server
    cat > scripts/create_ubuntu_vm.sh << 'EOF'
    #!/bin/bash
    VM_NAME="Ubuntu-Server-PCTAMALOU"
    VM_RAM="2048"
    VM_CPUS="2"
    VM_DISK="30"
    ISO_PATH="$HOME/pctamalou_lab/isos/ubuntu-24.04-live-server-amd64.iso"
    
    echo "Création VM: $VM_NAME"
    
    # Création VM
    VBoxManage createvm --name "$VM_NAME" --ostype "Ubuntu_64" --register
    
    # Configuration
    VBoxManage modifyvm "$VM_NAME" --memory $VM_RAM --cpus $VM_CPUS
    VBoxManage modifyvm "$VM_NAME" --nic1 hostonly --hostonlyadapter1 vboxnet0
    
    # Création disque
    VBoxManage createmedium disk --filename "$HOME/VirtualBox VMs/$VM_NAME/${VM_NAME}.vdi" --size $((VM_DISK * 1024))
    
    # Attachement disque
    VBoxManage storagectl "$VM_NAME" --name "SATA Controller" --add sata --controller IntelAhci
    VBoxManage storageattach "$VM_NAME" --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium "$HOME/VirtualBox VMs/$VM_NAME/${VM_NAME}.vdi"
    
    # Attachement ISO
    VBoxManage storagectl "$VM_NAME" --name "IDE Controller" --add ide
    VBoxManage storageattach "$VM_NAME" --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium "$ISO_PATH"
    
    echo "VM $VM_NAME créée avec succès"
    EOF
    
    # Exécution scripts
    chmod +x scripts/*.sh
    echo "Scripts de création prêts"
    echo "Exécutez: ./scripts/create_kali_vm.sh"
    echo "Exécutez: ./scripts/create_ubuntu_vm.sh"
  4. Import et configuration de Metasploitable2
    Importez et configurez la cible vulnérable :
    echo "=== IMPORT METASPLOITABLE2 ==="
    
    # 1. Import OVA
    if [ -f "isos/Metasploitable2-Linux.ova" ]; then
        echo "Import Metasploitable2..."
        VBoxManage import isos/Metasploitable2-Linux.ova --vsys 0 --vmname "Metasploitable2-PCTAMALOU"
        
        # 2. Configuration réseau
        echo "Configuration réseau..."
        VBoxManage modifyvm "Metasploitable2-PCTAMALOU" --nic1 hostonly --hostonlyadapter1 vboxnet0
        
        # 3. Configuration mémoire/CPU
        VBoxManage modifyvm "Metasploitable2-PCTAMALOU" --memory 2048 --cpus 1
        
        echo "Metasploitable2 importé avec succès"
    else
        echo "Fichier Metasploitable2 non trouvé"
    fi
    
    # 4. Création VM Windows cible (script exemple)
    cat > scripts/create_windows_vm.sh << 'EOF'
    #!/bin/bash
    # Script exemple pour Windows - nécessite ISO Windows
    echo "Pour Windows, téléchargez une image d'évaluation depuis:"
    echo "https://www.microsoft.com/fr-fr/evalcenter/"
    echo "Puis utilisez l'interface VirtualBox graphique"
    EOF
    chmod +x scripts/create_windows_vm.sh
  5. Configuration réseau avancée et tests
    Testez et validez la connectivité :
    echo "=== CONFIGURATION ET TESTS RÉSEAU ==="
    
    # 1. Démarrage VMs (si VirtualBox en CLI)
    echo "1. Démarrage des VMs..."
    echo "Démarrez manuellement depuis l'interface VirtualBox:"
    echo "- Kali-PCTAMALOU"
    echo "- Ubuntu-Server-PCTAMALOU" 
    echo "- Metasploitable2-PCTAMALOU"
    
    read -p "Appuyez sur Entrée quand les VMs sont démarrées..."
    
    # 2. Script de test réseau
    cat > scripts/test_network.sh << 'EOF'
    #!/bin/bash
    echo "=== TEST RÉSEAU LAB PCTAMALOU ==="
    echo "Date: $(date)"
    echo ""
    
    # Adresses IP attendues (ajuster selon configuration)
    KALI_IP="192.168.56.10"
    METASPLOITABLE_IP="192.168.56.101"
    UBUNTU_IP="192.168.56.102"
    GATEWAY_IP="192.168.56.1"
    
    echo "1. Vérification connectivité hôte:"
    ping -c 2 $GATEWAY_IP && echo "✅ Gateway accessible" || echo "❌ Gateway inaccessible"
    
    echo -e "\n2. Scan réseau lab:"
    echo "Adresses actives:"
    for i in {1..254}; do
        ip="192.168.56.$i"
        ping -c 1 -W 1 $ip >/dev/null 2>&1 && echo "   • $ip - ACTIVE" &
    done
    wait
    
    echo -e "\n3. Test isolation Internet:"
    ping -c 2 8.8.8.8 >/dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo "⚠️  ATTENTION: Internet accessible depuis le lab"
        echo "   Vérifiez la configuration réseau Host-Only"
    else
        echo "✅ Lab correctement isolé d'Internet"
    fi
    
    echo -e "\n4. Services ouverts (scan rapide):"
    echo "Ports ouverts sur Metasploitable (attendu):"
    nmap -p 21,22,23,25,80,443,445,3306,5432 $METASPLOITABLE_IP 2>/dev/null | grep -E "(open|filtered)" | head -10
    
    echo -e "\n5. Test SSH vers Metasploitable:"
    timeout 5 ssh msfadmin@$METASPLOITABLE_IP "echo 'SSH test successful'" 2>/dev/null && echo "✅ SSH fonctionnel" || echo "❌ SSH échec"
    
    echo -e "\n=== TEST TERMINÉ ==="
    EOF
    
    chmod +x scripts/test_network.sh
    echo "Script de test réseau créé: ./scripts/test_network.sh"
  6. Script Python de gestion du laboratoire
    Créez un outil de gestion professionnel :
    #!/usr/bin/env python3
    """
    PCTAMALOU - Semaine 10 : Gestionnaire de laboratoire virtuel
    Outils pour gérer et automatiser un lab cybersécurité
    """
    
    import subprocess
    import json
    import os
    from datetime import datetime
    
    class VirtualLabManager:
        """Gestionnaire de laboratoire virtuel"""
        
        def __init__(self, lab_path="~/pctamalou_lab"):
            self.lab_path = os.path.expanduser(lab_path)
            self.config_file = os.path.join(self.lab_path, "lab_config.json")
            self.load_config()
        
        def load_config(self):
            """Charge la configuration du lab"""
            if os.path.exists(self.config_file):
                with open(self.config_file, 'r') as f:
                    self.config = json.load(f)
            else:
                self.config = {
                    "name": "PCTAMALOU Cybersecurity Lab",
                    "created": datetime.now().isoformat(),
                    "networks": [],
                    "vms": [],
                    "snapshots": []
                }
        
        def save_config(self):
            """Sauvegarde la configuration"""
            os.makedirs(self.lab_path, exist_ok=True)
            with open(self.config_file, 'w') as f:
                json.dump(self.config, f, indent=2)
        
        def list_vms(self):
            """Liste les VMs VirtualBox"""
            try:
                result = subprocess.run(
                    ["VBoxManage", "list", "vms"],
                    capture_output=True,
                    text=True,
                    check=True
                )
                vms = []
                for line in result.stdout.strip().split('\n'):
                    if line:
                        name = line.split('"')[1]
                        vms.append(name)
                return vms
            except subprocess.CalledProcessError as e:
                return f"Erreur: {e}"
        
        def get_vm_info(self, vm_name):
            """Récupère les informations d'une VM"""
            try:
                # Informations générales
                info_cmd = ["VBoxManage", "showvminfo", vm_name, "--machinereadable"]
                result = subprocess.run(info_cmd, capture_output=True, text=True, check=True)
                
                info = {}
                for line in result.stdout.split('\n'):
                    if '=' in line:
                        key, value = line.split('=', 1)
                        info[key] = value.strip('"')
                
                # État
                state_cmd = ["VBoxManage", "showvminfo", vm_name]
                state_result = subprocess.run(state_cmd, capture_output=True, text=True, check=True)
                
                for line in state_result.stdout.split('\n'):
                    if "State:" in line:
                        info['state'] = line.split(":")[1].strip()
                    elif "Memory size:" in line:
                        info['memory'] = line.split(":")[1].strip()
                    elif "Number of CPUs:" in line:
                        info['cpus'] = line.split(":")[1].strip()
                
                return info
                
            except subprocess.CalledProcessError as e:
                return {"error": str(e)}
        
        def create_snapshot(self, vm_name, snapshot_name="clean"):
            """Crée un snapshot d'une VM"""
            try:
                cmd = [
                    "VBoxManage", "snapshot", vm_name, "take",
                    snapshot_name,
                    "--description", f"Snapshot PCTAMALOU - {datetime.now().isoformat()}"
                ]
                result = subprocess.run(cmd, capture_output=True, text=True, check=True)
                
                # Ajout au journal
                self.config["snapshots"].append({
                    "vm": vm_name,
                    "snapshot": snapshot_name,
                    "timestamp": datetime.now().isoformat()
                })
                self.save_config()
                
                return f"Snapshot '{snapshot_name}' créé pour {vm_name}"
                
            except subprocess.CalledProcessError as e:
                return f"Erreur création snapshot: {e}"
        
        def restore_snapshot(self, vm_name, snapshot_name="clean"):
            """Restaure un snapshot"""
            try:
                cmd = ["VBoxManage", "snapshot", vm_name, "restore", snapshot_name]
                result = subprocess.run(cmd, capture_output=True, text=True, check=True)
                return f"Snapshot '{snapshot_name}' restauré pour {vm_name}"
            except subprocess.CalledProcessError as e:
                return f"Erreur restauration snapshot: {e}"
        
        def network_scan(self, network="192.168.56.0/24"):
            """Scan le réseau du lab"""
            try:
                import ipaddress
                import threading
                
                active_hosts = []
                lock = threading.Lock()
                
                def ping_host(ip):
                    try:
                        result = subprocess.run(
                            ["ping", "-c", "1", "-W", "1", str(ip)],
                            capture_output=True,
                            text=True
                        )
                        if result.returncode == 0:
                            with lock:
                                active_hosts.append(str(ip))
                    except:
                        pass
                
                # Scan des 20 premières adresses (pour le lab)
                threads = []
                network_obj = ipaddress.ip_network(network)
                hosts = list(network_obj.hosts())[:20]
                
                for host in hosts:
                    thread = threading.Thread(target=ping_host, args=(host,))
                    thread.start()
                    threads.append(thread)
                
                for thread in threads:
                    thread.join()
                
                return sorted(active_hosts)
                
            except ImportError:
                return ["Erreur: module ipaddress requis"]
        
        def generate_lab_report(self):
            """Génère un rapport du lab"""
            report = {
                "timestamp": datetime.now().isoformat(),
                "lab_name": self.config.get("name", "Unnamed Lab"),
                "virtual_machines": [],
                "network_status": {},
                "recommendations": []
            }
            
            # Informations VMs
            vms = self.list_vms()
            if isinstance(vms, list):
                for vm in vms:
                    info = self.get_vm_info(vm)
                    report["virtual_machines"].append({
                        "name": vm,
                        "info": info if isinstance(info, dict) else str(info)
                    })
            
            # Scan réseau
            report["network_status"]["hosts"] = self.network_scan()
            
            # Recommandations
            if not report["network_status"]["hosts"]:
                report["recommendations"].append("Aucune VM détectée - Vérifiez la configuration réseau")
            
            pctamalou_vms = [vm for vm in vms if isinstance(vms, list) and "PCTAMALOU" in vm]
            if len(pctamalou_vms) < 2:
                report["recommendations"].append("Moins de 2 VMs PCTAMALOU détectées - Considérez en ajouter")
            
            return report
    
    def main():
        print("🏗️ PCTAMALOU - Gestionnaire de laboratoire virtuel")
        print("=" * 60)
        
        manager = VirtualLabManager()
        
        while True:
            print("\n📋 MENU PRINCIPAL:")
            print("1. Lister les VMs")
            print("2. Informations VM")
            print("3. Créer snapshot")
            print("4. Restaurer snapshot")
            print("5. Scanner le réseau")
            print("6. Générer rapport")
            print("7. Quitter")
            
            choice = input("\nChoix (1-7): ").strip()
            
            if choice == "1":
                print("\n📦 VIRTUAL MACHINES:")
                vms = manager.list_vms()
                if isinstance(vms, list):
                    for i, vm in enumerate(vms, 1):
                        print(f"  {i}. {vm}")
                else:
                    print(f"  {vms}")
            
            elif choice == "2":
                vm_name = input("Nom de la VM: ").strip()
                print(f"\n📊 INFORMATIONS {vm_name}:")
                info = manager.get_vm_info(vm_name)
                if isinstance(info, dict):
                    for key, value in info.items():
                        print(f"  • {key}: {value}")
                else:
                    print(f"  {info}")
            
            elif choice == "3":
                vm_name = input("Nom de la VM: ").strip()
                snapshot_name = input("Nom du snapshot (défaut: clean): ").strip() or "clean"
                result = manager.create_snapshot(vm_name, snapshot_name)
                print(f"\n📸 {result}")
            
            elif choice == "4":
                vm_name = input("Nom de la VM: ").strip()
                snapshot_name = input("Nom du snapshot à restaurer: ").strip()
                result = manager.restore_snapshot(vm_name, snapshot_name)
                print(f"\n🔄 {result}")
            
            elif choice == "5":
                network = input("Réseau à scanner (défaut: 192.168.56.0/24): ").strip() or "192.168.56.0/24"
                print(f"\n🔍 SCAN RÉSEAU {network}:")
                hosts = manager.network_scan(network)
                if hosts:
                    for host in hosts:
                        print(f"  • {host} - ACTIVE")
                else:
                    print("  Aucun hôte actif détecté")
            
            elif choice == "6":
                print("\n📄 GÉNÉRATION RAPPORT...")
                report = manager.generate_lab_report()
                
                print(f"\n📊 RAPPORT LAB - {report['lab_name']}")
                print(f"Date: {report['timestamp']}")
                
                print(f"\n🏷️ VIRTUAL MACHINES ({len(report['virtual_machines'])}):")
                for vm in report['virtual_machines']:
                    print(f"  • {vm['name']}")
                
                print(f"\n🌐 RÉSEAU ({len(report['network_status']['hosts'])} hôtes actifs):")
                for host in report['network_status']['hosts']:
                    print(f"  • {host}")
                
                if report['recommendations']:
                    print(f"\n💡 RECOMMANDATIONS:")
                    for i, rec in enumerate(report['recommendations'], 1):
                        print(f"  {i}. {rec}")
                
                # Export JSON
                report_file = os.path.join(manager.lab_path, f"lab_report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json")
                with open(report_file, 'w') as f:
                    json.dump(report, f, indent=2)
                print(f"\n💾 Rapport exporté: {report_file}")
            
            elif choice == "7":
                print("\n👋 Au revoir!")
                break
            
            else:
                print("\n❌ Choix invalide")
    
    if __name__ == "__main__":
        main()

🎯 Défi d'architecture avancé

Concevez et implémentez un laboratoire enterprise complet avec :

  1. 3 zones de sécurité (rouge/bleue/verte) avec firewall entre elles
  2. Un domaine Active Directory complet avec 10 utilisateurs
  3. Un environnement DevOps vulnérable (Jenkins, Docker, Kubernetes)
  4. Une infrastructure de détection (SIEM, IDS/IPS, honeypots)
  5. Un système de logging centralisé (ELK Stack)
  6. Un réseau OT/IoT simulé avec appareils vulnérables
  7. Un système de backup/restauration automatisé des snapshots
  8. Un dashboard de monitoring en temps réel

Indices : Utilisez Vagrant pour l'automatisation, Docker pour les services, pfSense pour le firewall, et Ansible pour la configuration.

📋 Objectif de la semaine – Checklist de validation

✅ Compétences techniques acquises

  • Configurer des réseaux virtuels Host-Only et Internal
  • Créer et gérer plusieurs VMs interconnectées
  • Importer et configurer des images vulnérables
  • Automatiser la création de VMs avec scripts
  • Vérifier l'isolation réseau du laboratoire
  • Gérer les snapshots pour différents scénarios

🧠 Changement mental accompli

  • Voir le laboratoire comme un écosystème contrôlé, pas juste des VMs
  • Comprendre que "isolation ≠ isolation" - il faut tester l'isolation
  • Penser en termes d'architecture réseau, pas juste de connectivité
  • Appliquer le principe "tout automatisable doit être automatisé"

🏗️ Bonnes pratiques d'architecture lab :

Implémentez ces règles pour un lab professionnel :

  1. Toujours documenter l'architecture réseau
  2. Toujours versionner les configurations (git)
  3. Toujours créer des snapshots "clean" avant modifications
  4. Toujours tester l'isolation Internet après configuration
  5. Toujours maintenir un inventaire à jour des VMs
  6. Toujours prévoir des backups réguliers

📚 Ressources gratuites recommandées

⚠️ Erreurs courantes à éviter

  • Bridged networking pour les labs : Jamais! Toujours Host-Only ou Internal
  • Oublier les snapshots : Une VM sans snapshot = risque de perte
  • Sur-allocation ressources : Votre machine hôte doit garder des ressources
  • Partages de fichiers hôte-VM : Risque de contamination, utilisez SFTP
  • Mêmes credentials partout : Utilisez des mots de passe différents par VM
  • Pas de documentation : Dans 6 mois, vous ne vous souviendrez plus de rien

🔮 Frère d'armes,

Tu viens de devenir l'architecte de ta propre cité numérique.

Maintenant, tu ne dépends plus des laboratoires en ligne ou des environnements pré-configurés. Tu possèdes :

• Le pouvoir de créer des réseaux complets sur une seule machine
• Le contrôle absolu sur chaque aspect de l'environnement
• La liberté de pratiquer sans limites et sans risques
• La capacité de reproduire n'importe quel scénario réel

Cette semaine, tu as appris à construire. Tu comprends maintenant :

• Pourquoi l'isolation est la première loi du laboratoire
• Pourquoi l'automatisation est la clé de la reproductibilité
• Pourquoi la documentation est l'âme du lab durable
• Pourquoi l'architecture compte plus que les composants individuels

Tu as développé le neuvième sens du Gardien : la capacité à concevoir des environnements, à anticiper les besoins, à construire des fondations solides.

Dans la semaine 11, nous passerons de l'architecture à l'exploration active. Nous apprendrons à scanner, à découvrir, à cartographier ce que nous avons construit.

Mais désormais, tu as une compétence fondamentale : tu sais construire ton propre terrain d'entraînement. Et en cybersécurité, posséder son terrain d'entraînement, c'est posséder sa liberté d'apprentissage.

Pratique. Construis. Documente. Chaque lab que tu créés est un monde que tu maîtrises.

Tu n'es plus un simple utilisateur de machines virtuelles. Tu es devenu leur architecte.

— Platon-Y