Now in Git!

This commit is contained in:
Gregory Colpart 2010-09-09 01:05:15 +02:00
commit f184017820
9 changed files with 591 additions and 0 deletions

10
PLAN-SAUVEGARDES.template Normal file
View file

@ -0,0 +1,10 @@
PLAN DES SAUVEGARDES
====================
PORT JAIL ETAT
-------------------------------------------------------
2222 Serveur 1 (IP) 1
2223 Serveur 2 (IP) 1
2224 Serveur 3 (IP) 0
etc....
.......

202
README Normal file
View file

@ -0,0 +1,202 @@
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 Lenny.
(testé sous Etch et Lenny, les instructions sont pour Lenny).
Avec les logiciels suivants :
- OpenSSH
- Rsync (le daemon rsync n'est pas nécessaire)
- 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 le script evobackup-inc.sh dans /usr/share/scripts
- Activer le crontab suivant (ajuster éventuellement les heures) :
30 10 * * * /usr/share/scripts/evobackup-inc.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
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=<nom d'hote>
- Se placer dans le bon répertoire puis exécuter :
# sh 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/ssh (on remplacera $JAIL par sa
vraie valeur).
- Ajouter à start) :
mount -t proc proc-chroot /backup/jails/$JAIL/proc/
mount -t devpts devpts-chroot /backup/jails/$JAIL/dev/pts/
chroot /backup/jails/$JAIL /usr/sbin/sshd > /dev/null
- Ajouter à stop) :
umount /backup/jails/$JAIL/proc/
umount /backup/jails/$JAIL/dev/pts/
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 devpts devpts-chroot /backup/jails/$JAIL/dev/pts/
# chroot /backup/jails/$JAIL /usr/sbin/sshd > /dev/null
Pour vérifier que tout est OK :
# /etc/init.d/ssh 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.)
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 <port> <serveur de sauvegardes>
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/ssh restart

140
chroot-ssh.sh Normal file
View file

@ -0,0 +1,140 @@
#!/bin/sh
# Gregory Colpart <reg@evolix.fr>
# chroot script for OpenSSH
# $Id: chroot-ssh.sh,v 1.12 2010-07-02 17:40:29 gcolpart Exp $
# tested on Debian Etch and recently on Lenny
# Exec this script for jail creation:
# ./chroot-ssh.sh /backup/jails/myserver
# Note: etc/{sshd_config,group,passwd} files should be present
# For Etch
# Start: chroot /backup/jails/myserver /usr/sbin/sshd > /dev/null
# Reload: kill -HUP `chroot /backup/jails/myserver cat /var/run/sshd.pid`
# Stop: kill -9 `chroot /backup/jails/myserver cat /var/run/sshd.pid`
# Restart: Stop + Start
# For Lenny
# Start :
# chroot /backup/jails/myserver mount -t proc proc-chroot /proc/
# chroot /backup/jails/myserver mount -t devpts devpts-chroot /dev/pts/
# chroot /backup/jails/myserver /usr/sbin/sshd > /dev/null
# Reload: kill -HUP `chroot /backup/jails/myserver cat /var/run/sshd.pid`
# Stop: kill -9 `chroot /backup/jails/myserver cat /var/run/sshd.pid`
# Restart:
# kill -9 `chroot /backup/jails/myserver cat /var/run/sshd.pid`
# chroot /backup/jails/myserver /usr/sbin/sshd > /dev/null
# After *each* ssh upgrade or libs upgrade:
# sh chroot-ssh.sh updateall
# And restart all sshd daemons
bincopy() {
chrootdir=$1
# TODO : better detection of amd64 arch
cp -f /lib/ld-linux.so.2 $chrootdir/lib/ || cp -f /lib64/ld-linux-x86-64.so.2 $chrootdir/lib64/
cp /lib/libnss* $chrootdir/lib/
for dbin in /bin/bash /bin/cat /bin/chown /bin/mknod /bin/rm /bin/sed /bin/sh /bin/uname /bin/mount /usr/bin/rsync /usr/sbin/sshd /usr/lib/openssh/sftp-server; do
cp -f $dbin $chrootdir/$dbin;
# (comme dans http://www.gcolpart.com/hacks/chroot-bind.sh)
for lib in `ldd $dbin | cut -d">" -f2 | cut -d"(" -f1`; do
cp -p $lib $chrootdir/$lib
done
done
}
# synopsis
if [ $# -ne 1 ]; then
echo "Vous devez indiquer un repertoire."
echo "Exemple : chroot-ssh.sh /backup/jails/myserver"
exit 0
fi
# are u root?
if [ `whoami` != "root" ]; then
echo "Vous devez executer le script en étant root."
exit 0
fi
if [ -e $1 ]; then
echo "Le repertoire $1 existe deja..."
fi
if [ "$1" = "updateall" ]; then
for i in `ls -1 /backup/jails/*/lib/libnss_compat.so.2`; do
chrootdir=`echo $i | cut -d"/" -f1,2,3,4`
echo -n "MaJ $chrootdir ..."
bincopy $chrootdir
echo "...OK"
done
else
# where is jail
chrootdir=$1
mkdir -p $chrootdir
chown root:root $chrootdir
# create jail
echo -n "1 - Creation de la prison..."
mkdir -p $chrootdir/{bin,dev,etc/ssh,lib,lib64}
mkdir -p $chrootdir/lib/tls/i686/cmov/
mkdir -p $chrootdir/proc
mkdir -p $chrootdir/root/.ssh
mkdir -p $chrootdir/usr/lib/i686/cmov/
mkdir -p $chrootdir/lib/i686/cmov/
mkdir -p $chrootdir/usr/{bin,lib,sbin}
mkdir -p $chrootdir/usr/lib/openssh
mkdir -p $chrootdir/var/log/
mkdir -p $chrootdir/var/run/sshd
touch $chrootdir/var/log/{authlog,lastlog,messages,syslog}
touch $chrootdir/etc/fstab
echo "...OK"
echo -n "2 - Copie des donnees..."
cp /proc/devices $chrootdir/proc
cp /etc/ssh/{ssh_host_rsa_key,ssh_host_dsa_key} $chrootdir/etc/ssh/
cp etc/sshd_config $chrootdir/etc/ssh/
cp etc/passwd $chrootdir/etc/
cp etc/shadow $chrootdir/etc/
cp etc/group $chrootdir/etc/
echo ".......OK"
echo -n "3 - Copie des binaires..."
bincopy $chrootdir
echo "......OK"
echo -n "4 - Creation des devices..."
cd $chrootdir/dev/
cp /dev/MAKEDEV ./
./MAKEDEV {null,random,urandom,pty}
mkdir pts
#mknod ptmx c 5 2
echo "....OK"
echo -n "5 - Termine."
# end
echo ""
fi

7
etc/group Normal file
View file

@ -0,0 +1,7 @@
root:x:0:
daemon:x:1:
shadow:x:42:
staff:x:50:
users:x:100:
nogroup:x:65534:
ssh:x:102:

4
etc/passwd Normal file
View file

@ -0,0 +1,4 @@
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
sshd:x:100:65534::/var/run/sshd:/usr/sbin/nologin

4
etc/shadow Normal file
View file

@ -0,0 +1,4 @@
root:x:13536:0:99999:7:::
daemon:*:13536:0:99999:7:::
nobody:*:13536:0:99999:7:::
sshd:!:13536:0:99999:7:::

35
etc/sshd_config Normal file
View file

@ -0,0 +1,35 @@
Port 2222
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
UsePrivilegeSeparation yes
KeyRegenerationInterval 3600
ServerKeyBits 768
SyslogFacility AUTH
LogLevel INFO
LoginGraceTime 120
PermitRootLogin yes
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
PasswordAuthentication no
X11Forwarding no
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
UseLogin no
Subsystem sftp /usr/lib/openssh/sftp-server
AllowUsers root@IP root@::ffff:IP

43
evobackup-inc.sh Normal file
View file

@ -0,0 +1,43 @@
#!/bin/sh
# Script backups incrementaux
# Evolix (c) 2007
CONFDIR=/etc/evobackup/
DATE=$(date +"%d-%m-%Y")
LOGFILE=/var/log/evobackup-sync.log
TMPDIR=/tmp/evobackup/
JAILDIR=/backup/jails/
INCDIR=/backup/incs/
MYMAIL=jdoe@example.com
mkdir -p $TMPDIR
for i in $( ls $CONFDIR ); do
mkdir -p "$INCDIR"$i
# hard copy everyday
cp -alx $JAILDIR$i $INCDIR$i/$DATE
# list actual inc backups
for j in $( ls $INCDIR$i ); do
echo $j
done > "$TMPDIR"$i.files
# list non-obsolete inc backups
for j in $( cat $CONFDIR$i ); do
MYDATE=$( echo $j | cut -d. -f1 )
BEFORE=$( echo $j | cut -d. -f2 )
date -d "$(date $MYDATE) $BEFORE" "+%d-%m-%Y"
done > "$TMPDIR"$i.keep
# delete obsolete inc backups
for j in $( grep -v -f "$TMPDIR"$i.keep "$TMPDIR"$i.files ); do
echo "Suppression du backup $j ($i)"
cd $INCDIR$i
rm -rf $j
done
done | tee -a $LOGFILE | mail -s "[info] EvoBackup - incrementaux" $MYMAIL

146
zzz_evobackup Normal file
View file

@ -0,0 +1,146 @@
#!/bin/sh
#
# Script evobackup client
# $Id: evobackup_cron_daily_client,v 1.21 2010-08-22 10:15:42 gcolpart Exp $
#
# port SSH
SSH_PORT=2228
# systeme de la machine ("linux" ou "bsd")
SYSTEME=linux
# mail de remontee Evolix
MAIL=jdoe@example.com
NODE=$(expr `date +%d` % 2)
# operations specifiques
mkdir -p -m 700 /home/backup
# Dump LDAP
# slapcat -l /home/backup/ldap.bak
# Dump MySQL
# mysqldump --defaults-extra-file=/etc/mysql/debian.cnf \
# --opt --all-databases | gzip --best > /home/backup/mysql.bak.gz
# for i in $(echo SHOW DATABASES | mysql | grep -v ^Database); \
# do mkdir -p /home/mysqldump/$i ; chown -R mysql /home/mysqldump ; \
# mysqldump --defaults-extra-file=/etc/mysql/debian.cnf -Q --opt -T \
# /home/mysqldump/$i $i; done
# Dump par base
# mkdir -p -m 700 /home/mysqldump/BASE
# chown -R mysql /home/mysqldump/
# mysqldump --defaults-extra-file=/etc/mysql/debian.cnf -Q \
# --opt -T /home/mysqldump/BASE BASE
# mkdir -p /home/mysqlhotcopy/
# mysqlhotcopy BASE /home/mysqlhotcopy/
# Dump instanceS MySQL
#oldIFS=$IFS
#IFS=$'\n'
#
## Recherche du mot de passe mysqladmin
#mysqladminpasswd=`cat /root/.my.cnf |grep -m1 'password = .*' |cut -d" " -f3`
#
## Determination des instances MySQL disponibles sur le serveur (hors 3306)
#for instance in `cat /etc/mysql/my.cnf |grep "port\s*=\s\d*"`
#do
# instance=${instance// /}
# instance=${instance// /}
# instance=${instance//port=/}
# if [ "$instance" != "3306" ]
# then
# mysqldump -P $instance --opt --all-databases -u mysqladmin -p$mysqladminpasswd > /home/backup/mysql.$instance.bak
# fi
#done
#
#IFS=$old_IFS
# Dump PostgreSQL
# su - postgres -c "pg_dumpall > ~/pg.dump.bak"
# mv ~postgres/pg.dump.bak /home/backup/
# Exemple de backups...
# On sauvegarde les tables d'une base sauf des exceptions
# pg_dump -p 5432 -h 127.0.0.1 -U USER --clean -F t --inserts -f /home/backup/pg-backup.tar -t 'TABLE1' -t 'TABLE2' BASE
# On sauvegarde uniquement certaines tables d'une base
# pg_dump -p 5432 -h 127.0.0.1 -U USER --clean -F t --inserts -f /home/backup/pg-backup.tar -T 'TABLE1' -T 'TABLE2' BASE
# Dump MBR / table partitions
# dd if=/dev/sda of=/home/backup/MBR bs=512 count=1 2>&1 | egrep -v "(records in|records out|512 bytes)"
# sfdisk -d /dev/sda > /home/backup/partitions 2>&1 | egrep -v "(Warning: extended partition does not start at a cylinder boundary|DOS and Linux will interpret the contents differently)"
# Dump routes
# traceroute -n 8.8.8.8 > /home/backup/traceroute-8.8.8.8
# mtr -r 8.8.8.8 > /home/backup/mtr-8.8.8.8
# traceroute -n backup.evolix.net > /home/backup/traceroute-backup.evolix.net
# mtr -r backup.evolix.net > /home/backup/mtr-backup.evolix.net
# traceroute -n www.evolix.fr > /home/backup/traceroute-www.evolix.fr
# mtr -r www.evolix.fr > /home/backup/mtr-www.evolix.fr
# traceroute -n www.evolix.net > /home/backup/traceroute-www.evolix.net
# mtr -r www.evolix.net > /home/backup/mtr-www.evolix.net
HOSTNAME=$(hostname)
DATE=$(/bin/date +"%d-%m-%Y")
DEBUT=$(/bin/date +"%d-%m-%Y ; %H:%M")
if [ $SYSTEME = "linux" ]; then
rep="/bin /boot /lib /opt /sbin /usr"
else
rep="/bsd /bin /boot /sbin /usr"
fi
rsync -av --delete --ignore-errors \
--exclude "lost+found" \
--exclude ".nfs.*" \
--exclude "/var/log" \
--exclude "/var/log/evobackup*" \
--exclude "/var/lib/mysql" \
--exclude "/var/lib/postgres" \
--exclude "/var/lib/sympa" \
--exclude "/var/run" \
--exclude "/var/lock" \
--exclude "/var/state" \
--exclude "/var/apt" \
--exclude "/var/cache" \
--exclude "/usr/src" \
--exclude "/usr/doc" \
--exclude "/usr/share/doc" \
--exclude "/usr/obj" \
--exclude "dev" \
--exclude "/var/spool/postfix" \
--exclude "/var/lib/amavis/amavisd.sock" \
--exclude "/var/lib/munin/munin-update.stats.tmp" \
--exclude "/var/lib/php5" \
--exclude "/var/spool/squid" \
$rep \
/etc \
/root \
/var \
/home \
/srv \
/vmlinuz \
-e "ssh -p $SSH_PORT" \
root@node$NODE.backup.example.com:/var/backup/ \
| tail -20 >> /var/log/evobackup.log
FIN=$(/bin/date +"%d-%m-%Y ; %H:%M")
echo "EvoBackup - $HOSTNAME - START $DEBUT" \
>> /var/log/evobackup.log
echo "EvoBackup - $HOSTNAME - STOP $FIN" \
>> /var/log/evobackup.log
tail -10 /var/log/evobackup.log | \
mail -s "[info] EvoBackup - Client $HOSTNAME" \
$MAIL