PRINCIPES:

Soit les 2 machines:

  1. WORK: la machine de travail qui contient les ressources dont je veux garder des copies,
  2. BACKUP la machine sur laquelle je veux centraliser les sauvegarde et garder un historique de plusieurs jours.

Je vais utiliser rsync pour réaliser les sauvegardes en l'utilisant comme client sur WORK et comme serveur sur BACKUP. Pour que la transmission des données soit cryptée, je vais utiliser par ailleurs ssh comme client sur WORK et comme serveur sur BACKUP. L'intêret étant d'avoir la possiblité de connecter WORK1, WORK2, etc... sur un seul serveur dédié à la sauvegarde.

RSYNC:

Installation:

root@work: ~# emerge rsync

Je fais de même sur BACKUP

Côté BACKUP

Rsync va fonctionner en démon. Il me faut d'abord le configurer via le fichier /etc/rsync.conf:

#Fichier de configuration de rsync
uid = root
gid = root
log file = /var/log/rsync.log

[work]
    path = /home/sauvegardes/work
    comment = Sauvegardes de la machine work
    list = yes
    read only = no

#éventuellement, si on a plusieurs machines à sauvegarder
#[work2]
#    path = /home/sauvegardes/work2
#   comment = Sauvegardes de la machine work2
#    list = yes
#    read only = no

Ainsi on a définit un "module" de sauvegarde appelé "work".

Ensuite, démarrage du démon rsync:

root@backup:~# rsync --daemon

Côté WORK

Sur work, je crée un script sauvegarde.sh, qui sera chargé de la sauvegarde, démarrable via une tâche cron. Petits détail des options utilisées pour rsync:

  1. -a : je veux garder les propriétaires des fichiers
  2. --backup: on active le mode backup de rsync, précisé par l'option:
  3. --backup-dir= DIR :répertoire de sauvegarde de la précédente version des fichiers modifiés ou effacés (à partir du répertoire définit dans le "module" du rsync.conf du serveur.
  4. --delete: on efface les fichiers puisqu'ils sont sauvegardés dans le backup-dir
  5. --force
  6. --ignore-errors
  7. -e ssh: on veux une transmission crypté, voir plus loin

Histoire de garder plusieurs versions de sauvegarde, je définis une variable $JOUR, au format "yyyy-mm-dd" pour pouvoir changer de répertoire de backup tous les jours (sauvegarde incrémentale quotidienne). De même, je définis le répertoire de la version courante de la sauvegarde à 'current'.

ce qui nous donne:

#!/bin/sh

 # Script de sauvegarde incrementale du repertoire /original sur la machine serveur
Rep_source=/home/myUser/files

serveur_Url=root@backup.domaine.tld
serveur_Current=current
serveur_rsync_module=work

 # Variable representant le jour de la sauvegarde
 JOUR=`date +%Y-%m-%d`

 # On lance le script rsync de transfert des fichiers
 /usr/bin/rsync -v -e ssh --force --ignore-errors --delete --backup --backup-dir=/$JOUR -av $Rep_source $serveur_Url::$serveur_rsync_module/$serveur_Current/

SSH:

Installation:

Je commence par installer ssh, si ce n'est déjà fais, sur WORK:

root@work: ~# emerge ssh

Je fais de même sur BACKUP

Authentification par clé

Histoire de ne pas avoir à saisir de mot de passe pour chaque connexion de rsync (ce qui diminue sensiblement l'intêret de l'automatisation de cette tâche ;-)), je vais définir une clé SSH sur WORK qui permettra à BACKUP de reconnaîre WORK de façon certaine.

sur WORK: création de la pair de clés publique/privée avec ssh-keygen de type rsa2. Comme on a installé un serveur ssh sur BACKUP, je l'utilise pour expédier la clé publique sur BACKUP grâce à ssh-copy, fourni avec l'installation de ssh.

root@work:~# ssh-keygen -t rsa -b 1024

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
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:
1a:97:d4:41:01:d0:1c:5f:94:4a:0b:9d:57:7b:5e:28 root@work

root@work:~# ssh-copy-id -i ~/.ssh/id_dsa.pub root@backup.domaine.tld

Restriction du pouvoir alloué à la clé de WORK:

De façon à ne pas donner un accès en root sur BACKUP à toue personne ayant les droit root sur WORK, je vais restreindre les actions acceptables via la connection ssh authentifié grâce à cette clé. Tout cela se joue sur BACKUP, dans le fichier /root/.ssh/authorized_keys. Il faut éditer ce fichier "nano -w ~/.ssh/autorized_keys", et rechercher la suite de caracteres commençant par ssh-dss et se terminant par root@backup. A noter: le root@backup correspond à l'utilisateur et au nom de machine de WORK, utilisé lors de l'installation de WORK, et pas forcement son URL, en particulier en cas d'utilisation d'un dyndns. Je rajoute avant le "ssh-dss" les restrictions suivantes:

nano -w ~/.ssh/autorized_keys

from="work.domaine.tld",command="/root/rsync_work" ssh-dss AAAAB3Nza
C1kc3MAAAEBAKYJenaYvMG3nHwWxKwlWLjHb77CT2hXwmC8Ap+fG8wjlaY/9t4uA+2qx9JNorgdrWKhH
SKHokFFlWRj+qk3q+lGHS+hsXuvta44W0yD0y0sW62wrEVegz+JVmntxeYc0nDz5tVGfZe6ydlgomzj1
bhfdpYe+BAwop8L+EMqKLS4iSacNjoPlHsmqHMnbibn3tBqJEq2QJjEPaiYj1iP5IaCuYBhuTKQGa+oy
H3mXEif5CKdsIKBj46B0tCy0/GC7oWcUN92QdLrUyTeRJZsTWsxKpRbMliD2pBh4oyX/aXEf8+HZBrO5
vQjDBCfTFQA+35Xrd3eTVEjkGkncI0SAeUAAAAVAMZSASmQ9Pi38mdm6oiVXD55Kk2rAAABAE/bA402V
uCsOLg9YS0NKxugT+o4UuIjyl6b2/cMmBVWO39lWAjcsKK/zEdJbrOdt/sKsxIK1/ZIvtl92DLlMhci5
c4tBjCODey4yjLhApjWgvX9D5OPp89qhah4zu509uNX7uH58Zw/+m6ZOLHN28mV5KLUl7FTL2KZ583Kr
cWkUA0Id4ptUa9CAkcqn/gWkHMptgVwaZKlqZ+QtEa0V2IwUDWS097p3SlLvozw46+ucWxwTJttCHLzU
mNN7w1cIv0w/OHh5IGh+wWjV9pbO0VT3/r2jxkzqksKOYAb5CYzSNRyEwp+NIKrY+aJz7myu4Unn9de4
cYsuXoAB6FQ5I8AAAEBAJSmDndXJCm7G66qdu3ElsLT0Jlz/es9F27r+xrg5pZ5GjfBCRvHNo2DF4YW9
MKdUQiv+ILMY8OISduTeu32nyA7dwx7z5M8b+DtasRAa1U03EfpvRQps6ovu79mbt1OE8LS9ql8trx8q
yIpYmJxmzIdBQ+kzkY+9ZlaXsaU0Ssuda7xPrX4405CbnKcpvM6q6okMP86Ejjn75Cfzhv65hJkCjbiF
7FZxosCRIuYbhEEKu2Z9Dgh+ZbsZ+9FETZVzKBs4fySA6dIw6zmGINd+KY6umMWyJNej2Sia70fu3XLH
j2yBgN5cy8arlZ80q1Mcy763RjYGkR/FkLJ611HWIA= root@work

Il ne reste plus qu'à définir les commandes autorisées pour root@work sur BACKUP:

root@backup: ~/# nano -w /root/rsync_work

#!/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

root@backup: ~/# chmod +x rsync_clinique

Article réalisé d'après:

  1. - le très bon post de Lalitte . J'ai simplement inversé la place du serveur rsync, plutôt du côté de la bibliothèque de sauvegarde.
  2. - le post troy sur le paramétrage de ssh pour un rsync sans saisie de mot de passe.