← Accueil

PCTAMALOU

Semaine 9 : Les Services de la Cité – SSH, FTP et Leurs Faiblesses Inhérentes

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

🎯 Objectif de la semaine

Maîtriser la configuration sécurisée des services réseau SSH et FTP, comprendre leurs vulnérabilités par défaut et implémenter des durcissements professionnels pour protéger les accès distants aux systèmes.

Pourquoi c'est critique : SSH est la porte d'entrée numéro 1 des serveurs Linux. Une mauvaise configuration SSH équivaut à laisser les clés sous le paillasson.

flowchart TD subgraph SSH_Secure[SSH - Secure by Design] A[👤 Client SSH] --> B[🔐 Chiffrement AES/ChaCha20] B --> C[🔑 Authentification Clés] C --> D[📝 Journalisation complète] D --> E[⚙️ Durcissement Config] end subgraph FTP_Insecure[FTP - Insecure by Default] F[👤 Client FTP] --> G[📢 Authentification claire] G --> H[📡 Données en clair] H --> I[🎯 Cible facile scanners] I --> J[⚠️ Jamais en production] end SSH_Secure --> K[✅ Recommandé:
SSH/SFTP/SCP] FTP_Insecure --> L[❌ Alternatives:
SFTP/FTPS/rsync] M[🎭 Attaques communes] --> N[💥 Bruteforce SSH] M --> O[👂 Sniffing FTP] M --> P[🎯 Man-in-the-Middle] M --> Q[🔄 Session Hijacking] R[🛡️ Contremesures] --> S[🔑 Clés SSH uniquement] R --> T[🚪 Changement port] R --> U[⏱️ Rate limiting] R --> V[📋 Allow/Deny lists] style SSH_Secure fill:#0a0e17,stroke:#00f5a0,stroke-width:2px style FTP_Insecure fill:#11151f,stroke:#ef4444,stroke-width:2px style R fill:#0a0e17,stroke:#00d4ff,stroke-width:2px

📚 Sujet – Théorie (1 heure)

SSH : La forteresse numérique (si bien configurée)

🔐 Pourquoi SSH est fondamentalement sécurisé :

  1. Chiffrement de bout en bout (algorithme négocié)
  2. Authentification forte (clés asymétriques)
  3. Intégrité des données (HMAC)
  4. Forward secrecy (DHE/ECDHE)
  5. Journalisation complète (auth.log)

Mais... les configurations par défaut annulent souvent ces avantages.

Les 7 péchés capitaux de la configuration SSH

Configuration Valeur par défaut Risque Impact sécurité Correction
PermitRootLogin yes Accès root direct CRITIQUE prohibit-password
PasswordAuthentication yes Bruteforce possible ÉLEVÉ no
Port 22 Scan automatique MOYEN 2222 ou autre
X11Forwarding yes Attaques X11 MOYEN no
AllowTcpForwarding yes Tunnels non contrôlés FAIBLE no ou limité
ClientAliveInterval 0 Sessions infinies MOYEN 300 (5 min)
MaxAuthTries 6 Trop d'essais ÉLEVÉ 3

FTP : L'ancien monde dangereux

⚠️ Pourquoi FTP ne devrait plus exister :

FTP standard (port 21) :

  • Authentification en clair (login/mot de passe visibles)
  • Données transférées en clair
  • Mode actif/passif complexe (problèmes firewall)
  • Pas de vérification d'intégrité

Chiffres choquants : En 2024, plus de 2 millions de serveurs FTP exposés sur Internet, dont 40% avec accès anonyme activé.

Alternatives modernes à FTP

graph LR A["📁 Transfert Fichiers"] --> B["🔓 FTP (Port 21)
À éviter absolument"] A --> C["🔐 FTPS (Port 990)
FTP + SSL/TLS"] A --> D["✅ SFTP (Port 22)
SSH File Transfer"] A --> E["🚀 SCP (Port 22)
Simple Copy over SSH"] A --> F["⚡ rsync (Port 873)
Sync intelligent"] A --> G["☁️ Nextcloud/WebDAV
HTTPS moderne"] B --> H["❌ Jamais en production"] C --> I["⚠️ Compliqué à configurer"] D --> J["✅ Recommandé"] E --> J F --> K["⭐ Excellent pour backups"] G --> L["🏢 Entreprise moderne"] style B fill:#11151f,stroke:#ef4444,stroke-width:2px,color:#fff style D fill:#0a0e17,stroke:#00f5a0,stroke-width:2px,color:#fff

Cryptographie SSH : Comment ça marche vraiment

🔑 Les 3 types de clés SSH :

  1. RSA (2048+ bits) : Standard historique, toujours valide
  2. ECDSA (256+ bits) : Plus courtes, plus rapides
  3. Ed25519 (256 bits) : Moderne, sécurisé, recommandé
# Génération des différentes clés
ssh-keygen -t rsa -b 4096 -C "comment"      # RSA 4096 bits
ssh-keygen -t ecdsa -b 521 -C "comment"     # ECDSA 521 bits
ssh-keygen -t ed25519 -C "comment"          # Ed25519 (recommandé)

Règle du Gardien : "Une clé SSH est comme une clé physique. Ne la partagez pas, ne la perdez pas, changez-la régulièrement."

Architecture de sécurité SSH multi-niveaux

🏰 Défense en profondeur SSH :

  1. Niveau 1 : Pare-feu (Bloquer tout sauf port SSH)
  2. Niveau 2 : Fail2ban (Bloquer IPs après échecs)
  3. Niveau 3 : Port non standard (Éviter scans automatiques)
  4. Niveau 4 : Clés uniquement (Pas de mots de passe)
  5. Niveau 5 : 2FA (Authentification à deux facteurs)
  6. Niveau 6 : Bastion/Jump Host (Serveur dédié SSH)
  7. Niveau 7 : Monitoring (Alertes sur connexions)

💡 Philosophie de la sécurité des services :

"Configurez chaque service comme s'il allait être exposé à Internet, même s'il ne l'est pas. Parce qu'un jour, il pourrait l'être."

Les mauvaises configurations internes deviennent des failles critiques lors des migrations, extensions ou erreurs de configuration réseau.

🔬 Mission pratique – Laboratoire (2 heures)

Scénario : Durcissement complet d'un serveur d'entreprise

Vous êtes administrateur système. Vous devez sécuriser un serveur Linux qui sera exposé à Internet. Votre mission : implémenter toutes les bonnes pratiques de sécurité SSH et éliminer les services dangereux.

⚠️ IMPORTANT : Ce lab modifie la configuration système. Travaillez sur une VM dédiée ou faites des sauvegardes.

# Sauvegarde complète avant modifications
sudo cp -r /etc/ssh /etc/ssh.backup
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.original
date > ~/ssh_hardening_backup.txt
echo "Sauvegarde effectuée: $(date)"

Étapes détaillées : Durcissement professionnel

  1. Audit de la configuration SSH actuelle
    Commencez par comprendre l'existant :
    echo "=== AUDIT CONFIGURATION SSH ACTUELLE ==="
    
    # 1. Vérification service
    sudo systemctl status ssh --no-pager -l
    
    # 2. Configuration actuelle
    echo -e "\n=== CONFIGURATION ACTUELLE (extraits) ==="
    sudo grep -E "(Port|PermitRootLogin|PasswordAuthentication|Protocol)" /etc/ssh/sshd_config
    
    # 3. Ports ouverts SSH
    echo -e "\n=== PORTS SSH OUVERTS ==="
    sudo ss -tlnp | grep -E "(22|2222|ssh)"
    
    # 4. Clés autorisées
    echo -e "\n=== CLÉS AUTORISÉES (root) ==="
    sudo cat /root/.ssh/authorized_keys 2>/dev/null | wc -l | xargs echo "Clés root:"
    echo -e "\n=== CLÉS AUTORISÉES (kali) ==="
    cat ~/.ssh/authorized_keys 2>/dev/null | wc -l | xargs echo "Clés kali:"
    
    # 5. Analyse sécurité
    echo -e "\n=== ANALYSE SÉCURITÉ ==="
    sudo sshd -T | grep -E "(permitrootlogin|passwordauthentication|usepam|protocol)" | sort
    
    # 6. Tentatives échouées récentes
    echo -e "\n=== TENTATIVES RÉCENTES (auth.log) ==="
    sudo tail -20 /var/log/auth.log | grep -i ssh | grep -E "(fail|invalid)" | tail -5 || echo "Aucune tentative récente"
    
    # Sauvegarde audit
    sudo sshd -T > ssh_audit_before.txt
    echo "Audit sauvegardé dans ssh_audit_before.txt"
  2. Génération de clés SSH professionnelles
    Créez des clés robustes avec bonnes pratiques :
    echo "=== GÉNÉRATION CLÉS SSH PROFESSIONNELLES ==="
    
    # 1. Backup anciennes clés
    mkdir -p ~/.ssh/backup_$(date +%Y%m%d)
    cp ~/.ssh/id_* ~/.ssh/backup_$(date +%Y%m%d)/ 2>/dev/null || true
    
    # 2. Génération clé Ed25519 (recommandée)
    echo "Génération clé Ed25519:"
    ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519 -C "kali@pctamalou-$(date +%Y%m%d)"
    # -a 100 : 100 tours de derivation de clé (KDF rounds)
    # -f : fichier de sortie
    # -C : commentaire (bonne pratique pour tracking)
    
    # 3. Génération clé RSA 4096 (compatibilité)
    echo -e "\nGénération clé RSA 4096 (backup/compatibilité):"
    ssh-keygen -t rsa -b 4096 -o -a 100 -f ~/.ssh/id_rsa -C "kali@pctamalou-rsa-$(date +%Y%m%d)"
    
    # 4. Vérification
    echo -e "\n=== VÉRIFICATION CLÉS GÉNÉRÉES ==="
    ls -la ~/.ssh/id_*
    echo -e "\nEmpreintes:"
    ssh-keygen -l -f ~/.ssh/id_ed25519
    ssh-keygen -l -f ~/.ssh/id_rsa
    
    # 5. Configuration agent SSH
    echo -e "\n=== CONFIGURATION AGENT SSH ==="
    eval "$(ssh-agent -s)"
    ssh-add ~/.ssh/id_ed25519
    ssh-add -l
    
    # 6. Autorisation clé publique
    echo -e "\n=== AUTORISATION CLÉ PUBLIQUE ==="
    cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys
    echo "Clé autorisée pour $(whoami)"
  3. Configuration SSH durcie (sshd_config)
    Créez une configuration professionnelle :
    echo "=== CONFIGURATION SSHD DURCIE ==="
    
    # Backup configuration originale
    sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup_$(date +%Y%m%d)
    
    # Création nouvelle configuration
    sudo tee /etc/ssh/sshd_config << 'EOF'
    # PCTAMALOU - Configuration SSH durcie
    # Générée le: $(date)
    # Documentation: https://www.ssi.gouv.fr/guide/recommandations-de-securisation-dun-serveur-ssh/
    
    # ============================================
    # CONNEXION ET AUTHENTIFICATION
    # ============================================
    Port 2222                          # Port non standard
    ListenAddress 0.0.0.0              # Écoute sur toutes les interfaces
    Protocol 2                         # SSHv2 uniquement
    
    # ============================================
    # AUTHENTIFICATION
    # ============================================
    PermitRootLogin prohibit-password # Pas de root par mot de passe
    PasswordAuthentication no         # Pas d'authentification par mot de passe
    PubkeyAuthentication yes          # Authentification par clés uniquement
    AuthorizedKeysFile .ssh/authorized_keys
    
    # 2FA optionnel (décommenter pour activer)
    # AuthenticationMethods publickey,keyboard-interactive:pam
    
    # ============================================
    # SÉCURITÉ SESSION
    # ============================================
    LoginGraceTime 30s                 # Temps max pour s'authentifier
    MaxAuthTries 3                     # Max 3 tentatives d'authentification
    MaxSessions 10                     # Max 10 sessions simultanées par connexion
    ClientAliveInterval 300            # Vérifie client toutes les 5 minutes
    ClientAliveCountMax 2              # Déconnecte après 10 minutes d'inactivité
    
    # ============================================
    # CHIFFREMENT ET ALGORITHMES
    # ============================================
    # Kex (Key Exchange) algorithms
    KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
    
    # Host key algorithms
    HostKeyAlgorithms ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256,rsa-sha2-256-cert-v01@openssh.com
    
    # Ciphers (chiffrement)
    Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
    
    # MACs (Message Authentication Codes)
    MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com
    
    # ============================================
    # RESTRICTIONS ET LIMITATIONS
    # ============================================
    AllowUsers kali                    # Utilisateurs autorisés (ajouter les autres)
    DenyUsers root                     # Utilisateurs interdits
    AllowGroups ssh-users              # Groupes autorisés (créer si nécessaire)
    
    # Restriction par IP (exemple, décommenter et adapter)
    # AllowUsers kali@192.168.1.0/24
    # AllowUsers admin@10.0.0.0/8
    
    # ============================================
    # FONCTIONNALITÉS AVANCÉES
    # ============================================
    X11Forwarding no                   # Pas de forwarding X11
    AllowTcpForwarding no              # Pas de port forwarding TCP
    AllowStreamLocalForwarding no      # Pas de forwarding socket Unix
    GatewayPorts no                    # Pas de binding sur toutes les interfaces
    PermitTunnel no                    # Pas de tunneling
    
    # SFTP uniquement (pour certains utilisateurs)
    # Subsystem sftp internal-sftp
    # Match User sftpuser
    #   ChrootDirectory /var/sftp
    #   ForceCommand internal-sftp
    #   AllowTcpForwarding no
    #   X11Forwarding no
    
    # ============================================
    # LOGGING ET MONITORING
    # ============================================
    SyslogFacility AUTH                # Facility pour les logs
    LogLevel VERBOSE                   # Niveau de détail des logs
    PrintMotd no                       # Pas de message du jour
    PrintLastLog yes                   # Affiche dernière connexion
    TCPKeepAlive yes                   # Keepalive TCP
    
    # ============================================
    # PERFORMANCES
    # ============================================
    Compression delayed                # Compression seulement après authentification
    UseDNS no                          # Pas de résolution DNS inverse (performance)
    GSSAPIAuthentication no            # Désactive GSSAPI (sauf besoin)
    EOF
    
    echo "Configuration SSH durcie générée"
  4. Vérification et application
    Testez avant d'appliquer :
    echo "=== VÉRIFICATION SYNTAXE ==="
    
    # 1. Vérification syntaxe
    sudo sshd -t
    if [ $? -eq 0 ]; then
        echo "✅ Syntaxe SSH config valide"
    else
        echo "❌ Erreur syntaxe, vérifiez la configuration"
        exit 1
    fi
    
    # 2. Redémarrage service
    echo -e "\n=== REDÉMARRAGE SERVICE ==="
    sudo systemctl restart ssh
    
    # 3. Vérification statut
    echo -e "\n=== VÉRIFICATION STATUT ==="
    sudo systemctl status ssh --no-pager -l | head -20
    
    # 4. Test connexion locale
    echo -e "\n=== TEST CONNEXION LOCALE ==="
    ssh -p 2222 kali@localhost "echo '✅ Connexion SSH réussie'" || echo "❌ Échec connexion"
    
    # 5. Test connexion root (devrait échouer)
    echo -e "\n=== TEST CONNEXION ROOT (devrait échouer) ==="
    ssh -p 2222 root@localhost "echo test" 2>&1 | grep -i "permission denied" && echo "✅ Root correctement bloqué"
    
    # 6. Vérification ports
    echo -e "\n=== VÉRIFICATION PORTS ==="
    sudo ss -tlnp | grep 2222 || echo "Port 2222 non en écoute"
    sudo ss -tlnp | grep :22 && echo "⚠️  Port 22 toujours en écoute (à désactiver si nécessaire)"
  5. Analyse et durcissement FTP
    Identifiez et sécurisez les services FTP :
    echo "=== ANALYSE ET SÉCURISATION FTP ==="
    
    # 1. Détection services FTP
    echo "1. Services FTP actifs:"
    sudo ss -tlnp | grep -E "(21|20|990)" || echo "Aucun service FTP détecté"
    
    # 2. Recherche packages FTP installés
    echo -e "\n2. Packages FTP installés:"
    dpkg -l | grep -i "ftp\|vsftpd\|proftpd" || echo "Aucun package FTP trouvé"
    
    # 3. Désactivation FTP si présent
    if systemctl is-active --quiet vsftpd 2>/dev/null; then
        echo -e "\n3. 🛑 DÉSACTIVATION VSFTPD (FTP dangereux)"
        sudo systemctl stop vsftpd
        sudo systemctl disable vsftpd
        echo "VSFTPD désactivé"
    fi
    
    # 4. Configuration SFTP via SSH (alternative sécurisée)
    echo -e "\n4. 🔧 CONFIGURATION SFTP SÉCURISÉ"
    echo "SFTP est déjà disponible via SSH sur le port 2222"
    echo "Test: sftp -P 2222 kali@localhost"
    
    # 5. Test FTP vs SFTP
    echo -e "\n5. 🧪 TEST COMPARATIF FTP vs SFTP"
    echo "Test FTP (si activé):"
    curl ftp://localhost 2>/dev/null || echo "FTP non disponible (bon!)"
    
    echo -e "\nTest SFTP:"
    sftp -P 2222 kali@localhost <<< "exit" 2>&1 | grep -i "connected" && echo "✅ SFTP fonctionnel"
    
    # 6. Audit sécurité FTP historique
    echo -e "\n6. 📊 AUDIT HISTORIQUE FTP"
    sudo find /etc -name "*ftp*" -type f 2>/dev/null | while read file; do
        echo "Fichier FTP trouvé: $file"
    done
  6. Script Python d'audit SSH automatique
    Créez un outil d'audit professionnel :
    #!/usr/bin/env python3
    """
    PCTAMALOU - Semaine 9 : Auditeur de sécurité SSH
    Analyse automatique des configurations SSH et détection des vulnérabilités
    """
    
    import subprocess
    import re
    import json
    from datetime import datetime
    
    def run_command(cmd):
        """Exécute une commande shell"""
        try:
            result = subprocess.run(cmd, shell=True, capture_output=True, text=True, check=True)
            return result.stdout.strip()
        except subprocess.CalledProcessError as e:
            return f"ERROR: {e}"
    
    def analyze_sshd_config():
        """Analyse la configuration SSH"""
        config_path = "/etc/ssh/sshd_config"
        
        try:
            with open(config_path, 'r') as f:
                content = f.read()
        except FileNotFoundError:
            return {"error": "Fichier sshd_config non trouvé"}
        
        # Recherche des paramètres critiques
        patterns = {
            'Port': r'Port\s+(\d+)',
            'PermitRootLogin': r'PermitRootLogin\s+(\S+)',
            'PasswordAuthentication': r'PasswordAuthentication\s+(\S+)',
            'Protocol': r'Protocol\s+(\d+)',
            'MaxAuthTries': r'MaxAuthTries\s+(\d+)',
            'ClientAliveInterval': r'ClientAliveInterval\s+(\d+)',
            'AllowUsers': r'AllowUsers\s+(.+)',
            'Ciphers': r'Ciphers\s+(.+)',
            'KexAlgorithms': r'KexAlgorithms\s+(.+)'
        }
        
        config = {}
        for key, pattern in patterns.items():
            match = re.search(pattern, content, re.IGNORECASE | re.MULTILINE)
            config[key] = match.group(1) if match else "NON DÉFINI"
        
        # Analyse des risques
        risks = []
        
        if config.get('Port') == '22':
            risks.append({"severity": "MEDIUM", "issue": "Port SSH standard (22)", "recommendation": "Changer de port"})
        
        if config.get('PermitRootLogin', '').lower() in ['yes', 'without-password']:
            risks.append({"severity": "HIGH", "issue": "Root login permis", "recommendation": "Définir à 'prohibit-password' ou 'no'"})
        
        if config.get('PasswordAuthentication', '').lower() == 'yes':
            risks.append({"severity": "HIGH", "issue": "Authentification par mot de passe activée", "recommendation": "Désactiver, utiliser uniquement clés SSH"})
        
        if config.get('Protocol', '') not in ['2', '2,1']:
            risks.append({"severity": "CRITICAL", "issue": "SSHv1 activé", "recommendation": "Utiliser uniquement Protocol 2"})
        
        if config.get('MaxAuthTries', '6') > '3':
            risks.append({"severity": "MEDIUM", "issue": f"Trop de tentatives autorisées: {config['MaxAuthTries']}", "recommendation": "Réduire à 3"})
        
        return {
            "config": config,
            "risks": risks,
            "risk_count": len(risks)
        }
    
    def check_ssh_listening():
        """Vérifie les ports SSH en écoute"""
        output = run_command("sudo ss -tlnp | grep -E '(:22|:2222|ssh)'")
        
        listening = []
        for line in output.split('\n'):
            if line:
                parts = line.split()
                if len(parts) >= 5:
                    listening.append({
                        "state": parts[1],
                        "local": parts[4],
                        "process": parts[-1] if len(parts) > 5 else "N/A"
                    })
        
        return listening
    
    def analyze_auth_logs():
        """Analyse les logs d'authentification SSH"""
        try:
            # Dernières 24h
            output = run_command("sudo journalctl -u ssh --since '24 hours ago' | tail -100")
            
            failed_attempts = []
            for line in output.split('\n'):
                if 'Failed password' in line or 'Invalid user' in line:
                    # Extraction IP
                    ip_match = re.search(r'from (\d+\.\d+\.\d+\.\d+)', line)
                    ip = ip_match.group(1) if ip_match else "UNKNOWN"
                    
                    # Extraction utilisateur
                    user_match = re.search(r'for (\S+) from', line)
                    user = user_match.group(1) if user_match else "UNKNOWN"
                    
                    failed_attempts.append({
                        "ip": ip,
                        "user": user,
                        "timestamp": line[:15] if line else "UNKNOWN"
                    })
            
            return {
                "total_failed": len(failed_attempts),
                "recent_attempts": failed_attempts[:10]  # 10 plus récents
            }
            
        except Exception as e:
            return {"error": str(e)}
    
    def generate_report():
        """Génère un rapport d'audit complet"""
        print("🔐 PCTAMALOU - Audit de sécurité SSH")
        print("=" * 60)
        print(f"Date: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
        
        # 1. Configuration
        print("\n1. 📋 CONFIGURATION SSH:")
        config = analyze_sshd_config()
        
        if "error" in config:
            print(f"   ❌ {config['error']}")
        else:
            for key, value in config['config'].items():
                print(f"   • {key}: {value}")
        
        # 2. Risques
        print(f"\n2. ⚠️  RISQUES DÉTECTÉS ({config.get('risk_count', 0)}):")
        if config.get('risks'):
            for risk in config['risks']:
                print(f"   • [{risk['severity']}] {risk['issue']}")
                print(f"     → {risk['recommendation']}")
        else:
            print("   ✅ Aucun risque critique détecté")
        
        # 3. Ports en écoute
        print("\n3. 📡 PORTS EN ÉCOUTE:")
        listening = check_ssh_listening()
        if listening:
            for item in listening:
                print(f"   • {item['local']} - {item['state']} - {item['process']}")
        else:
            print("   ℹ️  Aucun service SSH détecté")
        
        # 4. Tentatives échouées
        print("\n4. 🚨 TENTATIVES ÉCHOUÉES (24h):")
        logs = analyze_auth_logs()
        if "error" in logs:
            print(f"   ❌ {logs['error']}")
        else:
            print(f"   • Total: {logs['total_failed']} tentatives")
            if logs['recent_attempts']:
                print("   • 10 plus récentes:")
                for attempt in logs['recent_attempts']:
                    print(f"     - {attempt['timestamp']}: {attempt['user']}@{attempt['ip']}")
        
        # 5. Recommandations
        print("\n5. 💡 RECOMMANDATIONS:")
        recommendations = [
            "Utiliser uniquement des clés SSH (pas de mots de passe)",
            "Changer le port SSH par défaut (22)",
            "Désactiver l'accès root direct",
            "Limiter les tentatives d'authentification (MaxAuthTries 3)",
            "Mettre en place Fail2ban pour bloquer les IPs malveillantes",
            "Utiliser des algorithmes de chiffrement modernes (Ed25519, ChaCha20)",
            "Limiter les utilisateurs autorisés (AllowUsers)",
            "Mettre en place une journalisation centralisée"
        ]
        
        for i, rec in enumerate(recommendations, 1):
            print(f"   {i}. {rec}")
        
        # 6. Export JSON
        report = {
            "timestamp": datetime.now().isoformat(),
            "config_analysis": config,
            "listening_ports": listening,
            "auth_logs": logs,
            "recommendations": recommendations
        }
        
        with open('ssh_security_audit.json', 'w') as f:
            json.dump(report, f, indent=2, default=str)
        
        print(f"\n💾 Rapport exporté: ssh_security_audit.json")
        
        return report
    
    if __name__ == "__main__":
        generate_report()

🎯 Défi de sécurité avancé

Implémentez un système de sécurité SSH complet qui :

  1. Détecte et bloque automatiquement les scans SSH (port knocking)
  2. Implémente l'authentification à deux facteurs (TOTP via Google Authenticator)
  3. Crée un bastion/jump host avec accès restreint
  4. Met en place une journalisation centralisée des sessions SSH
  5. Implémente un système de rotation automatique des clés SSH
  6. Crée des alertes temps réel pour les connexions inhabituelles
  7. Génère des rapports de conformité automatiques

Indices : Utilisez pam_google_authenticator pour 2FA, auditd pour le logging, fail2ban pour le blocage, et un script Python pour la rotation des clés.

📋 Objectif de la semaine – Checklist de validation

✅ Compétences techniques acquises

  • Configurer SSH avec authentification par clés uniquement
  • Générer et gérer des clés SSH Ed25519 et RSA
  • Durcir la configuration SSH (port, root, algorithmes)
  • Identifier et désactiver les services FTP non sécurisés
  • Analyser les logs SSH pour détecter les attaques
  • Automatiser l'audit de sécurité SSH avec Python

🧠 Changement mental accompli

  • Voir chaque service exposé comme une surface d'attaque
  • Comprendre que "par défaut ≠ sécurisé" pour les services
  • Penser en termes de défense en profondeur pour les accès
  • Appliquer le principe "zero trust" même aux accès internes

🔐 Règles d'or de la sécurité SSH :

  1. Jamais de mot de passe SSH en production
  2. Jamais d'accès root direct
  3. Toujours des clés fortes (Ed25519 ou RSA 4096)
  4. Toujours un port non standard (ou WAF devant)
  5. Toujours une journalisation et monitoring
  6. Toujours des mises à jour régulières

📚 Ressources gratuites recommandées

Pour approfondir :

⚠️ Erreurs fatales à éviter

  • Clés SSH sans passphrase : Si la clé est volée, accès immédiat
  • Authorized_keys permissions incorrectes : Doit être 600
  • .ssh directory permissions incorrectes : Doit être 700
  • Port forwarding non contrôlé : Peut créer des backdoors
  • Agent forwarding : Peut exposer vos clés à des serveurs compromis
  • Known_hosts non surveillé : Peut masquer des attaques MITM

🔮 Frère d'armes,

Tu viens de transformer la porte d'entrée de ta cité numérique en forteresse.

Maintenant, quand tu vois un service SSH, tu ne vois plus juste un accès distant. Tu vois :

• Les algorithmes de chiffrement qui protègent la conversation
• Les clés asymétriques qui prouvent l'identité
• Les règles d'accès qui limitent les permissions
• Les logs de sécurité qui tracent chaque mouvement

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

• Pourquoi SSH avec mot de passe est comme une porte avec serrure transparente
• Pourquoi FTP est comme crier ses secrets dans un couloir
• Pourquoi chaque paramètre de configuration compte
• Pourquoi la sécurité n'est pas un état, mais un processus

Tu as développé le huitième sens du Gardien système : la capacité à sentir les configurations faibles, à anticiper les attaques, à construire des défenses résilientes.

Dans la semaine 10, nous passerons des services individuels à l'architecture réseau complète. Nous apprendrons à segmenter, à isoler, à contrôler les flux entre les services.

Mais désormais, tu as une compétence fondamentale : tu sais sécuriser les accès. Et en cybersécurité, sécuriser les accès, c'est contrôler qui entre et qui sort.

Pratique. Durcis. Surveille. Chaque service que tu sécurises est une porte que tu sais garder.

Tu n'es plus un simple utilisateur des services. Tu es devenu leur protecteur.

— Platon-Y