Accès CVS anonyme via SSH

NDT : je n'ai pas voulu traduire le terme "repository" pour des raisons de compréhension.

 

A cause de la finalité et des ramifications de sécurité de CVS, les "pserveur" qui l?utilisent m?ont inquiétés, je n?offre donc plus un accès CVS anonyme classique à mes CVS "repositories". Mais vous pouvez y accéder en utilisant un accès anonyme CVS via un tunnel SSH que j?ai conjugué au CVS.

Ce système est d?une utilisation assez simple - aussi facile que l?utilisation d?un "pserveur" je pense. Il faut simplement télécharger ce script perl, en faire un exécutable et l?installer quelque part, disons ~/bin/sshanoncvs. Il faut alors faire pointer la variable d?environnement CVS_RSH sur ce dernier fichier et utiliser CVS comme vous en avez l?habitude. Par exemple, lancez cette commande pour scanner tous les perlmoo :

SSH_AUTH_SOCK= CVS_RSH=~/bin/sshanoncvs cvs -d :ext:cvs@kitenet.net:/home/cvs/repository checkout perlmoo

on peut aussi remplacer les lignes précédentes par les suivant, qui seront placée dans votre ~/.ssh/config:

Host kitenet.net
User = cvs
IdentityFile = ~/.ssh/identity_anoncvs
ForwardAgent = no
ForwardX11 = no
Compression = yes

Et changer votre ~/.ssh/identity_anoncvs en ce fichier, et modifier la variable CVS_RSH=ssh puis scanner de façon habituelle.


Comment cela fonctionne-t-il ?

L?idée de base est d?utiliser la méthode rsh de CVS pour l?accès aux ?repositories?. Mais comme rsh n?est pas sécurisé, on utilise ssh à la place. Sshd peut être configuré de manière à ce que les personnes se connectant à un compte utilisant une clef d?authentification ne sont autorisés qu?à lancer une commande prédéfinie, et ne peuvent utiliser ssh pour effectuer aucune autre commande sur le serveur. Une utilisation similaire de ssh est faite par le ?Debian project's push-mirroring scheme?, qui est expliqué ici.

Pour que ce système fonctionne, chaque personne voulant avoir accès au serveur doit avoir une copie de la clef ssh privée. Une fois que vous avez la clef, vous pouvez faire lancer la commande sur un serveur distant en demandant à ssh d?utiliser la clef comme sa clef d?identification. Voir le script sshanoncvs pour un exemple.

CVS utilise sshanoncvs comme remplacement de rsh ; il faut donc, lors de la demande d?accès à un repository, entrer "CVS serveur" dans ce qu'il vous semble être un shell du serveur distant, et attendre d'être connecté au serveur CVS recherché. A partir de là, tout ce fait du client de façon classique en CVS.

Comment mettre en place un tel serveur ?

Sur le serveur, vous avez besoin d'un utilisateur anonyme, dédié au CVS anonyme. Cet utilisateur ne doit pas être autorisé à entrer (pour cela mettre une * dans /etc/passwd) Il n'a pas besoin non plus d'avoir un shell (mettre /bin/false dans le même fichier).

L'utilisateur a besoin d'avoir une paire de clefs ssh, généré pour la connexion. Après avoir lancé ssh-keygen (qui spécifie un password nul), copier .ssh/identity.pub dans .ssh/authorized_keys et ajouter les lignes suivantes au début du fichier :

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,command="/usr/bin/cvs server"

Le résultat doit ressembler à cela ce qui sont les actuelles clefs autorisées pour ce site. Une fois cela fait, toute personne se connectant en ssh avec la clefs privée va être automatiquement redirigée vers le serveur cvs.

La dernière chose à faire est de créer unscript perl tel que celui que je met à disposition sur ce site. Il vous faut y inclure .ssh/identity. Comme c'est un fichier binaire, j'ai choisi de l'encoder en Base64 dans mon script perl. Vous pouvez reprendre le fichier sshanoncvs et le modifier, juste en insérant la donnée en Base64 que vous pouvez générer avec cette commande :

perl -MMIME::Base64 -00ne 'print encode_base64 $_' .ssh/identity

Mise en place du Repository

Une fois que tout est mis en place, le tour est presque joué, mais il reste un détail à régler. CVS par défaut exige d'avoir des droits d'écriture sur le répertoire de la "repository" avant de pouvoir scanner les fichiers, de façon à pouvoir fermer (lock) les fichiers ouverts. Ce système n'est pas valable pour les accès cvs anonymes, car l'utilisateur que vous avez créé ne peut accéder aux répertoires de "repositoty" (sauf si vous désirez un que l'accès cvs anonyme autorise la lecture et l'écriture). Heureusement, on peut demander à CVS d'écrire ses fichiers fermés dans un autre répertoire. Il faut éditer CVSROOT/config et ajouter "LockDir=/some/dir". Créez alors le répertoire spécifié, et autorisez votre utilisateur anonyme à y écrire(ainsi que n'importe quelle personne qui est capable d'accéder à votre "repository"). Vous aurez aussi besoins de jouer avec les autorisations du fichier d'historique CVS, ou vous devez l'effacer.

Pour retrouver l'original : http://kitenet.net/programs/sshcvs/
Merci Joey pour cet article.