feat(proxy): jail fail2ban gitea + rate-limit et fermeture de /metrics #21
Notifications
Due Date
No due date set.
Depends on
#19 feat(gitea): script d'installation LXC Alpine + README
Damien/infra-scripts
#20 feat(proxy): réception rsyslog générique pour les services exposés
Damien/infra-scripts
Reference: Damien/infra-scripts#21
Reference in New Issue
Block a user
Objectif
Regrouper tout ce qui est spécifique à Gitea côté proxy : routage rsyslog, jail fail2ban (couche 3) et réécriture de la configuration dynamique Traefik (couche 2 + fermeture de
/metrics).⚠️ Prérequis bloquant
Ne pas déployer avant que la procédure de validation XFF de #19 ait confirmé que
gitea.logcontient l'IP publique réelle du client.Si Gitea logue l'IP tailnet du proxy, le jail bannira le proxy lui-même au bout de 5 échecs et
gitea.arnodo.frdeviendra intégralement inaccessible.1. Routage rsyslog
/etc/rsyslog.d/50-gitea.conf— routage par tag vers/var/log/gitea/gitea.log, suivant le pattern posé en #20. Un seul fichier, aucune modification du listener générique.2. Filet de sécurité fail2ban
/etc/fail2ban/jail.local:Garantit qu'une erreur de configuration XFF ne peut pas bannir le tailnet. À poser avant le jail lui-même.
3. Filtre et jail
/etc/fail2ban/filter.d/gitea.conf— filtre officiel Gitea :/etc/fail2ban/jail.d/gitea.conf:Rappel du besoin : Gitea renvoie un HTTP 200 sur un échec de login web (la page est simplement re-rendue avec l'erreur). Le jail
traefik-authexistant, qui matche surDownstreamStatus, est donc structurellement aveugle au brute force sur le formulaire de login. D'où ce jail distinct, basé sur le log applicatif.Le
fail2ban-prometheus-exporterdéjà en place remonteragitea-authsans aucune modification.4. Réécriture de
conf.d/gitea.ymlTrois routers avec priorités explicites, plus le basculement du backend.
Points d'attention :
ipAllowListet nonipWhiteList— le stack tourne surtraefik:v3.sourceCriteriondu rate-limit laissé au défaut (remoteAddr) : Traefik est le bord, il voit directement l'IP client.http://gitea.taila5ad8.ts.net:3000àhttps://gitea.taila5ad8.ts.net(443, sans port), conséquence dutailscale servemis en place en #19./metricsreste joignable sur le tailnet ; seul l'accès public est fermé.Note de séquencement
La migration des données étant hors périmètre du milestone, le basculement du backend rend cette configuration incompatible avec l'instance Gitea actuellement en production. À appliquer au moment de la bascule effective, pas avant.
Fichiers touchés
proxy/install.sh— blocs rsyslog service, fail2ban, écriture deconf.d/gitea.ymlCritères d'acceptation
fail2ban-client status gitea-authopérationnelfail2ban-regex /var/log/gitea/gitea.log /etc/fail2ban/filter.d/gitea.confmatche les échecs réelsignoreip)https://gitea.arnodo.fr/metricsrenvoie 403 depuis Internethttps://gitea.<tailnet>.ts.net/metricsrépond avec le bearer token/user/loginen une minute est throttlégit cloneHTTPS non affecté par le rate-limit ni par le jailfail2ban-exporterDépendances
tailscale serve)