• Serious Devs
  • Home
  • Blog
  • Contact

📅 14/05/2025

DevOps

Forgejo / Podman
Erreur d'accès git

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

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.

L'enquête pas à pas

Observation des logs système

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"

Découverte inquiétante mais instructive

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.

Le véritable problème

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

Recherche de la cause

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.

Plongée dans l'environnement conteneurisé

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.

La solution étape par étape

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.

  1. Créer un fichier de configuration SSH personnalisé

    # /home/forgejo/forgejo-app/ssh/sshd_config.d/ssh-disable-penalties.conf
    LoginGraceTime 0
    PerSourcePenalties no
    
  2. 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
    

Pour aller plus loin

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
© Copyright 2025 - Serious Devs