Comment exporter des dépôts avec le git-daemon
Git est probablement le logiciel de contrôle de version le plus utilisé au monde. Gratuit et open source, il a été créé par Linus Torvalds, et c’est la base des services fournis par les plateformes web comme Github et Gitlab. Dans un article précédent, nous avons abordé les bases du flux de travail git,
Dans ce tutoriel, nous voyons comment exporter rapidement un dépôt git à l’aide du git-daemon.
Dans ce tutoriel, vous allez apprendre :
- Comment installer le démon git
- Comment exporter un dépôt via le démon git
- Comment créer un service systemd pour le démon git
- Comment autoriser les utilisateurs non authentifiés à envoyer des modifications à un dépôt
Configuration logicielle requise et conventions utilisées
Présentation du git-daemon
Comme indiqué dans la documentation officielle, le démon Git est un démon très simple qui par défaut écoute sur le port TCP 9418. Le démon ne fournit ni authentification ni chiffrement, car il est conçu comme un moyen rapide de distribuer le code source suivi dans des dépôts git dans des environnements approuvés, tels que les réseaux locaux (LAN). Par défaut, le service n’autorise que les actions de clonage et de pull, et interdit les actions push anonymes, mais ce comportement peut être facilement modifié (dangereux !).
Installation
L’installation du git-daemon est un processus assez facile, puisqu’il est inclus d’une manière ou d’une autre dans les dépôts de toutes les distributions Linux les plus utilisées. Sur Debian et Archlinux, par exemple, tout ce que nous avons à faire est d’installer le paquet git standard, puisque git-daemon y est inclus (il est installé sous le nom de /usr/lib/git-core/git-daemon). Pour installer le paquet git sur Debian, nous exécutons la commande suivante :
sudo apt install gitPour effectuer l’installation sur Arch, à la place, nous pouvons utiliser pacman :
sudo pacman -Sy gitSur Fedora, les choses sont un peu différentes, puisque le paquet git-daemon doit être installé explicitement, puisque les fonctionnalités du démon ne sont pas incluses dans le paquet git de base. Nous lançons notre émulateur de terminal préféré et lançons la commande suivante :
sudo dnf install git-daemonAutoriser le trafic à travers le pare-feu
Comme nous l’avons déjà mentionné, le démon git écoute sur le port TCP 9418, donc si nous utilisons un pare-feu sur notre système, nous devons autoriser le trafic à travers celui-ci. La façon de procéder dépend du logiciel de gestion de pare-feu que nous utilisons.
Typiquement, sur Debian et les distributions basées sur Debian, ufw (Uncomplicated Firewall) est le choix par défaut. Voici la commande que nous devons exécuter pour autoriser le trafic à travers le port susmentionné :
sudo ufw allow 9418/tcpLa commande ci-dessus autorisera le trafic via le port à partir de n’importe quelle adresse IP. Dans le cas où nous voulons autoriser l’accès au port à partir d’une adresse ou d’un réseau spécifique uniquement, nous devons utiliser une syntaxe légèrement différente. Supposons que nous voulions autoriser le trafic uniquement à partir du 192.168.0.0/24, nous exécuterions :
sudo ufw allow from 192.168.0.0/24 to any proto tcp port 9418Sur Fedora, et plus généralement sur la famille de distribution Red Hat, en revanche, firewalld est utilisé comme gestionnaire de pare-feu par défaut. Nous avons parlé de ce logiciel dans un précédent tutoriel, alors jetez-y un coup d’œil si vous voulez en saisir les bases. Ici, nous nous contenterons de rappeler le fait que ce gestionnaire de pare-feu crée une série de zones, qui peuvent être configurées différemment. Nous pouvons modifier les paramètres de firewalld via l’utilitaire firewall-cmd. Pour autoriser en permanence le trafic via le port utilisé par le git-daemon sur la zone par défaut, nous pouvons exécuter la commande suivante :
sudo firewall-cmd --permanent --add-port 9418/tcpPour restreindre l’accès au port à partir d’une source spécifique, nous devons utiliser ce que l’on appelle une règle enrichie. Voici la commande que nous exécuterions :
sudo firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" port port="9418" protocol="tcp" source address="192.168.0.0/24" accept'Avec la règle enrichie ci-dessus, nous autorisons l’accès au port 9418/tcp à partir du sous-réseau 192.168.0.0/24. Dans les deux cas, puisque nous avons utilisé l’option --permanent, pour que la règle devienne effective, nous devons recharger la configuration du pare-feu :
sudo firewall-cmd --reloadSans autres spécifications, une règle est ajoutée à la zone par défaut. Pour ajouter la règle à une zone spécifique, nous devons ajouter l’option --zone aux commandes ci-dessus, et fournir le nom de la zone en argument. À titre d’exemple, pour ajouter explicitement la première règle dont nous avons parlé dans cet exemple à la zone « publique », nous exécuterions :
sudo firewall-cmd --permanent --zone=public --add-port 9418/tcpDémarrage du démon git
Une fois que nous avons installé les paquets nécessaires et que nous avons configuré le pare-feu de manière appropriée, nous pouvons voir comment utiliser et démarrer le démon git. Tout d’abord, nous voulons créer un dépôt à exporter. Pour les besoins de cet exemple, nous allons créer le répertoire /srv/git et y initialiser un dépôt vide appelé « linuxconfig » :
sudo mkdir /srv/git && sudo git init --bare linuxconfig.gitComment pouvons-nous exporter le dépôt à l’aide du git-daemon ? Pour permettre l’exportation d’un dépôt à l’aide du démon git, nous devons créer le fichier git-daemon-export-ok à l’intérieur de celui-ci :
sudo touch /srv/git/linuxconfig.git/git-daemon-export-okUne fois le fichier en place, nous pouvons lancer le git-daemon :
git daemon --base-path=/srv/gitDans la commande ci-dessus, nous avons invoqué git avec la commande « daemon », et utilisé l’option --base-path, pourquoi ? Lorsque cette option est utilisée, toutes les requêtes sont remappées par rapport au chemin donné en argument, qui est utilisé comme répertoire de base. Dans notre cas, pour cloner le dépôt « linuxconfig », nous pouvons simplement spécifier l’IP de la machine sur laquelle le démon git s’exécute, et le nom du dépôt au lieu de son chemin d’accès complet. En supposant que l’adresse IP du serveur soit 192.168.0.35, nous exécuterions :
git clone git://192.168.0.35/linuxconfigSi nous voulons exporter tous les dépôts à l’intérieur d’un certain répertoire, au lieu de créer un git-daemon-export-ok à l’intérieur de chacun d’eux, nous pouvons utiliser l’option --export-all lors de l’appel du démon :
git daemon --base-path=/srv/git --export-allDémarrage automatique du démon
Dans l’exemple précédent, nous avons démarré le démon git de manière interactive, à partir de la ligne de commande. Si nous voulons que le démon soit démarré automatiquement au démarrage, nous devons créer un fichier de service systemd dédié.
En fait, sur Fedora, une telle configuration est incluse dans le paquet git-daemon, donc pour démarrer le démon et l’activer au démarrage, nous pouvons simplement exécuter :
sudo systemctl enable --now git.socketVous pouvez remarquer que dans ce cas, le service est activé à l’aide d’une unité systemd « .socket » : les services mis en œuvre de cette manière peuvent être activés « à la demande », c’est-à-dire lorsqu’une demande est effectivement reçue. L’unité git.socket est associée au fichier git@.service, qui démarre le service. Sur Fedora, le démon s’exécute en tant qu’utilisateur personne.
Sur Debian et Arch, nous devons créer le fichier de service à partir de zéro. C’est en fait une tâche assez facile. Cependant, avant de commencer à créer le fichier, nous devons décider de l’utilisateur sous lequel le service doit s’exécuter. Sur les systèmes Linux, l’utilisateur sans personne est l’opposé absolu de l’utilisateur root, dans le sens où il est censé avoir le moins de privilèges possible, et ne possède aucun fichier ou répertoire. Traditionnellement, certains services étaient configurés pour s’exécuter en tant qu’utilisateur, donc avec ses privilèges, mais il est maintenant courant de créer un utilisateur spécifique pour chaque démon qui n’a pas besoin de s’exécuter en tant que root. À titre d’exemple, dans ce cas, nous allons créer un utilisateur « git » dédié avec la commande useradd :
sudo useradd --home-dir /srv/git --system --shell /usr/sbin/nologin gitAvec la commande ci-dessus, nous avons créé l’utilisateur « git » et défini le répertoire /srv/git comme sa maison. C’est le répertoire que nous utiliserons comme base pour servir les dépôts git avec le git-daemon. Avec l’option --system, nous avons spécifié que l’utilisateur doit être créé en tant qu’utilisateur système, et avec --shell, nous avons attribué le shell utilisateur. Dans ce cas, comme nous ne voulons pas que l’utilisateur puisse se connecter au système pour des raisons de sécurité, nous avons passé /usr/sbin/nologin comme argument à l’option.
Avec notre éditeur de texte préféré, nous pouvons maintenant créer le fichier /etc/systemd/git.service (le nom est arbitraire, vous pouvez l’appeler comme vous le souhaitez). Voici son contenu :
[Unit]
Description=Start Git Daemon
[Service]
User=git
Group=git
ExecStart=/usr/bin/git daemon --reuseaddr --base-path=/srv/git --export-all --informative-errors --verbose
StandardError=journal
[Install]
WantedBy=multi-user.targetIci, vous pouvez remarquer que nous démarrons le démon git avec quelques options que nous n’utilisions pas auparavant : --reuseaddr, --informative-errors et --verbose. Le premier permet au serveur de redémarrer sans attendre que les anciennes connexions expirent, le second fait en sorte que les erreurs informatives soient signalées aux clients, et enfin, le troisième, est utilisé pour faire en sorte que le serveur enregistre les détails des connexions et des fichiers demandés.
Une fois le fichier de service en place, nous pouvons activer le service au démarrage et le démarrer immédiatement avec une seule commande :
sudo systemctl enable --now git.serviceLes dépôts git dans le répertoire /srv/git doivent maintenant être servis à l’aide du démon git. Notez que puisque le répertoire est utilisé comme chemin de base, il devrait exister, sinon le service échouera.
Autorisation des utilisateurs non authentifiés à envoyer des modifications au référentiel
Comme nous l’avons dit, par défaut, git-daemon ne fonctionne qu’en mode « lecture », dans le sens où il permet aux utilisateurs non authentifiés de cloner un dépôt et de l’extraire de celui-ci. Si nous sommes conscients des risques, et que nous sommes vraiment sûrs de vouloir autoriser les utilisateurs non authentifiés à valider et à pousser les modifications vers le dépôt partagé via le démon git, nous devons activer le git receive-pack. Nous pouvons le faire via l’option --enable pour lancer le démon :
git daemon --reuseaddr --base-path=/srv/git --export-all --informative-errors --verbose --enable=receive-packRéflexions finales
Dans ce tutoriel, nous avons appris à utiliser le démon git pour distribuer des dépôts git. Nous avons vu comment l’installer, comment configurer le pare-feu pour permettre au trafic de passer par le port utilisé par le service, comment créer un fichier de service systemd pour démarrer le démon automatiquement au démarrage, et enfin, comment permettre aux utilisateurs non authentifiés de pousser les modifications vers un dépôt accessible avec cette méthode. Le démon git ne doit être utilisé que dans des environnements de confiance absolue, car il ne fournit ni authentification ni chiffrement.
