guest@6admin.io:~$

SSH: rsync sécurisé

Rsync est l’outil de sauvegarde incrémentale: il compare source et destination, ne transfère que les deltas et préserve les permissions, les timestamps, les symlinks. Over SSH, il traverse le réseau sur le canal chiffré, sans démon rsync côté serveur (SSH fait le transport).

Le rsync de base

rsync -avz /data/ user@serveur:/backup/data/
  • -a : archive mode (récursif, préserve perms, times, symlinks, devices)
  • -v : verbose (liste les fichiers transférés)
  • -z : compression (gzip avant transfert)

Le / après /data/ signifie: “le contenu de /data”, pas “/data lui-même”. Sans le /, rsync crée /backup/data/data/. C’est l’erreur rsync la plus commune.

Les options qui changent tout

rsync -avz --delete --exclude='.svn' --exclude='*.tmp' \
      --link-dest=/backup/data.prev \
      /data/ user@serveur:/backup/data.new/
  • --delete : supprime les fichiers qui n’existent plus à la source (sans ça, les fichiers supprimés restent en backup, le backup grossit indéfiniment)
  • --exclude : exclut des patterns (SVN, temporaires, cache)
  • --link-dest : hardlink vers la backup précédente (les fichiers inchangés sont des hardlinks vers la version précédente: le backup incrémental ne coûte que les fichiers modifiés)

Avec --link-dest, chaque backup incrémental est un snapshot complet, mais l’espace disque utilisé est seulement les fichiers modifiés depuis la dernière. C’est le pattern Time Machine, avant Time Machine.

La clé SSH restreinte

Le serveur de backup a une clé SSH restreinte (article précédent: authorized_keys) qui autorise SEULEMENT rsync. La machine de backup ne peut pas se connecter en shell, pas exécuter d’autres commandes, pas faire autre chose que rsync:

command="rsync --server --daemon .",no-port-forwarding,no-pty ssh-rsa AAAA...

Le script de backup

#!/bin/bash
DATE=$(date +%Y%m%d)
PREV=/backup/data.$(ls -1t /backup/ | grep data. | head -2 | tail -1 | sed 's/\.//')
DEST=/backup/data.$DATE
rsync -avz --delete --link-dest=$PREV /data/ root@backup:$DEST/

Ce script crée un backup daté, hardlinké vers le précédent. Exécuté en cron (tous les jours à 2h), il produit une série de snapshots avec l’espace de la backup incrémentale.