Le jail [traefik-auth] posé par proxy/install.sh matche DownstreamStatus ∈ {401, 403, 429, 5xx} sur tous les paths, avec maxretry = 10 / findtime = 5m.
Or git clone, git fetch et git push en HTTPS sur un dépôt privé font systématiquement un aller-retour 401 avant d'envoyer les credentials : le client tape l'URL sans auth, reçoit un 401 WWW-Authenticate, puis rejoue la requête avec les identifiants.
Conséquence : 10 opérations git en 5 minutes (boucle de fetch, runner bavard, IDE qui poll) suffisent à faire bannir une IP légitime sur les ports 80/443 pendant 1h. L'usage étant exclusivement HTTPS ici, ce n'est pas un risque théorique.
Correctif
Ajouter un ignoreregex au filtre /etc/fail2ban/filter.d/traefik.conf pour exclure les 401 du protocole Git smart HTTP :
Les 401 sur toute autre route (API, UI, registry) restent couverts.
Fichier touché
proxy/install.sh — bloc d'écriture de /etc/fail2ban/filter.d/traefik.conf
Points d'attention
Le filtre est écrit via un heredoc quoté (<< 'EOF') : pas d'expansion, la regex passe telle quelle.
L'écriture du filtre est aujourd'hui inconditionnelle à chaque run — l'idempotence est donc déjà acquise ici, le rejeu du script réapplique la version corrigée.
Le sudo systemctl restart fail2ban qui suit est déjà en place.
Critères d'acceptation
fail2ban-regex /var/log/traefik/access.log /etc/fail2ban/filter.d/traefik.conf montre les 401 git en ignored et non en matched
Un 401 sur /user/login ou /api/v1/... reste matched
fail2ban-client status traefik-auth démarre sans erreur de parsing
Une série de 15 git fetch consécutifs ne déclenche plus de ban
Indépendance
Aucune dépendance. Mergeable immédiatement, avant tout le reste du milestone — c'est un correctif de production autonome.
## Contexte
Le jail `[traefik-auth]` posé par `proxy/install.sh` matche `DownstreamStatus` ∈ {401, 403, 429, 5xx} sur **tous** les paths, avec `maxretry = 10` / `findtime = 5m`.
Or `git clone`, `git fetch` et `git push` en HTTPS sur un dépôt privé font systématiquement un aller-retour **401 avant d'envoyer les credentials** : le client tape l'URL sans auth, reçoit un `401 WWW-Authenticate`, puis rejoue la requête avec les identifiants.
Conséquence : 10 opérations git en 5 minutes (boucle de fetch, runner bavard, IDE qui poll) suffisent à faire bannir une IP légitime sur les ports 80/443 pendant 1h. L'usage étant exclusivement HTTPS ici, ce n'est pas un risque théorique.
## Correctif
Ajouter un `ignoreregex` au filtre `/etc/fail2ban/filter.d/traefik.conf` pour exclure les 401 du protocole Git smart HTTP :
```ini
ignoreregex = ^.*"RequestPath":"[^"]*/(info/refs|git-upload-pack|git-receive-pack)[^"]*".*"DownstreamStatus":401
```
Les 401 sur toute autre route (API, UI, registry) restent couverts.
## Fichier touché
- `proxy/install.sh` — bloc d'écriture de `/etc/fail2ban/filter.d/traefik.conf`
## Points d'attention
- Le filtre est écrit via un heredoc **quoté** (`<< 'EOF'`) : pas d'expansion, la regex passe telle quelle.
- L'écriture du filtre est aujourd'hui inconditionnelle à chaque run — l'idempotence est donc déjà acquise ici, le rejeu du script réapplique la version corrigée.
- Le `sudo systemctl restart fail2ban` qui suit est déjà en place.
## Critères d'acceptation
- [ ] `fail2ban-regex /var/log/traefik/access.log /etc/fail2ban/filter.d/traefik.conf` montre les 401 git en `ignored` et non en `matched`
- [ ] Un 401 sur `/user/login` ou `/api/v1/...` reste `matched`
- [ ] `fail2ban-client status traefik-auth` démarre sans erreur de parsing
- [ ] Une série de 15 `git fetch` consécutifs ne déclenche plus de ban
## Indépendance
Aucune dépendance. **Mergeable immédiatement**, avant tout le reste du milestone — c'est un correctif de production autonome.
Damien
added this to the gitea-lxc-migration milestone 2026-07-30 15:42:43 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Contexte
Le jail
[traefik-auth]posé parproxy/install.shmatcheDownstreamStatus∈ {401, 403, 429, 5xx} sur tous les paths, avecmaxretry = 10/findtime = 5m.Or
git clone,git fetchetgit pushen HTTPS sur un dépôt privé font systématiquement un aller-retour 401 avant d'envoyer les credentials : le client tape l'URL sans auth, reçoit un401 WWW-Authenticate, puis rejoue la requête avec les identifiants.Conséquence : 10 opérations git en 5 minutes (boucle de fetch, runner bavard, IDE qui poll) suffisent à faire bannir une IP légitime sur les ports 80/443 pendant 1h. L'usage étant exclusivement HTTPS ici, ce n'est pas un risque théorique.
Correctif
Ajouter un
ignoreregexau filtre/etc/fail2ban/filter.d/traefik.confpour exclure les 401 du protocole Git smart HTTP :Les 401 sur toute autre route (API, UI, registry) restent couverts.
Fichier touché
proxy/install.sh— bloc d'écriture de/etc/fail2ban/filter.d/traefik.confPoints d'attention
<< 'EOF') : pas d'expansion, la regex passe telle quelle.sudo systemctl restart fail2banqui suit est déjà en place.Critères d'acceptation
fail2ban-regex /var/log/traefik/access.log /etc/fail2ban/filter.d/traefik.confmontre les 401 git enignoredet non enmatched/user/loginou/api/v1/...restematchedfail2ban-client status traefik-authdémarre sans erreur de parsinggit fetchconsécutifs ne déclenche plus de banIndépendance
Aucune dépendance. Mergeable immédiatement, avant tout le reste du milestone — c'est un correctif de production autonome.