{ "meta": { "title": "Fail2Ban | Documentation ProxMenux", "description": "Installez Fail2Ban avec trois jails optimisés pour Proxmox (SSH agressif, Proxmox UI 8006, ProxMenux Monitor 8008). Inclut le correctif journald MaxLevelStore, des services de journalisation personnalisés pour plus de fiabilité, un backend nftables/iptables détecté automatiquement et le renforcement SSH MaxAuthTries.", "ogTitle": "Fail2Ban | Documentation ProxMenux", "ogDescription": "Protection contre la force brute pour SSH et les interfaces web Proxmox, avec des correctifs journald et backend propres à Proxmox." }, "header": { "title": "Fail2Ban", "description": "Installe Fail2Ban pour Proxmox : trois jails (SSH agressif, interface Proxmox sur 8006, ProxMenux Monitor sur 8008 et proxy inverse), correction du niveau journald pour conserver les événements SSH, deux services copiant le journal vers des fichiers afin de contourner un problème connu du backend systemd, détection du backend de pare-feu et durcissement SSH avec MaxAuthTries.", "section": "Sécurité" }, "intro": { "title": "Ce que ça fait", "body": "Installe Fail2Ban depuis les dépôts Debian et écrit une configuration Proxmox protégeant immédiatement SSH, l'interface web Proxmox et ProxMenux Monitor. Une installation existante est détectée et un menu de gestion propose de réinstaller ou de supprimer." }, "firstLaunch": { "heading": "Boîte de dialogue Premier lancement", "body": "Sans Fail2Ban installé, le script résume dans un dialogue ce qu'il va installer et configurer. Annuler quitte sans modification ; confirmer lance l'installation.", "imageAlt": "Confirmation de Fail2Ban avec les trois jails, correction de journald et durcissement SSH" }, "jails": { "heading": "Les trois jails", "headerJail": "Jail", "headerProtects": "Protège", "headerRetries": "Tentatives / Fenêtre", "headerBan": "Durée de blocage", "rows": [ { "jail": "[sshd]", "protects": "SSH (mode agressif — couvre ddos, mode, normal)", "retries": "2 / 60 min", "ban": "9 heures" }, { "jail": "[proxmox]", "protects": "UI web Proxmox (port 8006)", "retries": "3 / 10 min", "ban": "1 heure" }, { "jail": "[proxmenux]", "protects": "ProxMenux Monitor (port 8008 + http/https proxy inverse)", "retries": "3 / 10 min", "ban": "1 heure" } ], "outro": "Par défaut mondial à partir de jail.local: ignoreip = 127.0.0.1/8 ::1, ignoreself = true, bantime = 86400 (24h pour les prisons qui ne le remplacent pas), maxretry = 2, findtime = 1800." }, "journald": { "heading": "Pourquoi la correction de journald est importante", "intro": "Proxmox fournit /etc/systemd/journald.conf avec MaxLevelStore=warning. journald supprime les messages de niveau inférieur à warning avant de les stocker. SSH et PAM signalent les échecs d'authentification aux niveaux info / notice, donc :", "diagram": { "sshLabel": "SSH / PAM", "sshDetail": "échec d'authentification\n(niveau info / notice)", "journaldLabel": "journald", "journaldDetail": "MaxLevelStore=warning\n→ événement ignoré sans avertissement", "fail2banLabel": "Fail2Ban", "fail2banDetail": "ne voit rien\n→ n'interdit jamais rien", "arrowLabel": "Proxmox par défaut" }, "afterDiagram": "L'installateur détecte cela et écrit un drop-in à /etc/systemd/journald.conf.d/proxmenux-loglevel.conf élevant à la fois MaxLevelStore et MaxLevelSyslog à info:", "code": "[Journal]\nMaxLevelStore=info\nMaxLevelSyslog=info", "outro": "Puis redémarre systemd-journald. Le drop-in est supprimé lors de la désinstallation, ce qui restaure le Proxmox original par défaut." }, "loggers": { "heading": "Pourquoi deux services d'enregistreur personnalisé", "intro1": "Fail2Ban peut lire directement le journal systemd (backend = systemd), mais ce backend présente sur Proxmox des problèmes connus avec les processus de travail de pvedaemon : les événements d'authentification apparaissent dans le journal sans être toujours détectés. Le problème concerne aussi parfois sshd.", "intro2": "ProxMenux crée deux petits services systemd qui suivent les unités concernées avec journalctl -f et ajoutent chaque ligne à un fichier. Fail2Ban lit ces fichiers avec le fiable backend = auto (mode fichier) :", "headerService": "Services", "headerSource": "Unité source", "headerOutput": "Fichier de sortie", "rows": [ { "service": "proxmox-auth-logger.service", "source": "pvedaemon.service", "output": "/var/log/proxmox-auth.log" }, { "service": "ssh-auth-logger.service", "source": "ssh.service", "output": "/var/log/ssh-auth.log" } ], "outro": "Les deux services sont déclarés PartOf=fail2ban.service donc ils redémarrent avec Fail2Ban et s'arrêtent avec elle. Mode 640 appartenant à root:adm dans les fichiers journaux. Le troisième journal utilisé par la prison [proxmenux] (/var/log/proxmenux-auth.log) est écrit directement par l'application ProxMenux Monitor Flask — aucun service d'enregistreur nécessaire pour celui-ci." }, "backend": { "heading": "Détection du backend de pare-feu", "intro": "L'installateur sonde l'hôte : si nft list ruleset fonctionne, il choisit nftables comme mesure d'interdiction. Sinon, il revient à iptables-multiport / iptables-allports. Le choix est écrit dans jail.local :", "code": "# nftables host\nbanaction = nftables\nbanaction_allports = nftables[type=allports]\n\n# iptables host (fallback)\nbanaction = iptables-multiport\nbanaction_allports = iptables-allports" }, "hardening": { "heading": "Durcissement SSH : MaxAuthTries", "intro": "Le contrôle Lynis SSH-7408 recommande MaxAuthTries 3 dans sshd_config. La jail SSH utilise maxretry = 2 pour bloquer après des échecs répétés ; MaxAuthTries limite les tentatives dans une connexion. Ce réglage SSH ajoute une défense en profondeur, y compris lorsque Fail2Ban est arrêté pour maintenance.", "installerIntro": "L'installateur:", "items": [ "Lit la valeur actuelle MaxAuthTries (ou par défaut 6 si elle est absente).", "Enregistre-le dans /usr/local/share/proxmenux/sshd_maxauthtries_backup.", "Modifie sshd_config sur place : remplace la ligne existante, décommente une ligne commentée ou ajoute une nouvelle ligne.", "Recharge sshd (recharger, pas redémarrer, pour garder les sessions existantes en vie)." ], "outro": "Lors de la désinstallation, la valeur originale enregistrée est restaurée et sshd est rechargée." }, "manage": { "heading": "Gérer une installation existante", "intro": "Si Fail2Ban est déjà installé lorsque vous ouvrez le menu, le script le détecte et affiche un menu de gestion au lieu de ré-exécuter l'installateur:", "headerAction": "Décision", "headerWhat": "Ce qu'il fait", "rows": [ { "action": "Réinstaller", "what": "Relance l'installation complète et réécrit toutes les jails avec les valeurs actuelles de ProxMenux. À utiliser lorsqu'une mise à jour modifie les recommandations." }, { "action": "Supprimer", "what": "Arrête fail2ban et les deux services d'enregistrement, purge le package apt, supprime tous les fichiers jail/filtre, supprime le drop-in journald (restauration de la valeur par défaut de Proxmox) et restaure l'original SSH MaxAuthTries." } ] }, "verify": { "heading": "Vérifiez que ça marche.", "intro": "Après l'installation, commandes utiles de l'hôte:", "code": "# Service status and version\nsystemctl status fail2ban\nfail2ban-client --version\n\n# All active jails\nfail2ban-client status\n\n# Detail on one jail\nfail2ban-client status sshd\nfail2ban-client status proxmox\nfail2ban-client status proxmenux\n\n# Currently banned IPs in a jail\nfail2ban-client status sshd | grep \"Banned IP\"\n\n# Manually unban an IP (use this if you ban yourself)\nfail2ban-client unban 192.0.2.10\n\n# Tail the auth logs Fail2Ban watches\ntail -f /var/log/ssh-auth.log\ntail -f /var/log/proxmox-auth.log\ntail -f /var/log/fail2ban.log" }, "troubleshoot": { "heading": "Dépannage", "neverBansTitle": "Fail2Ban fonctionne mais n'interdit jamais rien", "neverBansBody": "Vérifiez que tail -f /var/log/ssh-auth.log reçoit une entrée après une tentative SSH avec un mauvais mot de passe depuis une autre machine. Sinon, examinez systemctl status ssh-auth-logger.service. Si le service est actif, consultez les événements récents avec journalctl -u ssh.service -n 50 --no-pager -p info et vérifiez que le complément journald autorise le niveau info.", "monitorEmptyTitle": "La jail ProxMenux Monitor ne contient aucune entrée malgré des connexions échouées", "monitorEmptyBody": "Le [proxmenux] jail lit /var/log/proxmenux-auth.log, qui est écrit par l'application ProxMenux Monitor Flask — et non par un enregistreur journald. Si vous n'exécutez pas le moniteur, le fichier reste vide et le jail ne se déclenche jamais. C'est prévu ; la configuration jail est inoffensive. Si vous exécutez le moniteur et que le journal est vide, vérifiez la configuration de journalisation Flask.", "selfBanTitle": "Je me suis bloqué moi-même", "selfBanIntro": "À partir d'une console / IPMI / iKVM (ou d'une autre IP sur liste blanche):", "selfBanCode": "fail2ban-client unban '<'YOUR_IP'>'\n\n# To prevent it next time, edit /etc/fail2ban/jail.local and add your IP:\nignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 203.0.113.42\n\n# Then reload\nfail2ban-client reload", "aptFailTitle": "Échec d'apt-get : ''Unable to locate package fail2ban''", "aptFailBody": "Les dépôts Debian manquent sur l'hôte (fréquent sur les installations Proxmox minimales). L'installateur crée /etc/apt/sources.list.d/debian.sources avec le bon nom de code (bookworm / trixie), puis réessaie. Si cela échoue encore, vérifiez VERSION_CODENAME dans /etc/os-release et l'accessibilité du dépôt.", "lockoutTitle": "SSH me verrouille après l'installation", "lockoutBody": "L'installateur définit MaxAuthTries=3. Si votre gestionnaire de mot de passe / agent récupère plusieurs clés, vous pouvez dépasser cela sur une seule tentative de connexion. Limiter les clés offertes : ssh -o IdentitiesOnly=yes -i ~/.ssh/specific_key user@host. Ou augmenter temporairement MaxAuthTries en sshd_config pendant le débogage." }, "files": { "heading": "Fichiers écrits", "code": "/etc/fail2ban/jail.local # global defaults + [sshd]\n/etc/fail2ban/jail.d/proxmox.conf # [proxmox]\n/etc/fail2ban/jail.d/proxmenux.conf # [proxmenux]\n/etc/fail2ban/filter.d/proxmox.conf # auth-failure regex for pvedaemon\n/etc/fail2ban/filter.d/proxmenux.conf # auth-failure regex for Monitor\n/etc/systemd/system/proxmox-auth-logger.service # journal → file (pvedaemon)\n/etc/systemd/system/ssh-auth-logger.service # journal → file (sshd)\n/etc/systemd/journald.conf.d/proxmenux-loglevel.conf # MaxLevelStore=info\n/etc/ssh/sshd_config # MaxAuthTries=3 (in-place edit)\n/var/log/proxmox-auth.log # written by logger service\n/var/log/ssh-auth.log # written by logger service\n/var/log/proxmenux-auth.log # written by Monitor Flask app\n/usr/local/share/proxmenux/sshd_maxauthtries_backup # for restore on uninstall" }, "related": { "heading": "Autres", "monitorLabel": "ProxMenux Monitor → Onglet Sécurité", "monitorTail": " — installation depuis le tableau de bord, état des jails en direct, IP bloquées et réglage des tentatives et de la durée de blocage par jail dans le navigateur.", "lynisLabel": "Lynis", "lynisTail": " — lancer un audit avant et après pour vérifier que le contrôle SSH-7408 est satisfait.", "securityLabel": "Aperçu de la sécurité", "securityTail": "— retour à l'aperçu de la section." } }