Skip to content. Skip to navigation

la mont pagnotte familly

Personal tools
You are here: Home HowTo's Open Source Divers Backup avec rsync over ssh
Document Actions

Backup avec rsync over ssh

by julien last modified 2007-12-26 11:36

Sauvegardez vos fichiers sur un serveur de backup linux avec une solution light basé sur rsync et ssh.

Index
  1. ajout d une nouvelle machine a backup
  2. ajout d un nouveau repertoire ou fichier au backup
  3. preparer un dump mysql de toutes les bases en vue de backup

Synopsis

De même cette doc est essentiellement orientée Debian/Ubuntu mais fonctionnera certainement avec quelques variantes sur un autre GNU.

Tout d'abord on commence par installer ce qu'il faut sur le serveur mais notez bien qu'il faut egalement le faire sur les machines distantes:

  sudo apt-get install rsync
sudo apt-get install ssh

On a installé tout ce qu'il faut, maintenant le plus ardu reste à faire sur le serveur de backup, aussi il faut faire attention un minimum a ne pas foirer son copy/paste. On va commencer par activer rsync. Pour cela, editons le fichier /etc/default/rsync et remplacez:

 RSYNC_ENABLE=false
par
RSYNC_ENABLE=true

On redemarre le bigniou:

 /etc/init.d/rsync restart

à partir de la, un rsync à la main devrait fonctionner, vous demander votre mot de passe et envoyer les données tranquilement.Pour cela tapez:

 rsync -avz -e ssh root@machine distante:/chemin_sur_la_machine_distante/repertoire /chemin_du_backup/

Pour toonux, on va creer un repertoire /backup. Pour cela faites:

 mkdir /backup

Si tout s'est bien passé, on continue sinon c'est que vous n'avez pas suivi une des regles precedentes et inutile de continuer.

Ensuite, on va generer la clé rsync pour root. pour cela identifiez vous en root ou fait un sudo:

 sudo -s
ssh-keygen -t dsa

Appuyez sur entrée sans rentrer de passphrase, cela ne nous sert pas à grand chose pour nos manipulations. Vous obtenez qqchose comme ca:

 root@daria:/root/.ssh# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
a6:d6:1a:81:80:0b:1f:b7:f2:5e:35:lalala root@daria

A ce stade, nous avons la cle privée et publique (dans le repertoire indiquée; /root/.ssh/ ) qui vont nous permettre de nous identifier sans passer par le prompt password mais ce n'est pas fini car il reste des petits trous de secu qu'il va falloir eradiquer pour ne pas se faire pirater les fesses.

Tout d'abord assurez vous que personne d'autre ne peut lire parmi les utilisateurs les cles en question. Pour cela, faites:

 chmod 600 /root/.ssh/id_*

Maintenant que les clés sont protegées, nous allons les deplacer la ou il faut.

Commencons par ecrire à la fin /root/.ssh/authorized_keys la cle publique (avec le .pub a la fin comme publique ;). Je vous laisse faire cette manipulation, si vous n'y arrivez pas, vous n'avez pas le level qu'il faut…faut pas deconner non plus.

Nous pouvons faire un test directement apres avec un petit ssh.

 root@daria:/root/.ssh# ssh root@machine_distante
Last login: Mon Dec 24 12:04:43 2007 from ahahaha
Hey Admin'Z wana drink some stuff on my Linux vodka 2.6.21.1dedibox-r7 kernel ?

Bon tout marche bien, on ne nous demande pas de password donc on continue avec le test Rsync:

 root@daria:/root/.ssh# rsync -avz -e ssh root@machine_distante:/home/julien/ /backup/
receiving file list ... done
./
.bash_history
.lesshst
.viminfo
test_backup
sent 168 bytes received 2585 bytes 5506.00 bytes/sec
total size is 17470 speedup is 6.35

Le Rsync passe lui aussi sans demander de mot de passe, donc on continue. (On remarque au passage que les transferts entre dedibox bourre pas mal)

Verifions au passage que le backup a bien transfere ce qu'il faut.

 root@daria:/backup# ls -la
total 48
drwxr-xr-x 3 julien julien 4096 2007-12-24 12:04 .
drwxr-xr-x 23 root root 4096 2007-12-20 07:33 ..
-rw------- 1 julien julien 5870 2007-12-22 18:18 .bash_history
-rw-r--r-- 1 julien julien 220 2007-09-29 13:02 .bash_logout
-rw-r--r-- 1 julien julien 414 2007-09-29 13:02 .bash_profile
-rw-r--r-- 1 julien julien 2227 2007-09-29 13:02 .bashrc
-rw------- 1 root root 35 2007-12-24 12:03 .lesshst
-rw-r--r-- 1 julien julien 0 2007-12-20 00:26 tset_backp
-rw------- 1 root root 8704 2007-12-24 12:04 .viminfo

Tout est la, nous sommes pret pour passer à la suite.

Maintenant que tout est au point, avant de partir dans la configuration des Backups, nous allons securiser au maximum.

Pour cela, nous allons tout dabord creer un fichier qui fera les tests adequats à la connexion (ce script est a mettre sur la machine distante). Nous mettons ce script dans /root/validate_rsync par defaut pour nous y retrouver.

Ce script doit comprendre les lignes suivantes:

 #!/bin/sh
case "$SSH_ORIGINAL_COMMAND" in
*\&*)
echo "Rejected"
;;
*\(*)
echo "Rejected"
;;
*\{*)
echo "Rejected"
;;
*\;*)
echo "Rejected"
;;
*\<*)
echo "Rejected"
;;
*\`*)
echo "Rejected"
;;
rsync\ --server*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Rejected"
;;
esac

Donnons lui les droits qui vont bien:

 chmod 700 /root/validate-rsync

Ensuite, il faut l'ajouter pour qu'il s'execute à la connexion. Pour cela, editez à nouveau le fichier /root/.ssh/authorized_keys pour y ajouter en debut de ligne (correspondant a la ligne ajouté precedemment):

  command="/root/validate_rsync", ssh-rsa AAAAB3NzaC1yc2EAAAA.........

Verifiez que cela fonctionne toujours:

 root@daria:/backup# rsync -avz -e ssh root@machine_distante:/home/julien/ /backup/test/
receiving file list ... done
created directory /backup/test
./
.viminfo
test_backup
sent 180 bytes received 5063 bytes 10486.00 bytes/sec
total size is 17461 speedup is 3.33

c'est ok alors on continue.

Rentrons à présent dans la configuration des repertoires que l'on souhaite sauvegarder. Nous allons commencer par nous organiser histoire qu'on s'y retrouves meme apres quelques passages de divers amis admin à droite à gauche.

Créez le repertoire:

 mkdir /etc/scripts

Puis créez le premier script de backup pour la premiere machine à backup qui va ressembler à ca:

 #!/bin/sh
RSYNC=/usr/bin/rsync
SSH=/usr/bin/ssh
RUSER=root
RHOST=l'ip de la machine distante
RPATH=/repertoire que l on veut sauvegarder
LPATH=/repertoire ou on veut sauvegarder
$RSYNC -az -e "$SSH" $RUSER@$RHOST:$RPATH $LPATH

cela donne en pratique (exemple pour sauvegarder vodka)

 #!/bin/sh
DATE=`date +%d%m%Y`
RSYNC=/usr/bin/rsync
SSH=/usr/bin/ssh
RUSER=root
RHOST=lalalala
RPATH1=/etc
LPATH1=/backup/vodka/$DATE/etc
RPATH2=/var/www
LPATH2=/backup/vodka/$DATE/var/www
mkdir -p $LPATH1
mkdir -p $LPATH2
$RSYNC -az -e "$SSH" $RUSER@$RHOST:$RPATH1 $LPATH1
$RSYNC -az -e "$SSH" $RUSER@$RHOST:$RPATH2 $LPATH2

Puis donnez lui les droits qu'il faut:

 chmod 700 /etc/scripts/mon_script_de_backup_pour_la_machine_distante

Testez le script:

 ./etc/scripts/mon_script_de_backup_pour_la_machine_distante

Si tout va bien, on passe a l'automatisation avec cron:

Pour commencer, on va utiliser un unique fichier pour que ce ne soit pas le bordel dans la crontab et cela va permettre egalement de faire nos sauvegardes les unes apres les autres. commencons donc par editer notre fichier qui va contenir tout nos backups que l'on appelera backup_auto.sh:

 vim /etc/scripts/backup_auto.sh

et on y ajoute notre premier backup:

 sh /etc/script/mon_script_de_backup_pour_la_machine_distante

si il y en a d'autres, on les ajoutera simplement sur la ligne suivante et ainsi de suite.

Pour finir on ajoute ce fichier en execution automatique dans la crontab de root:

 sudo crontab -e

on y mets:

 # m h  dom mon dow   command
0 1 * * 0 /etc/scripts/backup_auto.sh

cela corresponds à l execution prevu le dimanche a 1h du matin.

Voila c'est fini, vous pouvez maintenant avoir un sommeil tranquile, vos données ne seront pas perdus sauf si vous perdez le serveur de backup mais les raids sont la pour ca…

ajout d une nouvelle machine a backup

Commencons par ecrire à la fin /root/.ssh/authorized_keys la cle publique sur la machine distante. Par soucis de facilité, j'ai mis le contenu de la clef dans /backup/cle_a_exporter/key.txt sur le serveur de backup.

Puis, ajoutez sur la machine distante dans /root/validate-rsync le script suivant:

 #!/bin/sh
case "$SSH_ORIGINAL_COMMAND" in
*\&*)
echo "Rejected"
;;
*\(*)
echo "Rejected"
;;
*\{*)
echo "Rejected"
;;
*\;*)
echo "Rejected"
;;
*\<*)
echo "Rejected"
;;
*\`*)
echo "Rejected"
;;
rsync\ --server*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Rejected"
;;
esac

Rendez vous dans /etc/scripts et ajoutez un script sh que vous nommez nom_de_la_machine (ou de votre chien, chat, sexe tant que vous savez le retrouver)

 #!/bin/sh
DATE=`date +%d%m%Y`
RSYNC=/usr/bin/rsync
SSH=/usr/bin/ssh
RUSER=root
RHOST=ip de ma machine
RPATH1=repertoire1
LPATH1=/backup/nom_de_ma_machine/$DATE/repertoire1
mkdir -p $LPATH1
$RSYNC -azv -e "$SSH" $RUSER@$RHOST:$RPATH1 $LPATH1

Ensuite, vous lui donnez les droits adequats pour qu'il puisse s'executer:

 chmod 700 nom_du_script.sh

Enfin vous l'ajouter au script qui n'est autre que backup_auto.sh, il vous reste juste à ajouter a la ligne le nom de votre script comme les autres.

ajout d un nouveau repertoire ou fichier au backup

Pour ajouter un nouveau repertoire ou un fichier à backuper sur une machine qui est deja prise en charge par le script de backup, il faut aller dans /etc/scripts puis trouver le fichier correspondant à la machine. Une fois localisé ajoutez y ceci:

  RPATH153=le chemin du fichier ou du repertoire sur la machine distante que vous souhaitez sauvegardez
LPATH153=/backup/la_machine_ciblé/"$DATE"/le repertoire qui vous plait
mkdir -p $LPATH153
$RSYNC -azv -e "$SSH" $RUSER@$RHOST:$RPATH153 $LPATH153

Notez bien que 153 a ete choisi en imaginant qu il y ait 152 backup avant sur cette machine, il faut donc le remplacer par un numero qui convient à votre cas.

preparer un dump mysql de toutes les bases en vue de backup

On veut souvent sauvegarder la totalité de ses bases en cas de crash et il vaut mieux dans ces cas la avoir un backup bien frais, pret à la reinsertion. La encore, on va viser une solution simple qui consiste à dumper les bases sql avant que le serveur de backup ne fasse son travail un peu plus tard.

Commencons donc par ecrire un petit script que l'on nommera dump_mysql.sh dans /etc/scripts:

 mkdir /etc/scripts
vim dump_mysql.sh

et collez y ceci:

 mkdir -p /backup/mysql/
cd /backup/mysql
DATE=`date +%d%m%Y`
mysqldump -u root -p**mot_de passe root mysql** -Qqcf --all-databases > /backup/mysql/"$DATE".sql
tar -cvzf "$DATE".sql.tar.gz "$DATE".sql
rm -rf /backup/mysql/"$DATE".sql

Verifiez au passage que le serveur est à l'heure, sinon mettez le avec ntpdate.

Ensuite on rend le script executable par root

 chmod 700 /etc/scripts/dump_mysql.sh

Puis on met le script dans la crontab pour lancer le dump automatiquement avant le ramassage du backup avec un crontab -e.

 30 0 * * 0 /etc/scripts/dump_mysql.sh

ici tout les dimanches a minuit 30

et voila, lors du backup le fichier avec la date du jour sera à ramasser dans /backup/mysql

Categories :
howto
OPENSOURCE
LINUX
del.icio.us tags: howto OPENSOURCE LINUX
Technorati tags: howto OPENSOURCE LINUX
Navigation
Log in


Forgot your password?
New user?
nuage de tags
RSS feed of this listing Les derniers animés
RSS feed of this listing Tutoriaux PS2
Les derniers liens