Description

Il faut disposer d’un serveur debian que nous appellerons serveur de sauvegarde qui exécutera, via le planificateur, des sauvegardes de serveurs distants

Serveur de sauvegarde

Utilisateur et dossier backupuser

Création utilisateur backupuser et d’un jeu de clé ssh

sudo adduser backupuser  #mot de passe à saisir 

Cette commande va vous demander plusieurs informations et notamment un mot de passe à noter impérativement. N’hésitez pas à définir un mot de passe compliqué, d’environ 16 caractères avec des chiffres, des lettres majuscule/minuscule et quelques caractères spéciaux car vous n’aurez à le taper réellement qu’une fois.

Création dossier .ssh

sudo mkdir /home/backupuser/.ssh/

Modifier les droits

sudo chown backupuser. -R /home/backupuser/.ssh/
sudo chmod 644 -R /home/backupuser/.ssh/

On se connecte en backupuser

sudo su backupuser
ssh-keygen -t rsa
chmo 400 id_rsa*       #lecture seule pour utilisateur backupuser 

Le bash sauvegarde.sh

Fichier exclusion à créer sur le “serveur de sauvegarde”

nano exclude.txt
dev/*
proc/*
sys/*
tmp/*
run/*
mnt/*
media/*
lost+found

bash sauvegarde.sh

nano sauvegarde.sh
#!/bin/bash
#
# serveurs distants
$desti="destinataire@messagerie.fr"		# A ajuster
$repsav="/media/yanplus/sauvegarde/aujourdhui"  # A ajuster
#echo $(date) "Sauvegarde hôte distant xatyuezal.xyz"  >> /home/backupuser/sauvegarde.log
#/usr/bin/rsync -aev --delete --rsync-path=/home/backupuser/rsync-wrapper.sh --exclude-from '/home/backupuser/exclude.txt' --rsh="/usr/bin/ssh -p 47101 -i /home/backupuser/.ssh/id_rsa" backupuser@xatyuezal.xyz:/ /media/yanplus/sauvegarde/aujourdhui/xatyuezal.xyz &>> /home/backupuser/sauvegarde.log
#echo $(date) "Fin sauvegarde hôte distant xatyuezal.xyz"  >> /home/backupuser/sauvegarde.log

echo $(date) "Sauvegarde hôte distant xoyize.xyz"  >> /home/backupuser/sauvegarde.log
/usr/bin/rsync -aev --delete --rsync-path=/home/backupuser/rsync-wrapper.sh --exclude-from '/home/backupuser/exclude.txt' --rsh="/usr/bin/ssh -p 55026 -i /home/backupuser/.ssh/id_rsa" backupuser@xoyize.xyz:/ $repsav/xoyize.xyz &>> /home/backupuser/sauvegarde.log
echo $(date) "Fin sauvegarde hôte distant xoyize.xyz"  >> /home/backupuser/sauvegarde.log

#envoi des logs du jour pat mail
grep "$(date +"%d %B %Y")" /home/backupuser/sauvegarde.log |mail -s "Sauvegarde du $(date +"%d %B %Y")" $desti

Les droits en exécution

chmod +x

retour sur utilisateur précédent

exit                   # retour sur utilisateur précédent

Copie clé publique sur serveur distant

Copie de la clé publique (.ssh/id_rsa.pub) dans le fichier .ssh/authorized_keys du serveur distant à sauvegarder :

sudo cat /home/backupuser/.ssh/id_rsa.pub | ssh utilisateur@serveur-distant 'cat >> .ssh/authorized_keys'

Rotation du fichier sauvegarde.log

Rotation avec compression

sudo nano /etc/logrotate.d/sauvegarde

/home/backupuser/sauvegarde.log {
        rotate 6
        monthly
        compress
        missingok
}
  • surveille le fichier sauvegarde.log et génère une rotation une fois par mois - c’est l’ “intervalle de rotation”.
  • ‘rotate 6’ signifie qu’à chaque intervalle, on conserve 6 semaines de journalisation.
  • Les fichiers de logs peuvent sont compressés au format gzip en spécifiant ‘compress’
  • ‘missingok’ permet au processus de ne pas s’arrêter à chaque erreur et de poursuivre avec le fichier de log suivant.

Ordonnancement (cron)

Sauvegarde une fois par jour à 3h15 du matin

sudo crontab -e

# tous les jours à 3h15
15 3 * * * /home/backupuser/sauvegarde.sh

Serveur distant

Les opérations suivantes sont à faire sur tous les serveurs distants

Vérifier ou installer rsync

sudo apt install rsync # debian

Ajout utilisateur de backupuser ,qui ne peut exécuter que rsync ,et de la clé publique du “serveur de sauvegarde”

#création utilisateur backup
sudo useradd backupuser -c "limited backup user" -m -u 4210
#ajout clé publique ssh dans le fichier authorized_keys du nouvel utilisateur
sudo mkdir /home/backupuser/.ssh
sudo mv id_rsa.pub /home/backupuser/.ssh/authorized_keys #(debian) 
#   ou 
sudo nano /home/backupuser/.ssh/authorized_keys    #coller le contenu /home/backupuser/.ssh/id_rsa.pub copié sur terminal du serveur

Création script bash rsync-wrapper.sh

sudo nano /home/backupuser/rsync-wrapper.sh

Contenu du script

#!/bin/sh
 
date > /home/backupuser/backuplog
#echo $@ >> /home/backupuser/backuplog
/usr/bin/sudo /usr/bin/rsync "$@";

Droits sur le fichier

sudo chown backupuser:backupuser /home/backupuser/rsync-wrapper.sh
sudo chmod 755 /home/backupuser/rsync-wrapper.sh

Edition fichier sudoers pour un accès root à l’exécution de rsync

sudo -s

Ajouter ligne suivante en fin de fichier,exécution en mode root de rsync

echo "backupuser ALL=NOPASSWD: /usr/bin/rsync" >> /etc/sudoers

Vous devez copier le fichier rsync-wrapper.sh et modifier le fichier sudoers sur tous les hôtes

Le serveur de sauvegarde doit effectuer une connexion ssh manuelle pour valider le distant

su backupuser
cd /home/backupuser
ssh -i .ssh/id_rsa -p 55026 backupuser@serveur-distant
The authenticity of host '[xoyize.xyz]:55026 ([93.115.96.97]:55026)' can't be established.
ECDSA key fingerprint is 1f:9d:21:a7:ef:e8:3a:59:2e:ca:ad:d7:fa:58:d1:92.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[xoyize.xyz]:55026,[93.115.96.97]:55026' (ECDSA) to the list of known hosts.
Linux vps26381 4.9.0-5-amd64 #1 SMP Debian 4.9.65-3+deb9u2 (2018-01-04) x86_64
$ exit  # fermeture de la liaison ssh

retour sur utilisateur précédent

exit                   # retour sur utilisateur précédent

Sauvegarde Locale Yunohost

Outil yunohost backup

La sauvegarde Yunohost sera générée dans le répertoire /home/yunohost.backup/archives (certaines applications ne sont pas sauvegardées). L’archive est au format AAAAMMJJ-HHMMSS.tar.gz ainsi que le fichier info associé AAAAMMJJ-HHMMSS.info.json
La sauvegarde est LOCALE , il faut copier le contenu sur une source externe (USB formatée en ext4 , via le réseau par rsync , etc…)
Donner les droits d’accès aux archives au groupe de l’utilisateur $USER :

$ sudo chown -Rv root:$USER /home/yunohost.backup
usage: yunohost backup create [-h] [-d DESCRIPTION] [-o OUTPUT_DIRECTORY]
[-n NAME] [--hooks [HOOKS [HOOKS ...]]] [-r]
[--ignore-apps]

optional arguments:
-h, --help show this help message and exit
-d DESCRIPTION, --description DESCRIPTION
Short description of the backup
-o OUTPUT_DIRECTORY, --output-directory OUTPUT_DIRECTORY
Output directory for the backup
-n NAME, --name NAME Name of the backup archive
--hooks [HOOKS [HOOKS ...]]
List of backup hooks names to execute
-r, --no-compress Do not create an archive file
--ignore-apps Do not backup apps

Bash savyuno.sh

Créer un bash pour la sauvegarde yunohost

sudo nano  /home/backupuser/savyuno.sh
#!/bin/bash

DOMAINE="domaine.tld"
rm /home/backupuser/$DOMAINE.info.json
rm /home/backupuser/$DOMAINE.tar.gz
/usr/bin/yunohost backup create -n $DOMAINE
mv /home/yunohost.backup/archives/$DOMAINE.info.json /home/backupuser/
mv /home/yunohost.backup/archives/$DOMAINE.tar.gz /home/backupuser/

Remplacer domaine.tld par votre nom de domaine

droits

sudo chmod +x  /home/backupuser/savyuno.sh

Ordonnancement des tâches (cron)

Sauvegarde yunohost tous les jours à 2h15
Sauvegarde des bases mysql tous les jours à 2h30
Vérification validité des certificats SSL 1 fois par semaine à 2h30 et regénération auto si nécessaire

le fichier crontab

sudo -s
crontab -e
# m h  dom mon dow   command
30 1 * * *  /home/backupuser/savyuno.sh
30 2 * * * /home/backupuser/dumpmysql.sh
30 2 * * 1 /usr/local/sbin/le-renew-webroot >> /var/log/le-renewal.log

ATTENTION!!! La sauvegarde de yunohost (savyuno.sh) est très longue en temps ( environ 1 heure)