The trashiest blog in the World...

Aller au contenu | Aller au menu | Aller à la recherche

mercurial-server sous Fedora

Depuis quelque temps déjà, je souhaitais utiliser SSH plutôt que HTTPS pour effectuer des commits sur mon dépôt Mercurial. Plusieurs solutions sont proposées dans la documentation de Mercurial. J'ai été séduit par les fonctionnalités de mercurial-server et j'ai décidé de l'utiliser.

Le nom mercurial-server est trompeur ; car il ne s'agit en aucun cas d'un serveur. Les accès au compte utilisateur dédié sont simplement gérés par SSH avec un fichier authorized_keys, tandis que des hooks mercurial vérifient ensuite les permissions de l'utilisateur à qui appartient la clé.

Le paquet n'étant pas disponible dans les dépôts Fedora, j'ai donc décidé de le faire, et de le mettre sur mon dépôt personnel (le dépôt « trashy ») dans un premier temps. Dans un second temps, il devrait être proposé (mais pas par moi) pour inclusion aux dépôts officiels.

Le fichier mercurial-server.spec est disponible, ainsi que le fichier SRPM. Vous pouvez, si vous souhaitez utiliser directement mercurial-server, utiliser mon dépôt personnel :

$ su -lc 'yum install --nogpgcheck http://rpms.ulysses.fr/fedora/trashy-release-14.rpm
$ su -lc 'yum --enablerepo=trashy install mercurial-server'

Les RPM de mercurial-server sont disponibles et testés pour Fedora 14, ce sont ceux que j'utilise moi même.

Vous voilà donc parés... Bon, d'accord, on fait quoi maintenant ? On lit la doc, pardi ! :-) La documentation de mercurial-server vous aidera dans les tâches principales de gestion et d'administration de vos dépôts mercurial. Par défaut, les dépôts sont stockés dans /var/lib/mercurial-server/repos/, la configuration dans /etc/mercurial-server/. Un utilisateur dédié, hgserver est créé lors de l'installation du paquet, son dossier home est défini à /var/lib/mercurial-server.

La configuration de mercurial-server peut se faire de deux façons, cumulatives qui plus est :

  • utilisation de l'arborescence dans /etc/mercurial-server/,
  • utilisation d'une arborescence similaire, mais au sein du module hgadmin créé lors de l'installation du paquet.

La documentation officielle indique que si les deux méthodes sont utilisées conjointement, les règles des fichiers de configuration système auront la précédence sur ceux qui se trouvent dans le dépôt mercurial hgadmin. Il est également possible de supprimer complètement les fichiers de configuration du côté du système et n'utiliser que le dépôt hgadmin. Cette technique peut vous permettre de déléguer intégralement la gestion des droits des dépôts à quelqu'un sans pour autant lui donner un accès root sur le serveur (c'est l'une des choses que j'ai trouvées intéressantes ;-) ).

Voyons un peu les différents chemins et fichiers utilisés par mercurial-server qui nous seront utiles par la suite :

  • /etc/mercurial-server : l'ensemble des fichiers de configuration :
    • access.conf : configuration des autorisations d'accès. Par défaut, ce fichier autorise par défaut les utilisateurs 'root' à tout faire, interdit aux autres l'accès au dépôt hgadmin, et enfin autorise l'accès en écriture à tous les autres projets aux 'users'.
    • hgadmin-hgrc : il s'agit du fichier de configuration du dépôt hgadmin, qui déclenche principalement les hooks mercurial (ce sont eux qui mettront à jour le fichier authorized_keys lors d'un commit sur le projet hgadmin),
    • keys : dossier qui contient les clés des différents utilisateurs,
  • /var/lib/mercurial-server : le dossier des données, qui est aussi le répertoire home de l'utilisateur hgserver :
    • repos : les dépôts mercurial eux-mêmes. Après installation, seul le dépôt hgadmin sera présent.

Pensez tout de suite à créer le dossier /var/lib/mercurial-server/.ssh et donnez lui les droits adéquats :

$ su -lc 'su -s /bin/bash hgserver'
$ mkdir .ssh
$ chmod 600 .ssh

En effet, mercurial-server utilise uniquement les possibilités de SSH pour gérer les accès entrants, il récrit donc le fichier .ssh/authorized_keys à chaque commit dans le dépôt hgadmin. Si le dossier .ssh n'existe pas, le programme ne le crée pas actuellement. Il faut que les droits sur le dossier soient corrects pour que l'authentification par clé fonctionne correctement. Normalement, le RPM de mon dépôt applique la règle SELinux adéquate au dossier .ssh ; mais il arrive que cela échoue. Vérifiez le contexte SELinux du dossier :

$ ls -alZ .ssh
drwx------. hgserver hgserver system_u:object_r:ssh_home_t:s0  .

Si le contexte est bien ssh_home_t, tout est correct. Dans le cas contraire, les commandes suivantes - en root - suffiront (référez-vous à l'article SELinux sur la documentation francophone de Fedora pour en savoir plus) :

# semanage fcontext -a -t ssh_home_t '/var/lib/mercurial-server/.ssh(/.*)?'
# restorecon -R -v /var/lib/mercurial-server/.ssh

Étape suivante : déclarer un utilisateur 'root', au sens de mercurial-server, évidemment. Regardons un peu le contenu du fichier access.conf :

init user=root/**
deny repo=hgadmin
write user=users/**

Examinons un peu ces règles pour comprendre ce que nous allons faire, gardons en tête qu'elles sont lues ligne par ligne, et que la première qui match a gagné :

  • init user=root/** : accorde les droits init aux utilisateurs dont les clés se trouvent dans le dossier root et ses sous dossiers. L'accès init permet la création de nouveaux dépôts, et implicitement les droits en écriture.
  • deny repo=hgadmin : interdit l'accès au dépôt hgadmin ; il n'y a donc que les utilisateurs root qui pourront accéder au dépôt hgadmin.
  • write user=users/** : autorise l'accès en écriture dans l'ensemble des dépôts (hors hgadmin, comme nous venons de le voir) pour les utilisateurs dont la clé se trouve dans le dossier users et ses sous-dossiers.

Créez-vous un dossier spécifique en tant que root, dans lequel vous pourrez placer les clés de vos différentes machines (trasher est ici le login, et odysseus le nom de la machine) :

# mkdir keys/root/trasher
# vim keys/root/trasher/odysseus

Vous placerez dans le fichier odysseus la partie publique de votre clé SSH. Ces instructions sont valables pour configurer mercurial-server côté système ou par le dépôt hgadmin. La différence fondamentale, c'est que le commit déclenchera le hook adapté, et donc la mise à jour du fichier authorized_keys. Ce n'est pas le cas côté système (évidemment :) ), il faut donc dans ce cas lancer la commande suivante :

# sudo -u hgserver /usr/share/mercurial-server/refresh-auth

Voilà, votre clé est ajoutée, on va pouvoir l'utiliser ! Sur le poste client où est disponible votre clé, vous devriez être en mesure de cloner le dépôt hgadmin :

$ hg clone ssh://hgserver@{host}/hgadmin

Ce dépôt ne comprend rien d'autre au départ que la configuration qui lui est nécessaire. Vous pourrez ajouter ici des dossiers et fichiers selon le même schéma que dans /etc/mercurial-server/ :-)

Pour autoriser un nouvel utilisateur nommé toto à accéder à un dépôt spécifique (projet) en écriture, il faudra (par exemple) copier sa clé dans le fichier keys/toto ; et ajouter l'entrée write user=toto repo=projet dans le ficheir access.conf. Le commit déclenchera les hooks adaptés, autorisant l'accès.

Une petite note pour finir : si vous souhaitez rendre vos dépôts accessibles en lecture par le web, ça ne pose aucun problème (même les contextes SELinux permettent ça sans modification particulière). En revanche, une telle méthode lit directement les répertoires sur le disque ; rendant possible la récupération du projet hgadmin ! Afin d'éviter que ça ne se produise, les droits sur ce dépôt particulier sont fixés à 600 lors de la création initiale du dépôt par le paquet RPM ; l'utilisateur apache ne pourra ainsi pas le lire ;)

Ces quelques instructions vous auront permis de commencer à utiliser mercurial-server, la documentation officielle vous aidera à comprendre ses mécanismes pour aller plus loin et exploiter au mieux les possibilités de ce programme.