The trashiest blog in the World...

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

Subversion : comment créer un miroir de façon sécurisée ?

Sur un serveur (que nous nommerons s_svn), nous avons un dépôt SVN, nous souhaitons mettre un miroir de ce dépôt sur un second serveur (s_miroir).

Nous verrons comment utiliser la commande svnsync avec SSH pour parvenir à nos fins.

Tout d'abord, un peu de réflexion (ça fait mal, mais on va se forcer :-D). Nous avons, sur chacun des deux serveurs, un utilisateur nommé 'svn'. Depuis s_miroir, l'utilisateur devra avoir un accès SSH sur s_svn, de préférence avec une clé SSH dépourvue de mot de passe, afin de pouvoir automatiser le processus. Il faudra donc penser à restreindre un peu cet accès, nous ne souhaitons pas que l'utilisateur svn de s_miroir ait un accès inconditionnel à s_svn sans mot de passe aucun ;-)

Commençons par mettre en place la clé SSH. Sur s_miroir, créons la clé :

[svn@s_miroir ~]$ ssh-keygen
enerating public/private rsa key pair.
Enter file in which to save the key (/home/svn/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/svn/.ssh/id_rsa.
Your public key has been saved in /home/svn/.ssh/id_rsa.pub.

La clé créée, nous pouvons l'installer sur le serveur qui héberge le dépôt SVN :

[svn@s_miroir ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub svn@s_svn

Pour plus de sécurité, nous allons restreindre l'accès sur s_svn à la seule commande dont s_miroir ait besoin. La commande en question est svnserve -t, nous allons utiliser les possibilités de SSH pour cela.

[svn@s_svn ~]$ vim ~/.ssh/authorized_keys

Cherchez la ligne qui permet à s_miroir de s'authentifier. Chaque ligne est constituée par défaut de la façon suivante :

type     identifiant_cle     utilisateur

Dans notre cas, nous aurons donc (où {identifiant} est une suite de caractères alphanumériques imbuvable) :

ssh-rsa {identifiant} svn@s_miroir

Pour restreindre à la seule commande qui nous intéresse, il suffit d'ajouter command="svnserve -t" au début de la ligne, ce qui donne donc :

command="svnserve -t" ssh-rsa {identifiant} svn@s_miroir

Avec cette méthode, svnserve -t sera systématiquement utilisée lors d'une connexion avec la clé de l'utilisateur svn sur s_miroir.

Mettons en place maintenant le miroir en lui même. Il faut tout d'abord créer un dépôt svn :

[svn@s_miroir ~]$ mkdir ~/depot_svn
[svn@s_miroir ~]$ svnadmin create ~/depot_svn

Certaines opération sur les propriétés des révisions seront changées lors de la synchronisation, il peut donc être bienvenu de restreindre ces opérations sur le dépôt. Pour ce faire, créez le fichier hooks/pre-revprop-change dans votre dépôt :

[svn@s_miroir ~]$ vim ~/.depot_svn/hooks/pre-revprop-change

Et insérez-y le contenu suivant :

#!/bin/sh
USER="$3"

if [ "$USER" = "svnsync" ]; then exit 0; fi

echo "Only the svnsync user can change revprops" >&2
exit 1
EOF

Pensez ensuite à rendre ce script exécutable :

[svn@s_miroir ~]$ chmod +x ~/.depot_svn/hooks/pre-revprop-change

On initialise le nouveau dépôt :

[svn@s_miroir ~]$ svnsync init --username svnsync file:///home/svn/depot_svn svn+ssh://s_svn/chemin/vers/le/depot
Copied properties for revision 0

Et enfin on lance la procédure :

[svn@s_miroir ~]$ svnsync sync --username svnsync file:///home/svn/depot_svn
Committed revision 1.
Copied properties for revision 1.
Committed revision 2.
Copied properties for revision 2.
Committed revision 3.
Copied properties for revision 3.
...

Notez l'utilisation de l'utilisateur 'svnsync' dans ces deux commandes. Si vous l'omettez, le script créé plus tôt interdira la modification des propriétés de révision, et la synchronisation ne pourra pas avoir lieu.

Une fois la synchronisation initiale terminée, vous avez un miroir de votre dépôt svn sur s_miroir :-) Pour automatiser la tâche, vous pouvez créer une tâche cron sur la commande de synchronisation (la seconde donc, le 'svnsync init' ne devra plus être exécutée).