~~
L'autre jour mon disque dur a presque rendu l'âme, clapclapclap et gros plantage...
Du coup, je compte me mettre en place des sauvegardes par rsync sur un kimsufi qui traîne...
Rsync permet la synchronisation de données, c'est à dire qu'il va faire en sorte qu'un dossier locale d'une machine soit identique à un dossier distant.
Le premier rsync va donc envoyer toutes les données, les rsync suivants vont ajouter, modifier ou supprimer les fichiers qui ont été touchés sur le dossier local.
Il faut donc mettre en place des sauvegardes rotatives du dossier sur le serveur de synchronisation notamment pour la récupération de fichiers supprimés.
Cette page vous explique comment ceci en place ; notamment dans le cas où le poste client, comme moi, a une IP dynamique.
Pour les paranos, il est possible de chiffrer les fichiers avec rsyncrypto.
Ceci ne sera pas abordé dans cette page.
Installer Rsync
Partie serveur, cela ne devrait pas poser de problèmes, il y a pas mal de tuto sur le net.
Rsync : Partie Serveur
On créé un user sans mot de passe et avec lequel on ne peux pas se conencter :
Dans mon cas les rsync iront dans le dossier /homeadduser sauvegarde --shell /bin/false --disabled-password
En effet, sur les machines OVH, cette partition a la taille maximale.
Ensuite créez les dossiers qui accueilleront les rsync.
Tous les dossiers doivent contenir un dossier current.
Par exemple dans mon cas, je souhaite sauvegarder mon home.
Je vais créer un dossier /home/sauvegarde/home/current
Par exemple, si vous souhaitez sauvegarder des mp3, vous pouvez créez un dossier /home/sauvegarde/mp3/current
Mettre bien les droits pour l'utilisateur sauvegarde
On intalle rsync :chown -R sauvegarde.sauvegarde /home/sauvegarde/
chmod 770 -R /home/sauvegarde/
Editez le fichier /etc/default/rsync afin que le daemon se lance,aptitude install rsync
mettre RSYNC_ENABLE à true
Lancez le daemon :
Vérifiez que ce dernier est bien lancé et écoute les ports :/etc/init.d/rsync start
Starting rsync daemon: rsync!
Créez le fichier /etc/rsyncd.confnetstat -lpn|grep -i rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 5308/rsync
tcp6 0 0 :::873 :::* LISTEN 5308/rsync
Voici un exemple, on configue à l'intérieur les dossiers des rsync.
host allow= permet de filtrer l'accès par IP.
Dans le cas d'une ip dynamique mettre *
Créez ensuite un fichier /etc/rsyncd.secretsmax connections = 2
log file = /var/log/rsync.log
timeout = 300
auth users = sauvegarde
secrets file = /etc/rsyncd.secrets
uid = sauvegarde
gid = sauvegarde
[home]
path = /home/sauvegarde/home/current/
hosts allow=* <== si vous avez une ip fixe pour le client, la mettre à la place de *
hosts deny = *
comment = svg ppbo
read only = false
Ce dernier va contenir le mot de passe de l'utilisateur sauvegarde.
Le contenu est de la forme :
On met les droits restrictifs sur les fichiers :sauvegarde:monmotdepasse
chown root.root /etc/rsyncd.*
chmod 700 /etc/rsyncd.*
Un peu de sécurité...
Voila le daemon rsync est installé et tourne sur le serveur.
il faut filtrer l'accès, par exemple, ne serait que dans le cas d'une vulnérabilité 0-day.
Si les clients ont des IPs fixes, c'est très simple, il suffit de créer des règles iptables en autorisant ces Ips.
Les policies étants certainement en DROP.
Dans mon cas, ce n'est pas possible, comme je l'ai déjà dit, puisque le client a une ip dynamique./sbin/iptables -A INPUT -s {IP} -p tcp -m state --state NEW,ESTABLISHED,RELATED --dport 873 -j ACCEPT
/sbin/iptables -A OUTPUT -d {IP} -p tcp -m state --state ESTABLISHED,RELATED --sport 873 -j ACCEPT
J'ai donc opté dans l'utilisation de knockd.
knockd permet de créer des règles iptables à la volée après une séquence de requêtes prédéfinie sur des ports.
Un peu comme Gandalf pour ouvrir la porte de la mine de la Moria (ou pour les plus anciens, alibaba et sa grotte :p).
A faire sur le poste client et serveur, installer knockd :
Sur le serveur, knockd doit tourner en daemon, pour cela, on modifie /etc/default/knockd :aptitude install knockd
ensuite on modifie /etc/knockd.conf en créant sa séquence, exemple :START_KNOCKD=1
(attention, bien mettre -I INPUT pour l'open)
Ensuite, on créé une règle iptables qui DROP les connexions sur le service rsync (ou on met les policies en DROP).[options]
UseSyslog
[openrsync]
sequence = 7000,8000,9000
seq_timeout = 5
command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 873 -j ACCEPT
tcpflags = syn
[closerync]
sequence = 9000,8000,7000
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 873 -j ACCEPT
tcpflags = syn
Celle-ci peux être ajouté dans /etc/rc.local ou incorporé dans un script firewall maison.
Lorsque l'on fait toctoc depuis le client, une règle Iptables se créée avant le DROP, ce qui permet d'être prise en compte :/sbin/iptables -A INPUT -p tcp --dport 873 -j DROP
puis le client lance la séquence pour supprimer la règle.iptables -L -n -v
Chain INPUT (policy ACCEPT 468 packets, 71601 bytes)
pkts bytes target prot opt in out source destination
1131 1627K ACCEPT tcp -- * * 83.114.53.75 0.0.0.0/0 tcp dpt:873
32 1920 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:873
Autre élément à prendre en compte, rsync écoute en IPv6, vous pouvez interdire les connexions ipv6 entièrement comme ceci :
ou désactiver l'IPv6 sur la machine - exemple : https://wiki.debian.org/DebianIPv6ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT DROP
Rsync : Partie Cliente
Nous avons terminé avec la partie serveur, passons au client.
GNU/Linux
Installez Rsync :
Voici un script qui permet de synchroniser un dossier.aptitude install rsync
Vous pouvez partir de ce dernier et le modifier comme vous le souhaitez.
Ce script va vous envoyer un mail pour chaque rsync et en cas d'erreur. Réglez l'adresse email.
Vous pouvez limiter la vitesse afin de prévenir la bande passante (variable limit)
Dans export mettre le mot de passe que vous avez configuré pour l'utilisateur sauvegarde.
Enfin et surtout, réglez les ports knock pour l'ouverture et fermeture.
Le fichier comportant un mot de passe bien mettre des des accès restrictif sur le chemin en question avec un chmod 770#!/bin/bash
mail="[email protected]"
host="host.kimsufi.com"
limit=100
export RSYNC_PASSWORD=asfDK5ds_*
knock -v $host port1 port2 port3
if [ -f /tmp/rsync.pid ] ;
then
echo "une synchronisation est deja en cours... annulation"
echo "Une synchronisation est deja en cours... la synchro a ete annulee" > /tmp/rsync_mail.txt
mail -s "synchro `hostname` - Probleme!" $mail < /tmp/rsync_mail.txt
rm -f /tmp/rsync_mail.txt
else
touch /tmp/rsync.pid
echo `date` -- Synchro de `hostname` sur $home >> /tmp/rsync_mail.txt
echo >> /tmp/rsync_mail.txt
echo >> /tmp/rsync_mail.txt
echo "Synchro home" >> /tmp/rsync_mail.txt
echo >> /tmp/rsync_mail.txt
echo >> /tmp/rsync_mail.txt
rsync -vraz --stats --bwlimit=$limit --delete /home/malekalmorte sauvegarde@$host::home >> /tmp/rsync_mail.txt 2>> /tmp/rsync_mail.txt
if [[ `cat /tmp/rsync_mail.txt` =~ "rsync error" ]]
then
mail -s "synchro `hostname` - ERREUR" $mail < /tmp/rsync_mail.txt
else
mail -s "synchro `hostname`" $mail < /tmp/rsync_mail.txt
fi
rm -f /tmp/rsync_mail.txt
rm -f /tmp/rsync.pid
fi
knock -v $host port1 port2 port3
ensuite il suffit de lancer le script, le rsync devrait se faire.
Il faudra ajouter une entrée cron pour lancer le script selon la fréquence des sauvegardes que vous souhaitez mettre en place.
Voir Tutorial Cron : https://www.malekal.com/2010/11/12/tuto ... -gnulinux/
Windows
Cette partie sera survolée car je n'ai pas trouvé malheureusement de client sympa que l'on puisse lancer en ligne de commandes pour knock.
Deux projets pour des clients sous Windows :
http://sourceforge.net/projects/knockknock/
http://sourceforge.net/projects/winknocks/
En ce qui concerne la synchronisation, vous pouvez utiliser DeltaCopy ou Syncrify
Cela fonctionne bien.
Avec DeltaCopy, on lance le client et on configure celui-ci, n'oubliez pas de mettre les infos de connexion, mot de passe dans l'onglet Authentification.

Un lancement manuelle, ça fonctionne.

Il ne reste plus qu'à créer une tâche planifiée qui va lancer le rsync à au moment souhaité.

Sauvegarde rotative
Enfin vous devez mettre en place des sauvegardes rotatives, cette partie est très vivement conseillé comme expliqué dans l'introduction.
Vous pouvez vous inspirer de ce script.
Ce dernier va énumérer les dossiers current du fichier rsyncd.conf
Il va faire une copie des dossiers current afin d'obtenir une sauvegarde statique à un instant T.
Par exemple, si vous souhaitez donc avoir un retour sur les 3 dernires jours, vous devez mettre en place un cron qui va lancer le script une fois par jour.
#!/bin/bash
DIR=($(ls -d $1/*))
KEEP=2
DATE=`date --date=yesterday "+%Y-%m-%d"`
MAIL="[email protected]"
REP="/home/sauvegarde/"
echo "$DATE - Lancement des sauvegardes incrementales....." > /tmp/rapport_incr.txt
echo >> /tmp/rapport_incr.txt
echo >> /tmp/rapport_incr.txt
echo "################### SAVE-ROTATE DU $DATE ####################"
echo
for line in `cat /etc/rsyncd.conf |grep current| grep -Eo "\/.*current"|sed 's/current//g'`
do
# arborescence :
# /home/backup/xxxx/xx-xx-xx
# /home/backup/xxxx/current
# calcule date du jour
echo -n "Sauvegarde du dossier "
echo -n `echo $line | cut -d / -f 5`
echo " en cours..."
echo "Sauvegarde incrementale de $line vers $line/$DATE" >> /tmp/rapport_incr.txt
# supprime les vieilles sauvegardes
ls -d $line/2* | sort | head --lines=-$KEEP | xargs rm -rf
# créé le répertoire pour les backups de la veille s'il n'existe pas
if [ -d $DATE ]; then
echo "Erreur: le dossier de sauvegarde existe deja" >> /tmp/rapport_incr.txt
echo
continue
fi
mkdir $line/$DATE >> /tmp/rapport_incr.txt 2>> /tmp/rapport_incr.txt
# copie (hard links) les donné
cp -al $line/current/* $line/$DATE >> /tmp/rapport_incr.txt 2>> /tmp/rapport_incr.txt
echo
echo >> /tmp/rapport_incr.txt
echo >> /tmp/rapport_incr.txt
done
echo "Etat des disques..." >> /tmp/rapport_incr.txt
df -H|grep svgd >> /tmp/rapport_incr.txt
mail -s "Sauvegarde incrementale..." $MAIL < /tmp/rapport_incr.txt
rm -f /tmp/rapport_incr.txt
Conclusion
Voila avec ceci vous devriez ne pas perdre de données

Si vous avez des questions, n'hésitez pas à créer un sujet dans la partie Linux du forum.
Une autre solution de sauvegarde, si vous en avez les moyens est de faire l'acquisition d'un NAS :
Serveur NAS : Utilité et fonctionnement.