# GABARIT réutilisable pour protéger une NOUVELLE appli contre le # brute-force applicatif — n'importe quelle appli sur ce VPS, pas # seulement ce projet (trouvé utile après un résidu de jail appartenant à # une autre appli Django sur ce même serveur partagé, cf. CONTEXT.md). # Ce fichier n'est PAS déployé tel quel (extension .template, ignorée par # la boucle de copie générique d'install.sh::deploy_fail2ban) : c'est un # modèle à copier et adapter. Exemple concret déjà en place : # emitter-admin-auth.conf + emitter/banevents/signals.py (Django + # django-axes). # # Mode d'emploi : # 1. Faire journaliser à l'appli une ligne EXACTEMENT au format attendu # par filter.d/app-auth.conf (générique, partagé par toutes les # jails app-auth-*, rien à écrire côté filtre) : # Verrouillage après échecs répétés depuis (...) # = un seul mot (\S+ côté filtre), ex. "émetteur", # "webmail". L'appli décide QUAND verrouiller (son propre seuil # applicatif, cf. AXES_FAILURE_LIMIT pour l'exemple django-axes) — # fail2ban ne fait que réagir à cette décision déjà prise (d'où # maxretry=1 ci-dessous : chaque ligne EST déjà la décision, pas la # peine de recompter un 2e seuil derrière). # IMPORTANT — timestamp en tête de ligne : marquer explicitement le # fuseau (ex. suffixe "Z" ISO 8601, UTC), voir le commentaire dans # filter.d/app-auth.conf pour le pourquoi (piège vécu avec Django, # TIME_ZONE='UTC' + time.tzset() : sans marqueur, fail2ban ignore # silencieusement les lignes fraîches juste après son propre # redémarrage si le fuseau système du VPS diffère d'UTC). # 2. Copier ce fichier vers jail.d/-auth.conf, remplacer # __APP_NAME__ (nom de la jail, unique) et __APP_AUTH_LOGPATH__ # (chemin réel du fichier de log). # 3. Si ce chemin dépend du VPS (répertoire de déploiement différent # d'un serveur à l'autre — le cas courant) : NE PAS le laisser dans # la boucle de copie générique d'install.sh::deploy_fail2ban (même # piège que coturn.conf/emitter-admin-auth.conf, voir CONTEXT.md). # Ajouter plutôt une fonction deploy__jail dédiée (sed sur le # placeholder), sur le modèle de deploy_emitter_admin_auth_jail. # 4. S'assurer que le fichier de log existe déjà (touch) avant le # premier démarrage de fail2ban après déploiement — un logpath # inexistant fait planter fail2ban au chargement (incident coturn, # voir ROADMAP.md Phase 1.b). [__APP_NAME__-auth] enabled = true backend = auto filter = app-auth logpath = __APP_AUTH_LOGPATH__ maxretry = 1 findtime = 1h bantime = 24h