CVS anonyme via SSH

Lundi 10 janvier 2005 20:07 - Code

Inspiré d'un article en anglais, parfaitement intitulé Anonymous CVS access via ssh, comment se passer totalement du pserver de CVS tout en gardant la possibilité de récupérer le contenu d'un repository sans s'identifier.

La première étape consiste à permettre un accès en lecture-seule. Par défaut cvs va vouloir utiliser le répertoire CVSROOT pour y enregistrer des fichiers de locks, mauvaise idée car ce répertoire n'est pas accessible en lecture à tout le monde. Comment lui dire d'utiliser un autre répertoire ? En modifiant le CVSROOT/config et en y ajoutant une directive LockDir=/path/ok/, le /path/ok/ étant un où tout un chacun peut écrire, genre /tmp/.

Disgression gforge ici, il réécrit les fichiers CVSROOT/config toutes les heures, ça se corrige dans le script cvs_dump_update.pl.

Il est possible de tester ici l'accès en lecture-seule, ça devrait râler sur le fichier history de CVS dans lequel il aurait bien aimé écrire qu'un checkout venait d'avoir lieu, ça ne gêne pas, l'alternative est de permettre à quiconque d'écrire dans ce fichier.

Ensuite, il suffit de créer un nouvel utilisateur (cvs, anoncvs, toto, peu importe son nom), dans une configuration GForge c'est un peu spécial, chroot, LDAP, tout ça. Pas de mot de passe pour cet utilisateur, l'authentification se fait par clé. Création de celle-ci pour l'utilisateur, ssh-keygen -t dsa et copie de l'id_dsa.pub généré en authorized_keys. Quiconque aura donc la clé privée pourra se logger en tant que cet utilisateur.

Mais il ne faudrait pas que cet utilisateur puisse faire n'importe quoi, il faut restreindre ce qu'il peut faire. Ça se fait en précédant le ssh-dss du fichier authorized_keys par l'information suivante (qui doit figurer sur la même ligne):

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

Voilà, reste à distribuer cette clé privée et à dire à cvs de l'utiliser. J'ai pour cela récupérer le script anoncvs de l'article mentionné au début; grosso modo il s'agit d'exécuter ssh en spécifiant qu'il trouvera la clé privée dans ledit script, c'est astucieux, reste le problème que ssh insiste pour que les permissions sur la clé privée soit 0600, le script changera donc ses permissions avant de se les restaurer en 0755.

L'utilisateur peut alors définir son CVS_RSH comme étant le script et vogue la galère:

export CVS_RSH=/path/to/sshanoncvs
export CVSROOT=:ext:anocvs@labs.libre-entreprise.org:/cvsroot/lasso
cvs checkout lasso

Comme ssh s'exécute avec les permissions de cet utilisateur, dans un chroot où celui-ci ne peut écrire quasi nulle part, la méthode ne présente pas de risque (hors éventuels bugs dans cvs).

Pour le labs, voilà le script anoncvs.

Resterait à modifier les pages décrivant l'accès CVS aux projets du labs mais c'est soit fait salement en perdant l'internationalisation, soit fait proprement mais pas ce soir.