📅 14/05/2025
En tant qu'amateur de solutions auto-hébergées, j'utilise Forgejo (un fork open source de Gitea mais maintenu par une association Codeberg) pour gérer mes projets personnels. Récemment, j'ai rencontré un problème qui pourrait toucher beaucoup d'utilisateurs.
Le problème est plutôt embêtant, mes commandes git
recevaient régulièrement des erreurs d'accès, même sur mes propres projets :
Please make sure you have the correct access rights and the repository exists.
Ma première approche a été d'examiner les logs système. Pour éviter d'être noyé dans les informations du runner Forgejo, j'ai utilisé cette commande :
journalctl --user -u forgejo-app -n 5000 | grep -v "/api/actions/runner"
Les premiers résultats m'ont d'abord alerté sur autre chose : des tentatives de connexion suspectes.
May 14 09:15:19 ns3035923 forgejo-app[1481318]: Invalid user dcm4chee from 2.2.2.2 port 44708 May 14 09:16:13 ns3035923 forgejo-app[1481318]: Invalid user world from 2.2.2.2 port 40410
En seulement 6 minutes, plusieurs utilisateurs suspects (dcm4chee, world, lp, s3, roo) ont tenté de se connecter - un rappel salutaire que nos serveurs sont constamment ciblés par des attaques automatisées.
En filtrant davantage les logs, j'ai trouvé les messages liés à mes propres tentatives de connexion :
May 14 07:50:57 ns3035923 forgejo-app[908280]: Timeout before authentication for connection from 10.89.0.26
May 14 07:50:58 ns3035923 forgejo-app[908280]: drop connection #0 [...] penalty: exceeded LoginGraceTime
En consultant la documentation SSH, j'ai découvert que le LoginGraceTime
définit le temps maximum autorisé pour qu'un client s'authentifie avant que la connexion ne soit fermée. Par défaut, il est fixé à 120 secondes — un délai qui devrait être amplement suffisant pour une simple commande git
.
L'apparition soudaine de ces erreurs après une mise à jour de Forgejo m'a mis la puce à l'oreille. Et mes recherches m'ont rapidement mené à l'issue #34179 du projet Gitea où d'autres utilisateurs rapportaient le même problème. Le mystère commençait à s'éclaircir : le problème venait du logiciel lui-même.
Ma première tentative de modification directe du fichier /etc/ssh/sshd_config
dans le container s'est soldée par un échec : mes changements disparaissaient au redémarrage.
En creusant dans le code source de Forgejo, j'ai découvert une solution plus élégante : la variable d'environnement SSH_INCLUDE_FILE
.
Cette fonctionnalité permettait exactement ce dont j'avais besoin — injecter une configuration SSH personnalisée sans toucher aux fichiers du container. La solution se dessinait enfin.
Mon infrastructure repose sur Podman avec une configuration Quadlet pour gérer les containers de façon systemd-native. Cette particularité va influencer la mise en place de la solution.
Créer un fichier de configuration SSH personnalisé
# /home/forgejo/forgejo-app/ssh/sshd_config.d/ssh-disable-penalties.conf
LoginGraceTime 0
PerSourcePenalties no
Modifier la configuration du container Il suffit d'ajouter deux lignes dans le fichier Quadlet pour inclure notre configuration :
Environment=SSH_INCLUDE_FILE=/etc/ssh/sshd_config.d/*.conf
Volume=/home/forgejo/forgejo-app/ssh/sshd_config.d/ssh-disable-penalties.conf:/etc/ssh/sshd_config.d/ssh-disable-penalties.conf
Si vous utilisez Forgejo ou Gitea, cette solution devrait résoudre vos problèmes de timeout SSH. Elle fonctionne parfaitement dans un environnement Podman, mais peut être adaptée pour Docker ou d'autres systèmes de containérisation.
Voici le code complet du Quadlet :
[Unit]
Description=Forgejo
Requires=forgejo-db.service
After=forgejo-db.service
[Container]
ContainerName=forgejo-app
Environment=USER_UID=1000
Environment=USER_GID=1000
Environment=FORGEJO__database__DB_TYPE=postgres
Environment=FORGEJO__database__HOST=forgejo-db:5432
Environment=FORGEJO__database__NAME=forgejo
Environment=FORGEJO__database__USER=forgejo
Secret=forgejo-db-password,type=env,target=FORGEJO__database__PASSWD
Environment=SSH_INCLUDE_FILE=/etc/ssh/sshd_config.d/*.conf
Image=codeberg.org/forgejo/forgejo:11
Network=forgejo.network
PublishPort=3000:3000
PublishPort=4422:22
Volume=forgejo-data:/data
Volume=/home/forgejo/forgejo-app/ssh/sshd_config.d/ssh-disable-penalties.conf:/etc/ssh/sshd_config.d/ssh-disable-penalties.conf
[Service]
Restart=always
[Install]
WantedBy=default.target