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.
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 :
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
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
) :
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 .
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 :
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
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
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.
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-20240209 :
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.