Lancer un serveur Git

Introduction

Cette section décrit comment mettre en place, administrer et sécuriser un serveur git. Git a de nombreuses options disponibles. Pour la documentation détaillée voir https://git-scm.com/book/en/v2.

Dépendances de Server

Requises

git-2.41.0 et OpenSSH-9.4p1

Paramétrer un serveur Git

Les instructions suivantes installeront un serveur git. Il sera paramétré pour utiliser OpenSSH comme méthode d'accès à distance sécurisée.

La configuration du serveur comporte les étapes suivantes :

1. Mise en place des utilisateurs, des groupes et des permissions

Vous devrez être utilisateur root pour la première partie de la configuration. Créez l'utilisateur et le groupe git et indiquez un hash de mot de passe inutilisable avec les commandes suivantes :

groupadd -g 58 git &&
useradd -c "git Owner" -d /home/git -m -g git -s /usr/bin/git-shell -u 58 git &&
sed -i '/^git:/s/^git:[^:]:/git:NP:/' /etc/shadow

Enregistrer un hash de mot de passe inutilisable (en remplaçant le ! par NP) déverrouille le compte mais empêche de l'utiliser avec un mot de passe. Cela est requis par sshd pour fonctionner correctement. Ensuite, créez certains fichiers et répertoires dans le répertoire personnel de l'utilisateur git qui permettent de donner accès aux dépôts git avec des clés ssh.

install -o git -g git -dm0700 /home/git/.ssh &&
install -o git -g git -m0600 /dev/null /home/git/.ssh/authorized_keys

Pour les développeurs qui doivent accéder au dépôt, ajoutez sa clé publique ssh à /home/git/.ssh/authorized_keys. Commencez par ajouter certaines options pour éviter que les utilisateurs ne puissent utiliser la connexion à git pour rediriger des ports vers d'autres machines que le serveur git peut atteindre.

echo -n "no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty " >> /home/git/.ssh/authorized_keys &&
cat <user-ssh-key> >> /home/git/.ssh/authorized_keys

C'est aussi utile d'indiquer le nom par défaut de la branche initiale d'un nouveau dépôt en modifiant la configuration git. En tant qu'utilisateur root, lancez :

git config --system init.defaultBranch trunk

Enfin, ajoutez l'entrée /usr/bin/git-shell au fichier de configuration /etc/shells. Ce shell a été indiqué dans le profil utilisateur de git et s'assure que seules les actions liées à git peuvent être exécutées :

echo "/usr/bin/git-shell" >> /etc/shells

2. Créer un dépôt git

Le dépôt peut être n'importe où sur le système de fichiers. Il est important que l'utilisateur git puisse lire et écrire à cet emplacement. Nous utilisons /srv/git comme répertoire de base. Créez un nouveau dépôt git avec les commandes suivante (en tant qu'utilisateur root) :

[Note]

Note

Dans les instructions ci-dessous, nous utilisons project1 comme nom de dépôt. Vous devriez nommer votre dépôt en fonction des détails de votre projet.

install -o git -g git -m755 -d /srv/git/project1.git &&
cd /srv/git/project1.git                             &&
git init --bare                                      &&
chown -R git:git .

3. Remplissez le dépôt à partir du système client

[Note]

Note

Toutes les instructions de cette section et de la suivante devraient être lancées sur un système utilisateur, pas sur le système serveur.

Maintenant que le dépôt est créé, il peut être utilisé par les développeurs pour y mettre des fichiers. Une fois les clés ssh des utilisateurs importées dans le fichier authorized_keys de git, on peut interagir avec le dépôt.

Une configuration minimale devrait être disponible sur le système du développeur pour spécifier son nom d'utilisateur et l'adresse de courriel. Créez ce fichier de configuration minimal côté client :

cat > ~/.gitconfig <<EOF
[user]
        name = <users-name>
        email = <users-email-address>
EOF

Sur la machine du développeur, configurez certains fichiers à pousser vers le dépôt comme contenu initial :

[Note]

Note

Le terme gitserver utilisé ci-dessous devrait être le nom d'hôte (ou l'adresse IP) du serveur git.

mkdir myproject
cd myproject
git init --initial-branch=trunk
git remote add origin git@gitserver:/srv/git/project1.git
cat >README <<EOF
This is the README file
EOF
git add README
git commit -m 'Initial creation of README'
git push --set-upstream origin trunk

Le contenu initial est maintenant poussé sur le serveur et est disponible pour les autres utilisateurs. Sur la machine actuelle, l'argument --set-upstream origin trunk n'est maintenant plus requis car le dépôt local est maintenant connecté au dépôt distant. Les poussages suivants peuvent se faire avec

git push

Les autres développeurs peuvent maintenant cloner le dépôt et faire des modifications sur le contenu (tant que leurs clés ssh ont été installées) :

git clone git@gitserver:/srv/git/project1.git
cd project1
vi README
git commit -am 'Fix for README file'
git push
[Note]

Note

C'est une configuration du serveur très basique basée sur l'accès OpenSSH. Tous les développeurs utilisent l'utilisateur git pour effectuer les actions sur le dépôt et les changements commités par les utilisateurs se distinguent par le nom d'utilisateur local (voir ~/.gitconfig) enregistré dans les changements.

L'accès est restreint aux clés publique ajoutées dans le fichier authorized_keys de git et il n'y a pas de possibilité pour l'export / clonage public du dépôt. Pour cela, continuez à l'étape 4 pour configurer le serveur git pour l'accès public en lecture seule.

Dans l'URL utilisée pour cloner le projet, le chemin absolu (ici /srv/git/project1.git) a été spécifié car le dépôt n'est pas dans le répertoire personnel de git mais dans /srv/git. Pour ne pas avoir à exposer la structure de l'installation du serveur, vous pouvez ajouter un lien symbolique dans le répertoire personnel de git pour chaque projet, comme ceci :

ln -svf /srv/git/project1.git /home/git/

Maintenant, le dépôt peut être cloné avec

git clone git@gitserver:project1.git

4. Configurer le serveur

La configuration décrite plus haut rend le dépôt disponible pour les utilisateurs authentifiés (en fournissant la clé ssh publique). Il y a aussi un moyen simple de publier le dépôt pour des utilisateurs non authentifiés — évidemment sans l'accès en écriture.

La combinaison de l'accès via ssh (pour les utilisateurs authentifiés) et l'export des dépôt pour les utilisateurs non authentifiés via le démon est en général suffisant pour un site de développement.

[Note]

Note

Le démon sera atteignable sur le port 9418 par défaut. Assurez-vous que votre pare-feu permet l'accès à ce port.

Pour démarrer le serveur au démarrage, installez le script de démarrage inclus dans le paquet blfs-bootscripts-20230824 :

make install-git-daemon

Pour permettre à git d'exporter un dépôt, un fichier nommé git-daemon-export-ok est requis dans chaque répertoire de dépôt sur le serveur. Le fichier n'a pas besoin de contenu, son existence suffit à activer et son absence à désactiver l'export du dépôt.

touch /srv/git/project1.git/git-daemon-export-ok

Le script pour démarrer le démon git utiliser des valeurs par défaut en interne. Le plus important est le chemin vers le dépôt qui est mis à /srv/git. Dans le cas où vous avez créé le dépôt dans un autre répertoire, vous devrez le dire au script de démarrage. Cela se fait en créant un fichier de configuration nommé /etc/sysconfig/git-daemon. Ce fichier de configuration sera importé s'il existe, ce qui veut dire qu'il est facultatif. Le fichier peut ressembler à :

# Début de /etc/sysconfig/git-daemon

# Spécifie l'emplacement du dépôt git
GIT_BASE_DIR="/srv/git/"

# Répertoires ajoutés à la liste blanche
DFT_REPO_DIR="$GIT_BASE_DIR"

# Ajoute des options supplémentaires qui seront ajoutées à la commande
# 'git daemon' exécutée dans le script de démarrage
GIT_DAEMON_OPTS=""

# Fin de /etc/sysconfig/git-daemon

Il n'y a que trois options à indiquer dans le fichier de configuration :

  • GIT_BASE_DIR=<dirname>

    Spécifiez l'emplacement des dépôts git. Les chemins relatifs utilisés pour accéder au démon seront traduits par rapport à ce répertoire.

  • DFT_REPO_DIR=<dirname>

    Ce répertoire est ajouté à la liste blanche des répertoires autorisés. Cette variable peut contenir plusieurs noms de répertoires mais elle est habituellement égale à GIT_BASE_DIR.

  • GIT_DAEMON_OPTS=<options>

    Au cas où vous ayez besoin d'options spéciales pour la commande git daemon, vous pouvez les spécifier dans ce paramètre. Un exemple peut être pour ajuster le numéro de port sur lequel le démon écoute. Dans ce cas, ajoutez --port=<port number> à cette variable. Pour plus d'information sur les options à indiquer, voyez la sortie de git daemon --help.

Après avoir démarré le démon, les utilisateurs non authentifiés peuvent cloner les dépôts exportés en utilisant

git clone git://gitserver/project1.git

Comme le répertoire de bsae est /srv/git par défaut (ou une valeur personnalisée dans la configuration), git interprète les chemins (/project1.git) relativement au répertoire de base, si bien que c'est le dépôt dans /srv/git/project1.git qui est servi.