Rsync
Un article de Bricosoft.
rsync permet de créer un miroir d'un dossier sur un serveur distant. Les données en transit entre les serveurs sont minimes puisque seul la différence est envoyée.
Avec rsync, tous les fichiers dans dossier_source/ vont se trouver dans dossier_destination/ :
rsync dossier_source/ dossier_destination/
Entre deux machines, rsync sera employé à travers une transmission sécurisée (tunnel SSH par échange de clé) :
rsync -e ssh utilisateur_distant@serveur.principal.fr:dossier_source/ dossier_destination/local/
Attention : vous devez nettoyer vos *bashrc et *profile de tout affichage car cela entraine une erreur "protocol mismatch". Pour vérifier, la sortie de cette commande ne doit rien afficher :
rsync -e ssh utilisateur_distant@serveur.principal.fr echo 2>/dev/null
Par exemple, copie d'un dossier provenant du serveur principal depuis le serveur miroir.
toto@miroir$ rsync -avz --delete -e ssh toto@serveur.principal.fr:/home/toto/www/ /home/toto/backup/
- -a : mode archive équivalent à -rlptgoD (récursif, préserve les liens symboliques, les permissions, la date et heure, le propriétaire/groupe, ...)
- -v : mode verbeux (rajoutez autant de 'v' pour plus d'informations)
- -z : compression
- --delete : efface sur la destination les fichiers n'existant plus sur la source
- -e ssh : le shell distant
Sommaire |
[modifier] Connexion miroir -> principal sans mot-de-passe
Après cette phase de test vous allez donner la clé publique du serveur miroir sur le serveur principal pour une connexion sécurisé sans demande interactive de mot-de-passe, gênante en cas d'automatisation.
[modifier] Clé numérique SSH
Générez la paire de clé privée-publique sans saisir de passphrase.
toto@miroir$ mkdir /root/rsync toto@miroir$ ssh-keygen -t dsa -b 2048 Generating public/private dsa key pair. Enter file in which to save the key (/home/toto/.ssh/id_dsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/toto/.ssh/id_dsa. Your public key has been saved in /home/toto/.ssh/id_dsa.pub. The key fingerprint is: 62:71:0c:bf:01:d7:b4:41:76:04:84:1f:4a:aa:f4:26 toto@miroir
Copiez ensuite la *clé publique* sur le serveur principal : toto@miroir$ scp ~/.ssh/id_dsa.pub toto@serveur.principal.fr:/home/toto/
Maintenant sur le serveur principal, ajoutez la clé fraichement copiée dans la liste de clés ssh du compte utilisateur. Si ~/.ssh/authorized_keys n'existe pas créez les.
toto@serveur.principal.fr:~$ cd ~/.ssh/ toto@serveur.principal.fr:~/.ssh$ cat ~/id_dsa.pub >> authorized_keys toto@serveur.principal.fr:~/.ssh$ chmod go-w $HOME $HOME/.ssh $HOME/.ssh/authorized_keys
[modifier] Automatisation périodique
Crontab est la commande pour inscrire le lancement périodique de la sauvegarde.
Récupérez le chemin absolu vers rsync :
toto@miroir$ which rsync /usr/local/bin/rsync
Ajoutez la ligne de commande dans la crontab pour un lancement tous les deux jours à 4h00 par exemple :
toto@miroir$ crontab -e 0 4 */2 * * /usr/local/bin/rsync -avvvz --delete -e ssh toto@serveur.principal.fr:/home/toto/public_html/ /home/toto/sauvegarde/public_html/ >/dev/null 2>&1
Voilà, votre sauvegarde automatique est en place.
[modifier] Sécurité : restreindre qu'à la commande rsync
L'échange de la clé publique permet à l'utilisateur sur le miroir de lancer (en plus de rsync) n'importe quelle autre commande. C'est une faille de sécurité potentielle en cas de compromission du miroir, il nous faut donc n'autoriser que la commande rsync.
Sur le serveur principal, modifiez le fichier stockant les clés publiques pour indiquer la commande rsync :
toto@serveur.principal.fr:~$ vim ~/.ssh/authorized_keys
Ajoutez juste au début de la ligne de la clé publique du miroir :
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-dss AB3NzaCc3M.....1cQ== toto@miroir
Refaites un essai rsync depuis le miroir pour contrôler qu'il n'y ait pas d'erreur :
toto@miroir$ rsync -avz --delete -e ssh toto@serveur.principal.fr:/home/toto/www/ /home/toto/backup/
Revenez sur le serveur principal et rajoutez alors cette ligne de commande juste au début de la ligne de la clé publique du miroir.
toto@serveur.principal.fr:~$ vim ~/.ssh/authorized_keys command="toto@miroir$ rsync -avz --delete -e ssh toto@serveur.principal.fr:/home/toto/www/ /home/toto/backup/" no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-dss AB3NzaCc3M.....1cQ== toto@miroir
[modifier] Dépannage
- La version de rsync entre les deux machines doit être identique
rsync --version
- Verifiez lors d'un simple login ssh que rien ne s'affiche comme fortune, un prompt trop verbeux ($PS1), etc
[modifier] Exemples
[modifier] Alias dans ~/.bashrc
alias sync-serveur-vers-ici='rsync -arvz --delete-after -e ssh utilisateur_distant@serveur.principal.fr:dossier_source/ ~/dossier_local_cible/' alias sync-ici-vers-serveur='rsync -arvz --delete-after -e ssh ~/dossier_local_source/ utilisateur_distant@serveur.principal.fr:dossier_cible/'
Avec un port différent de 22 mettez ssh entre simple quotes avec le parametre du port (ici 666) :
alias sync-serveur-vers-ici="rsync -arvz --delete-after -e 'ssh -p 666' utilisateur_distant@serveur.principal.fr:dossier_source/ ~/dossier_local_cible/" alias sync-ici-vers-serveur="rsync -arvz --delete-after -e 'ssh -p 666' ~/dossier_local_source/ utilisateur_distant@serveur.principal.fr:dossier_cible/"
