EvoBackup ========= EvoBackup est un ensemble de scripts permettant de mettre en place un service de backups gérant les sauvegardes de plusieurs machines. Le principe est d'installer des prisons/chroot contenant un service SSH écoutant sur un port différent dans chaque prison. Chaque serveur peut ainsi envoyer ses données quotidiennement en "root" via rsync dans sa propre prison. Les prisons sont ensuite copiées en dehors des prisons (donc inacccessible par les serveurs) de façon incrémentale grâce à des "hard links". On peut ainsi conserver des dizaines de sauvegardes de chaque serveur de façon sécurisé et avec peu de place. ************************** Serveur 1 ------SSH/rsync -------> * tcp/2222 Serveur * * de * Serveur 2 ------SSH/rsync -------> * tcp/2223 Sauvegardes * ************************** Cette technique de sauvegarde s'appuient sur des technologies standards. Elle est utilisée depuis plusieurs années par Evolix pour sauvegarder chaque jour des centaines de serveurs représentant plusieurs To de données incrémentales. Serveur de sauvegardes ---------------------- Le serveur de sauvegardes doit être sous Debian Squeeze (testé sous Etch/Lenny/Squeeze, les instructions sont pour Squeeze). Avec les logiciels suivants : - OpenSSH - Rsync (le daemon rsync n'est pas nécessaire) - Le paquet makedev (plus nécessaire depuis Squeeze) - Commande "mail" (ou un équivalent) capable d'envoyer des messages à l'extérieur. Un volume d'une taille importante doit être monté sur /backup Pour des raisons de sécurité on pourra chiffre ce volume. On créera ensuite les répertoires suivants : - /backup/jails : pour les prisons - /backup/incs : pour les copies incrémentales des prisons - /etc/evobackup : config des fréquences des copies incrémentales Pour la mise en place des backups incrémentaux sur le serveur : - Mettre en place les scripts evobackup-inc.sh et evobackup-rm.sh dans /usr/share/scripts - Mettre les droits d'exécution : chmod u+x /usr/share/scripts/evobackup-{inc,rm}.sh - Activer le crontab suivant (ajuster éventuellement les heures) : 29 10 * * * pkill evobackup-rm.sh && echo "Kill evobackup-rm.sh done" | mail -s "[warn] EvoBackup - purge incs interrupted" root 30 10 * * * /usr/share/scripts/evobackup-inc.sh && /usr/share/scripts/evobackup-rm.sh Note : si l'on ne veut *jamais* supprimer les backups incrémentaux, on pourra se contenter de ne jamais lancer le script evobackup-rm.sh Si le noyau du serveur est patché avec GRSEC, on évitera pas mal de warnings en positionnant les paramètres Sysctl suivants : # sysctl kernel.grsecurity.chroot_deny_chmod=0 # sysctl kernel.grsecurity.chroot_deny_mknod=0 Note : plus nécessaire avec un noyau récent a priori Serveurs à sauvegarder ---------------------- On peut sauvegarder différents systèmes : Linux, BSD, Windows, MacOSX. L'un des seuls prérequis est d'avoir rsync. Installation d'une sauvegarde ----------------------------- Côté serveur de sauvegardes ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1) On récupère les sources via http://git.evolix.org/git/evolinux/evobackup.git - Exporter la variable $JAIL avec le nom d'hôte saisit dans la grille : # export JAIL= - Se placer dans le bon répertoire (attention, ne pas déplacer le script car il a besoin du répertoire etc/ !) puis exécuter : # bash chroot-ssh.sh /backup/jails/$JAIL Note : Ignorer une éventuelle erreur avec ld-linux-x86-64.so.2 (32bits) ou ld-linux.so.2 (64bits) - Editer le fichier /backup/jails/$JAIL/etc/ssh/sshd_config et remplacer le port SSH utilisé par le prochain disponible (ou garder celui assigné si c'est la première prison). Ajouter également la restriction d'IP si possible via "AllowUsers" : AllowUsers root@IP root@::ffff:IP - Ajouter la clé publique du client à sauvegarder dans /backup/jails/$JAIL/root/.ssh/authorized_keys - Puis corrigez les droits SSH : # chmod -R 600 /backup/jails/$JAIL/root/.ssh/ # chown -R root:root /backup/jails/$JAIL/root/.ssh/ 2) Gestion du lancement des prisons en modifiant le fichier de démarrage /etc/init.d/evobackup (on remplacera $JAIL par sa vraie valeur). - Ajouter à start) : mount -t proc proc-chroot /backup/jails/$JAIL/proc/ mount -t devtmpfs udev /backup/jails/$JAIL/dev/ chroot /backup/jails/$JAIL /usr/sbin/sshd > /dev/null - Ajouter à stop) : umount /backup/jails/$JAIL/proc/ umount /backup/jails/$JAIL/dev/ kill -9 `chroot /backup/jails/$JAIL cat /var/run/sshd.pid` - Ajouter à reload|force-reload) : kill -HUP `chroot /backup/jails/$JAIL cat /var/run/sshd.pid` - Ajouter à restart) : kill -9 `chroot /backup/jails/$JAIL cat /var/run/sshd.pid` chroot /backup/jails/$JAIL /usr/sbin/sshd > /dev/null 3) On lance la prison : # mount -t proc proc-chroot /backup/jails/$JAIL/proc/ # mount -t devtmpfs udev /backup/jails/$JAIL/dev/ # chroot /backup/jails/$JAIL /usr/sbin/sshd > /dev/null Pour vérifier que tout est OK : # /etc/init.d/evobackup reload 4) Gestion des sauvegardes incrémentales Pour activer les gestions des copies incrémentales, créer le fichier /etc/evobackup/$JAIL contenant par exemple : +%Y-%m-%d.-0day +%Y-%m-%d.-1day +%Y-%m-%d.-2day +%Y-%m-%d.-3day +%Y-%m-01.-0month +%Y-%m-01.-1month Quelques explications sur cette syntaxe particulière. Par exemple, la ligne ci-dessous signifie "garder la sauvegarde du jour actuel" (à toujours mettre sur la première ligne a priori) : +%Y-%m-%d.-0day La ligne ci-dessous signifie "garder la sauvegarde d'hier" : +%Y-%m-%d.-1day La ligne ci-dessous signifie "garder la sauvegarde du 1er jour du mois courant" : +%Y-%m-01.-0month Toujours le même principe, on peut garder celle du 1er jours du mois dernier : +%Y-%m-01.-1month Et bien sûr, on peut garder aussi le 15e jour (pour avoir une sauvegarde toutes les 15 jours, le 1er janvier de chaque année, etc.) Attention, la création de ce fichier est *obligatoire* pour activer les copies incrémentales. Si l'on veut garder des copies advitam aeternam sans jamais les supprimer, on se contentera de ne pas lancer le script evobackup-rm.sh. Côté serveur à sauvegarder ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1) Générez une clé SSH pour l'utilisateur "root" : # ssh-keygen (Ne pas la protéger par une passphrase, sauf si un humain va l'entrer manuellement à chaque sauvegarde effectuée) (La clé générée doit être de type RSA et non DSA !!) 2) Envoyez "/root/.ssh/id_rsa.pub" au responsable du serveur de sauvegarde, ainsi que l'adresse IP de la machine. 3) Ajoutez à la crontab le fichier "zzz_evobackup" Pour une sauvegarde quotidienne (conseillé), utilisez le répertoire "/etc/cron.daily/" (sous Linux) ou "/etc/periodic/daily" (sous FreeBSD). Il faut éventuellement ajuster le script en supprimant les lignes "--exclude" si l'on ne souhaite pas exclure les fichiers/répertoires de cette ligne et ajouter/supprimer les lignes en dessous pour sauvegarder les bons répertoires. ($rep désigne les données systèmes). Vous pouvez donc choisir librement ce que vous désirez sauvegarder. 4) Une fois que tout en place au niveau du serveur de sauvegardes, on doit initier la première connexion : # ssh -p Mise-à-jour du serveur de sauvegardes ------------------------------------- En cas d'une mise-à-jour d'un paquet lié à SSH ou rsync côté serveur de sauvegardes, on mettra à jour ainsi : # sh chroot-ssh.sh updateall # /etc/init.d/evobackup restart