Retour : Page Principale > Politique de sécurité

Sauvegarde des serveurs


Chaque serveur doit effectuer une copie de ses fichiers durant la nuit et les placer dans un dossier Ă  son nom dans /home/ sur le serveur de sauvegarde.
Par exemple : /home/sequoia/
Note : contrairement à la sauvegarde des ordinateurs de bureau, ce sont les serveurs qui poussent leurs données vers Adansonia et non ce dernier qui les tire.

Sur le serveur de sauvegarde

  • Un compte backup doit exister avec pour home : /var/backups
  • Dans /var/backups crĂ©er un rĂ©pertoire .ssh contenant un fichier authorized_keys qui contiendra les clefs publiques des comptes backup des serveurs Ă  sauvegarder.
  • Attention aux droits sur le .ssh : rwx r r (744) et au propriĂ©taire backup:backup

Sur chaque serveur Ă  sauvegarder

  • Un compte backup doit exister avec pour home : /var/backups
  • Dans /var/backups un rĂ©pertoire .ssh doit contenir la clĂ© privĂ©e, et la clĂ© publique Ă  copier dans le fichier authorized_keys sur le serveur de sauvegarde.
  • Attention aux droits sur le .ssh : rwx r r (744) et au propriĂ©taire backup:backup
  • Le programme rĂ©alisant les backups est prĂ©sent dans /etc/cron.daily/ndistbackup et est donc exĂ©cutĂ© chaque jour. Ce script contient des appels Ă  /usr/local/sbin/backup_dist nom_repertoire_a_sauvegarder ou Ă  l'utilitaire borg (sur les nouveaux serveurs).
  • Il faut l'adapter en fonction de la destination (voir ci-dessous).

Exemple de backup_dist sur les serveurs

Programme : /usr/local/sbin/backup_dist
#!/bin/bash
source=$1
destination=backup@tela-botanica.no-ip.org:/sauvegarde/sequoia/
rsync --stats --exclude *tmp* -v -e 'ssh -i /var/backups/.ssh/id_rsa' -R -a --delete $source $destination >> $2

Exemple de ndistbackup sur Sequoia

#!/bin/bash
date=`date +"%F"`
log="/tmp/sauve_distant_"$date".log"
debut=`date +"%c"`
echo "------------------------------------------------------------------------" >> $log
echo "Place disponible sur les disques de Sequoia :" >> $log
df -h >> $log
echo "------------------------------------------------------------------------" >> $log
echo "Debut sauvegarde distante sequoia : $debut" >> $log
echo "Sauvegarde /home/grosdur :" >> $log
/usr/local/sbin/backup_dist_grosdur.sh /home/grosdur $log
echo "------------------------------------------------------------------------" >> $log
echo "Sauvegarde /etc :" >> $log
/usr/local/sbin/backup_dist.sh /etc $log
echo "------------------------------------------------------------------------" >> $log
echo "Sauvegarde /usr/local/apache/conf :" >> $log
/usr/local/sbin/backup_dist.sh /usr/local/apache/conf $log
echo "------------------------------------------------------------------------" >> $log
echo "Sauvegarde /home/admin/www :" >> $log
/usr/local/sbin/backup_dist.sh /home/admin/www $log
echo "------------------------------------------------------------------------" >> $log
echo "Sauvegarde /home/admin/script :" >> $log
/usr/local/sbin/backup_dist.sh /home/admin/script $log
echo "------------------------------------------------------------------------" >> $log
echo "Sauvegarde /home/admin/save :" >> $log
/usr/local/sbin/backup_dist.sh /home/admin/save $log
echo "------------------------------------------------------------------------" >> $log
echo "Sauvegarde /home/telabotap :" >> $log
/usr/local/sbin/backup_dist.sh /home/telabotap $log
echo "------------------------------------------------------------------------" >> $log
echo "Sauvegarde /home/gentiana :" >> $log
/usr/local/sbin/backup_dist.sh /home/gentiana $log
echo "------------------------------------------------------------------------" >> $log
echo "Sauvegarde /home/telabotaa :" >> $log
/usr/local/sbin/backup_dist.sh /home/telabotaa $log
echo "------------------------------------------------------------------------" >> $log
echo "Sauvegarde /home/vpopmail :" >> $log
/usr/local/sbin/backup_dist.sh /home/vpopmail $log
echo "------------------------------------------------------------------------" >> $log
fin=`date +"%c"`
echo "Fin sauvegarde distante sequoia  $fin" >> $log
echo "------------------------------------------------------------------------" >> $log

(
    echo "From: Root SEQUOIA <root@sequoia.tela-botanica.net>";
    echo "To: adresse-contact-developpeurs@tela-botanica.org";
    echo "Subject: Sauvegarde rapport SEQUOIA  du $date";

    echo "MIME-Version: 1.0";
    echo "Content-Type: text/html; charset=UTF-8";
    echo "Content-Disposition: inline";
    echo "<html>";
    echo "<body>";
    echo "<pre style="font: monospace">";
    cat $log
    echo "</pre>";
    echo "</body>";
    echo "</html>";
) | /usr/sbin/sendmail -t

rm -f $log

Sauvegarde des bases de données des serveurs

Par défaut chaque base de données portant le même nom que son utilisateur sera sauvegardée.
Un dump de la base est réalisé puis zippé et stocké dans le dossier : /home/utilisateur/bases/
Ces dumps seront ensuite sauvegardés sur le serveur de sauvegarde via le programme de backup du serveur (voir ci-dessus).
La liste des bases à sauvegarder est située sur chaque serveur dans le fichier : /etc/cron.daily/mysqlbackup

Configuration du fichier /etc/cron.daily/mysqlbackup

Sur chaque ligne, indiquez la commande Ă  lancer puis l'utilisateur suivi des bases Ă  sauver.
Exemple sur Sequoia (2017-08-07) :
#!/bin/bash
/usr/local/sbin/backup_mysql gentiana gentiana gentiana_prod_eflore_v1_1_historique gentiana_prod_eflore_v1_1_principale
/usr/local/sbin/backup_mysql telabotap telabotap tela_prod_bibliobota tela_prod_botanica tela_prod_eflore_v1_1_principale tela_prod_eflore_v1_1_historique tela_prod_spip_actu tela_prod_v4 tela_prod_wikini
/usr/local/sbin/backup_mysql telabotaa telabotaa
/usr/local/sbin/backup_mysql ftpE ftpE
/usr/local/sbin/backup_mysql herbiera herbiera
/usr/local/sbin/backup_mysql herbierm herbierm


Configuration de backup_mysql sur les serveurs

Programme : /usr/local/sbin/backup_mysql
#/bin/bash
# Sauvegarde base de donnee dans /home/utilisateur/bases sur 5 jours ...
# Mai 2004 David Delon Inspiration Faq ovh
# Parametres :
# $1 utilisateur
# $2 base (ou liste de bases)
# Le mot de passe de l'administrateur de base de donnee est present dans ce 
# script en clair, c'est pas bien : faut chmoder en 700 ce truc, et surtout déplacer le mdp
# dans /root/.my.cnf plutĂ´t que de le mettre ici
user=$1
/bin/mkdir -p /home/$user/bases/tmp 2>/dev/null
cd /home/$user/bases;
shift
for base in $*
do
# On verifie que la base existe
    /usr/bin/touch tmp/$base.sql
    if [ -d /home/mysql/$base ] ; then
        /usr/local/mysql/bin/mysqldump --add-drop-table -u root -pmotdepasse $base -f > tmp/$base.sql;
    fi
done
/bin/tar zcf bases-$(/bin/date -I).tar.gz tmp/*.sql --remove-files
/usr/bin/find /home/$user/bases/bases*.gz -mtime +5 -exec /bin/rm -f {} \;
chown admin:users /home/$user/bases -R


Configuration de ssh_config sur les serveurs

Fichier : /etc/ssh/ssh_config

Le client SSH vérifie par défaut que l'hôte auquel il se connecte n'a pas changé d'IP depuis la dernière fois, afin d'éviter à un usurpateur de... euh... usurper des trucs.
L'ennui c'est que les serveurs se connectent à Adansonia sur le réseau Orange (>= 2017) à travers l'alias "tela-botanica.no-ip.org", précisément parce que l'IP externe de ce réseau change parfois.
Pour ne pas se faire téj par SSH lors d'un tel changement d'IP, on désactive la vérification de la correspondance clef-IP pour cet hôte, en ajoutant ceci à la fin du fichier de configuration du client SSH /etc/ssh/ssh_config, sur chaque serveur (Sequoia, Agathis) :
Host tela-botanica.no-ip.org
    CheckHostIP no