[Synology] Installer un backup automatisé de ses données hébergées (BD & fichiers) vers son NAS, en SFTP - MAJ 09/2023

Vous trouverez ici quelques contributions sur des sujets variés mais qui n'ont aucun rapport avec le monde de l'aérien
Règles du forum
Courtoisie envers les membres et respect envers les sociétés sont les maitre mots de ces forums. Tout manquement sera sanctionné par un rappel à l'ordre, voir une exclusion temporaire ou définitive des forums !
Avatar de l’utilisateur
FTP
Messages : 1028
Inscription : 06 mars 2004 14h41
Contact :

[Synology] Installer un backup automatisé de ses données hébergées (BD & fichiers) vers son NAS, en SFTP - MAJ 09/2023

Message par FTP »

On ne le répète jamais assez mais les données sont le nerf de la guerre !
Perdre toutes ses données, sans sauvegarde, peut être catastrophique, au point de faire couler des entreprises incapables de s'en relever.

L'exemple de l’incendie du datacenter d'OVH à Strasbourg en mars 2021 ou les multiples attaques par ransomware sont là pour le rappeler.

Problème, avoir des sauvegardes ne suffit pas toujours. Surtout si elles sont réalisées par votre hébergeur !

Car il y a une autre règle d'or : au moins 1 sauvegarde régulière doit être réalisée sur un site distant, géographiquement situé à plusieurs kilomètres du site hébergeant les données maîtres, car seule cette redondance permettra en cas d'incendie, d’inondation, de vol, d'explosion, d'effondrement, de raz-de-marée ou de tremblement de terre de récupérer l'intégralité des données rapidement.

Or confier toutes ses sauvegardes à son hébergeur de production pose problème : 1/ vous continuez de ne disposer d'aucune donnée en local, vous continuez donc d'être dangereusement à la merci d'un seul prestataire qui peut se révéler défaillant, mais surtout 2/ il reste bien trop fréquent que les hébergeurs réalisent les sauvegardes de leurs clients dans le même datacenter que celui des serveurs de production, parfois dans la même salle serveur ! C'était le cas à Strasbourg. Conséquence, quand le datacenter part en fumée, les données de production comme les sauvegardes de l'hébergeur partent en fumée ! C'est comme si les clients n'avaient jamais eu de sauvegarde.
Or certains hébergeurs se gardent bien d'expliquer où sont stockées les sauvegardes de leurs clients, certain n'ont carrément pas d'options de sauvegarde distante et quand ils en ont une, elle est souvent payante.

Du coup, il devient évident que pour tout possesseur de NAS, qui a donc sur son LAN un espace de stockage en réseau, la mise en place de ses propres backups rapatriant une copie de l'ensemble de ses données hébergées (notamment les bases de données et fichiers de ses sites web) sur son NAS, en local, à intervalle régulier, est une nécessité. Ne pas le faire serait une faute et il ne faudrait pas venir se plaindre des conséquences si un jour ces données distantes venaient à disparaître pour une raison x ou y.

C'est donc ce que nous allons voir ici pour les possesseurs de NAS Synology, en prenant l'exemple d'hébergements distant chez OVH et Hostinger. Mais le principe resterait le même quel que soit la marque du NAS et quel que soit l'hébergeur. Seuls les détails de la procédure différeraient légèrement.

Enfin, précisons que cette sauvegarde sera quotidienne. Elle sera réalisée toutes les nuits, mais ne comportera pas de versioning. Son but sera de vous permettre très simplement de conserver en local une copie facilement accessible, récente (de moins de 24h), non cryptée/compressée, de l'ensemble de vos données hébergées, notamment de vos sites web, mais pas de créer une usine à gaz en mettant en place une mécanique complexe de versioning.

Si vous souhaitez aussi pouvoir remonter dans le temps en conservant vos sauvegardes de plusieurs jours, voir semaines, mois ou années, je vous conseillerais dans ce cas de d'abord mettre en place le rapatriement automatisé de vos données sur le NAS tel que décrit ici, pour les avoir toujours à disposition, facilement accessibles, puis par-dessus, de mettre en place un backup incrémental compressé du dossier de sauvegarde, via l'app Hyper Backup de Synology. Vous pourrez ainsi remonter dans le temps, sans consommer trop d'espace disque, grâce à un outil qui gérera cette mécanique complexe au mieux.


Sommaire
1/ Création de la structure d'accueil des données de sauvegarde sur le NAS
2/ Mise en place d'un script à même d'exporter les bases de données dans des fichiers .sql
3/ Paramétrage d'une tâche Cron automatisant l'exécution du script d'export des bases de données
4/ Paramétrage de 2 tâches côté NAS rapatriant l'ensemble des fichiers en SFTP 5/ [Optionnel] Sécurisation des connexions à ses hébergeurs via des clés SSH, sans mot de passe
Voilà. Et maintenant qu'on a le programme, c'est parti, on commence...


1/ Création de la structure d'accueil des données de sauvegarde sur le NAS
En effet, faire des sauvegardes c'est bien, mais on ne va quand même pas entasser les données en vrac dans n'importe quel répertoire. Du coup, on va créer une petite structure de dossiers à même de recevoir les fichiers de manière ordonnée. Pour cela...
  • Se connecter à l'admin de son NAS via un navigateur et son adresse IP
  • Saisir son nom d'utilisateur et son mot de passe
  • Panneau de configuration > Dossier partagé > [Créer] > Créer un dossier partagé...
    Image

    - Nom > Backup hébergements (espaces et accents autorisés - avec un "s" si vous avez plusieurs hébergements à sauvegarder)
    - Corbeille > décoché (totalement inutile, va consommer de la place pour rien)
    - [Suivant] > [Suivant] (sauf si vous souhaitez chiffrer le dossier partagé)
    Image

    - Activation de la somme de contrôle des données pour l'intégrité avancées des données > coché (c'est plus sûr)
    - Activer le quota du dossier partagé > décoché (ne pas risquer que vos backups plantent par manque de place, de quota !)
    - [Suivant] > [Suivant] > [Appliquer]
    Image


    Enfin, on va aussi créer des sous-dossiers, pour organiser les données...
  • File Station > Backup hébergements > [Créer] > Créer dossier
    - Créer un sous-dossier par hébergement si vous en avez plusieurs (chacun pouvant contenir plusieurs sites web)
    - Puis créer pour chaque hébergement 2 autres sous-dossiers, 1 pour les bases de données et 1 pour les fichiers...
    Image

Voilà. C'est fait. Votre NAS est maintenant prêt à recevoir les données de backup.
Passons à la préparation des données à sauvegarder côté hébergeur(s).


2/ Mise en place d'un script à même d'exporter les bases de données dans des fichiers .sql
En effet, si les fichiers des espaces d'hébergements peuvent être sauvegardés tel quel, ça n'est pas le cas des bases de données.
Il faut d'abord réaliser un export complet (structure et données) de chaque base dans un fichier .sql, avant de pouvoir sauvegarder ces fichiers.

Pour ce faire, on va donc préparer un script PHP à même de se connecter à chaque base de l'hébergement, de l'exporter en un fichier .sql et de le compresser en un .zip :
  • Se connecter à son espace d'hébergement en utilisant un client FTP comme Filezilla
  • Dans la racine de son espace d'hébergement (généralement /home/repertoireHebergement/), créer 2 sous-répertoires, /scripts/ et /exports_bdd/
    - /home/repertoireHebergement/scripts/ recevra le fichier PHP du script d'export des bases et pourquoi pas, d'autres scripts dans le futur
    - /home/repertoireHebergement/exports_bdd/ recevra les exports des bases en attente de récupération sur le NAS

    :idea: A noter que ces répertoires sont volontairement positionnés en dehors du répertoire web (/www/ ou /public_html/). C'est important pour la sécurité des données car de cette manière les fichiers de script et d'export seront inaccessibles depuis le web, via un navigateur. N'oubliez pas qu'ils contiennent vos mots de passe de connexion à vos bases de données, ainsi qu'à tous les comptes de vos sites web !

    Enfin...
  • Dans le dossier /scripts/, créer un fichier export_bdd.php codé en UTF-8 (Unicode). Ce fichier va contenir le script chargé d'exporter la ou les bases de données de l'hébergement que vous souhaitez sauvegarder. Voici son contenu...

    Code : Tout sélectionner

    <?php
    	/***********************************************************
    	*
    	* Backup des bases de données de l'hébergement Xxxxxxxxxxx
    	*
    	**************
    	*
    	* Paramètres :
    	*
    	* v (verbose) : Par défaut, quand ce paramètre n'est pas présent dans l'URL, le détail de ce qui est réalisé ne s'affiche pas, ne s'affiche que 3 points (...), un par passage de chacune des 3 étapes.
    	*               Mais si on rajoute ce paramètre à l'URL et si sa valeur égale "y" (yes), alors le détail de ce qui est réalisé s'affiche.
    	*               Exemple : .../scripts/export_bdd.php?v=y
    	*
    	***********************************************************/
    
    	$verbose = ($_GET['v'] == "y") ? true : false;
    	$dump_dir = "/home/repertoireHebergement/exports_bdd";
    
    	// Paramètre le fuseau horaire français pour le script.
    	// Inutile avec certains hébergements français comme OVH, mais obligatoire avec les hébergeurs qui utilisent l'heure UTC comme Hostinger
    	date_default_timezone_set("Europe/Paris");
    
    
    	/***********************************************************
    	* Efface les précédents backups s'il y en a dans le répertoire.
    	* Ils devraient normalement être virés après la récupération par le NAS mais on ne sait jamais.
    	***********************************************************/
    	if ($verbose == false) {
    		system("rm " . $dump_dir . "/*.zip");
    		echo ".";
    	} else {
    		echo "---------- Suppression des précédents backups... ----------<br />";
    		system("rm --verbose " . $dump_dir . "/*nomBDD1.zip");
    		echo "<br />";
    		system("rm --verbose " . $dump_dir . "/*nomBDD2.zip");
    		echo "<br /><br />";
    	}
    
    
    	/***********************************************************
    	* Backup de la base de données Xxxxxxxxxxxx
    	***********************************************************/
    	$db_host = "localhost";
    	$db_host_port = "";
    	$db_name = "nomBDD1";
    	$db_user = "identifiantBDD1";
    	$db_pass = "motDePasseBDD1";
    
    	// Horodatage du nom du fichier de backup
    	$file_name = date('Y-m-d-H\hi') . "_db_" . $db_name;
    
    	// Backup
    	if ($verbose == false) {
    		system("mysqldump --host=" . $db_host . " --port=" . $db_host_port . " --user=" . $db_user . " --password=" . $db_pass . " " . $db_name . " > " . $dump_dir . "/" . $file_name . ".sql");
    		system("zip --quiet " . $dump_dir . "/" . $file_name . ".zip " . $dump_dir . "/" . $file_name . ".sql");
    		system("rm " . $dump_dir . "/" . $file_name . ".sql");
    		echo ".";
    	} else {
    		echo "<br />---------- " . date('Y-m-d H\hi') . " - Début du backup de la base " . $db_name . " ----------";
    		system("mysqldump --host=" . $db_host . " --port=" . $db_host_port . " --user=" . $db_user . " --password=" . $db_pass . " " . $db_name . " > " . $dump_dir . "/" . $file_name . ".sql");
    		echo "<br />created: ";
    		system("ls " . $dump_dir . "/" . $file_name . ".sql");
    		echo "<br />";
    
    		// Création d'un fichier compressé à partir du fichier de backup
    		system("zip " . $dump_dir . "/" . $file_name . ".zip " . $dump_dir . "/" . $file_name . ".sql");
    		echo "<br />";
    
    		// Suppression du fichier non compressé
    		system("rm --verbose " . $dump_dir . "/" . $file_name . ".sql");
    		echo "<br />---------- " . date('Y-m-d H\hi') . " - Fin du backup ! ----------<br /><br />";
    	}
    ?>
  • Puis, le personnalisez :
    - Remplacer "Xxxxxxxxxxx" par le nom de l'hébergement et/ou de l'hébergeur
    - Remplacer "repertoireHebergement" par le nom du répertoire racine de votre hébergement, celui juste après "/home/"
    - A noter que dans le script fourni ci-dessus, 1 seule base de données est exportée. Pour en exporter plus, dupliquez le bloc de code suivant :

    Code : Tout sélectionner

    	/***********************************************************
    	* Backup de la base de données Xxxxxxxxxxxx
    	***********************************************************/
    	
    	...
    	
    	}
    - Et pour chaque backup d'1 base de données, chaque bloc de code vu ci-dessus, personnaliser son nom ("Xxxxxxxxxx"), ainsi que les 5 variables ci-dessous :
    $db_host : "nomBaseDeDonnees.mysql.db" (chez OVH) ou "localhost" (chez Hostinger)
    $db_host_port : laisser vide
    $db_name : le nom de votre base de données
    $db_user : l'identifiant de l'utilisateur MySQL
    $db_pass : le mot de passe de l'utilisateur MySQL

:!: Attention : refaire cette étape autant de fois que vous avez d'hébergements indépendants que vous souhaitez sauvegarder qui possèdent leur propre interface d'admin, leur propre espace FTP, leur propres bases de données et leur propres tâches Cron.


3/ Paramétrage d'une tâche Cron automatisant l'exécution du script d'export des bases de données
Car c'est bien beau d'avoir un joli script capable d'exporter les bases et de compresser les fichiers d'export, encore faut-il trouver un système qui le lance automatiquement tous les jours. Pour ça, on va mettre en place une tâche Cron, qui sera en charge d'exécuter automatiquement le script toutes les nuits à heure fixe.
Chez OVH, pour les offres mutualisées
  • Se connecter à son Espace Client OVH via un navigateur
  • Saisir son nom d'utilisateur et son mot de passe
  • Menu Web Cloud > Hébergements > choisir l'hébergement concerné > Plus > Cron > Ajouter une planification
  • Puis personnaliser...
    - Commande à exécuter > scripts/export_bdd.php
    - Langage > PHP 7.4
    - Activation > coché
    - Logs par e-mail > "Contact administrateur" ou "Contact technique"
    - Description > "Sauvegarde des bases de données"
    - [Suivant]
    Image
  • Enfin personnaliser...
    - Heures > Heures fixes > 1h
    :!: Attention, chez OVH on ne peut pas choisir les minutes. La tâche sera exécutée dans l'heure sélectionnée. Si on choisit "1h", elle sera exécutée entre 1h00 et 1h59, mais tous les jours à la même heure. Et il s'agit d'heure locale française, pas UTC. C'est "1h" du matin en France, quel que soit le jour de l'année.
    - Jours > Tous les jours
    - Jours de la semaine > Tous les jours de la semaine
    - Mois > Tous les mois
    - [Suivant] > [Valider]
    Image
Chez Hostinger
  • Se connecter à son hpanel Hostinger via un navigateur
  • Saisir son nom d'utilisateur et son mot de passe
  • Menu Hébergement > choisir n'importe lequel de ses sites > Avancé > Tâches Cron
  • Puis personnaliser...
    - Commande à exécuter > scripts/export_bdd.php
    - Options communes > Une fois par jour (0 0 * * *)
    :idea: Ce paramétrage standard correspond exactement à notre besoin. Il exécutera la tâche automatiquement tous les jours à 0h00 UTC, soit à 1h00 du matin en France en hiver, ou 2h00 en été.
    - [Sauvegarder]
    Image

Voilà. Une fois paramétrée, la tâche s'exécutera automatiquement toutes les nuits, elle lancera le script export_bdd.php qui exportera la ou les bases de données de l'hébergement, compressera les fichiers exportés et se faisant, les rendra prêts pour la sauvegarde, pour leur copie sur le NAS un peu plus tard dans la nuit.

:!: Attention : refaire cette étape autant de fois que vous avez d'hébergements indépendants que vous souhaitez sauvegarder qui possèdent leur propre interface d'admin, leur propre espace FTP, leur propres bases de données et leur propres tâches Cron.


4/ Paramétrage de 2 tâches côté NAS rapatriant l'ensemble des fichiers en SFTP
C'est la dernière étape. Il s'agit cette fois de paramétrer 2 nouvelles tâches, côté NAS, se chargeant après l'heure d'export des bases de données, de réaliser une copie sécurisée en SFTP sur le NAS, dans la structure qu'on a préparé à cet effet au §1 :
  • des bases de données (tâche 1),
  • et des fichiers (tâche 2).
On va utiliser pour cela le "Planificateur de tâches" Synology et l'utilitaire lftp à disposition dans DSM.

:!: Attention, pour pouvoir réaliser les copies en SFTP, vous devez au préalable avoir activé le SFTP chez votre hébergeur !
OVH : Espace Client > Web Cloud > Hébergements > votre hébergement > FTP - SSH > modifier l'utilisateur > Protocoles de connexion > FTP et SFTP
Hostinger : hpanel > Hébergement > votre hébergement > Accès SSH > Gérer l'accès SSH > activer (l'activation du SSH active SFTP)
Si malheureusement vous ne pouvez pas activer SFTP, notamment à cause de votre plan qui ne comprend pas cette fonctionnalité, je donne quand même, plus bas, le code pour faire les backups en FTP. Vous pouvez donc continuer la lecture :wink:


Tâche de sauvegarde des bases de données
Pour ce faire, on va :
  • Se connecter à l'admin de son NAS via un navigateur et son adresse IP
  • Saisir son nom d'utilisateur et son mot de passe
  • Panneau de configuration > Planificateur de tâches > [Créer] > Tâche planifiée > Script défini par l'utilisateur...
    Image
  • Onglet Général
    - Tâche > Backup bases de données
    - Utilisateur > le compte qui a été utilisé pour créer la structure d'accueil des données (il n'est pas nécessaire d'utiliser "root", c'est même déconseillé à chaque fois que c'est inutile)
    Image
  • Onglet Programmer
    - Exécuter les jours suivants > Quotidienne
    - Première heure d'exécution > 03 : 00 (attention à ce que ce soit après l'heure d'export des bases de données !)
    - Fréquence > Chaque jour
    Image
  • Onglet Paramètres de tâche
    - Envoyer les détails d'exécution par e-mail > cocher (optionnel)
    - Courrier électronique > saisir votre adresse email (optionnel)
    - Envoyer les détails d'exécution uniquement lorsque le script se termine de manière anormale > cocher (optionnel)
    - Script défini par l'utilisateur > copier le code suivant qu'il faudra personnaliser (cf. ci-dessous)...

    Code : Tout sélectionner

    printf "\nPrécédents backups supprimés...\n"
    find "/volume1/Backup hébergements/Hébergement 1/Bases de données/" -type f -name "*_db_*.zip" -delete -print
    printf "\nRapatriement des nouveaux backups...\n"
    lftp -c 'set sftp:auto-confirm yes ; open sftp://00.00.00.00 -u identifiantFTP,motDePasseFTP -p 22 ; mget -E /home/repertoireHebergement/exports_bdd/*.zip -O "/volume1/Backup hébergements/Hébergement 1/Bases de données"'
    find "/volume1/Backup hébergements/Hébergement 1/Bases de données/" -type f -name "*_db_*.zip" -print
    printf "\nProcessus de rapatriement terminé !"
    Si vous ne pouvez vraiment pas utiliser SFTP, voici le code en FTP

    Code : Tout sélectionner

    printf "\nPrécédents backups supprimés...\n"
    find "/volume1/Backup hébergements/Hébergement 1/Bases de données/" -type f -name "*_db_*.zip" -delete -print
    printf "\nRapatriement des nouveaux backups...\n"
    lftp -c 'set ftp:ssl-allow no ; open ftp://00.00.00.00 -u identifiantFTP,motDePasseFTP ; mget -E //exports_bdd/*.zip -O "/volume1/Backup hébergements/Hébergement 1/Bases de données"'
    find "/volume1/Backup hébergements/Hébergement 1/Bases de données/" -type f -name "*_db_*.zip" -print
    printf "\nProcessus de rapatriement terminé !"

    - [OK]
    Image

    Explications : ce script réalise les 3 tâches suivantes :
    - il supprime les précédents backups de base de données côté NAS pour faire place nette (1ère ligne find avec instruction -delete),
    - puis il copie le ou les fichiers de backup de l'hébergeur vers le NAS en SFTP grâce à l'utilitaire lftp (4ème ligne lftp avec la commande mget)
    - enfin, une fois la copie faite, il supprime les backups côté hébergeur (instruction -E de mget).
    - Les lignes printf et les instructions -print servent à documenter ce qui a été fait pour les rapports d'exécution envoyés par email.

    Explication détaillée du code
    printf "\n...\n" : affiche le texte entre guillemets (sera en réalité affiché dans le rapport d'exécution par email), \n pour un retour à la ligne
    find "/volume1/Backup hébergements/Hébergement 1/Bases de données/" -type f -name "*_db_*.zip" -delete -print : fait la liste des fichiers (-type f) dans le répertoire mentionné (on utilise les doubles guillemets quand il y a des espaces dans le nom d'un répertoire), dont le nom match le modèle (-name "*_db_*.zip"), puis les supprime (-delete) et affiche la liste des fichiers supprimés (-print) dans le rapport d'exécution
    lftp -c '...' : lance l'utilitaire lftp, exécute les commandes (-c) entre les 2 simples guillemets et quitte l'utilitaire lftp
    set sftp:auto-confirm yes ; : configure le paramètre "auto-confirm" à "yes" pour demander à lftp de répondre "yes" à toutes les questions d'SSH, pour une exécution silencieuse
    open sftp://00.00.00.00 -u identifiantFTP,motDePasseFTP -p 22 ; : se connecte au serveur FTP en SFTP, -u = user,pass -p = port
    mget -E /home/repertoireHebergement/exports_bdd/*.zip -O "/volume1/Backup hébergements/Hébergement 1/Bases de données" ; : lance la copie de tous les fichiers mget du répertoire .../exports_bdd/ matchant le modèle *.zip, -O pour spécifier le répertoire de destination (on utilise les doubles guillemets quand il y a des espaces dans le nom d'un répertoire) et -E pour faire supprimer les fichiers sources une fois copiés
    Cf. documentation de lftp

    Personnalisation : vous devez...
    - Adapter le chemin côté NAS : /volume1/Backup hébergements/Hébergement 1/Bases de données
    - Mettre l'adresse de votre serveur FTP : 00.00.00.00 (une adresse IP comme chez Hostinger ou une URL comme chez OVH)
    - Mettre l'identifiant de votre accès FTP : identifiantFTP
    - Mettre le mot de passe de votre accès FTP : motDePasseFTP
    - Mettre le port de votre accès SFTP : 22 ("22" pour OVH, ou "65002" pour Hostinger par exemple)

Tâche de sauvegarde miroir des fichiers
Pour ce faire, on va ici aussi créer une tâche dédiée :
  • Panneau de configuration > Planificateur de tâches > [Créer] > Tâche planifiée > Script défini par l'utilisateur...
    Image
  • Onglet Général
    - Tâche > Backup fichiers
    - Utilisateur > le compte qui a été utilisé pour créer la structure d'accueil des données (il n'est pas nécessaire d'utiliser "root", c'est même déconseillé à chaque fois que c'est inutile)
    Image
  • Onglet Programmer
    - Exécuter les jours suivants > Quotidienne
    - Première heure d'exécution > 04 : 00 (on la positionne 1h après le rapatriement des bases de données)
    - Fréquence > Chaque jour
    Image
  • Onglet Paramètres de tâche
    - Envoyer les détails d'exécution par e-mail > cocher (optionnel)
    - Courrier électronique > saisir votre adresse email (optionnel)
    - Envoyer les détails d'exécution uniquement lorsque le script se termine de manière anormale > cocher (optionnel)
    - Script défini par l'utilisateur > copier le code suivant qu'il faudra personnaliser (cf. ci-dessous)...

    Code : Tout sélectionner

    lftp -c 'set sftp:auto-confirm yes ; open sftp://00.00.00.00 -u identifiantFTP,motDePasseFTP -p 22 ; mirror -e /home/repertoireHebergement "/volume1/Backup hébergements/Hébergement 1/Fichiers"'
    Si vous ne pouvez vraiment pas utiliser SFTP, voici le code en FTP

    Code : Tout sélectionner

    lftp -c 'set ftp:ssl-allow no ; open ftp://00.00.00.00 -u identifiantFTP,motDePasseFTP ; mirror -e //* "/volume1/Backup hébergements/Hébergement 1/Fichiers"'

    - [OK]
    Image

    Explication : ce script réalise une copie miroir des fichiers de l'hébergement, sur le NAS (commande mirror -e). C'est à dire qu'il ne va pas juste copier tout ce qui se trouve sur l'hébergement, sur le NAS, sinon ça ferait trop de données à copier et par ailleurs les anciens fichiers présents sur le NAS et supprimés sur l'hébergement resteraient présents sur le NAS. Il va copier uniquement ce qui est nouveau ou mis à jour et supprimer ce qui n'existe plus, pour se retrouver au final avec une sauvegarde côté NAS strictement identique à ce qui est présent côté hébergement.

    Explication détaillée du code
    lftp -c '...' : lance l'utilitaire lftp, exécute les commandes (-c) entre les 2 simples guillemets et quitte l'utilitaire lftp
    set sftp:auto-confirm yes ; : configure le paramètre "auto-confirm" à "yes" pour demander à lftp de répondre "yes" à toutes les questions d'SSH, pour une exécution silencieuse
    open sftp://00.00.00.00 -u identifiantFTP,motDePasseFTP -p 22 ; : se connecte au serveur FTP en SFTP, -u = user,pass -p = port
    mirror -e /home/repertoireHebergement "/volume1/Backup hébergements/Hébergement 1/Fichiers" ; : lance une copie miroir entre les 2 répertoires (on utilise les doubles guillemets quand il y a des espaces dans le nom d'un répertoire), -e pour dire de bien supprimer côté NAS les fichiers qui n'existent plus côté hébergement
    Cf. documentation de lftp

    Personnalisation : vous devez...
    - Adapter le chemin côté NAS : /volume1/Backup hébergements/Hébergement 1/Fichiers
    - Mettre l'adresse de votre serveur FTP : 00.00.00.00 (une adresse IP comme chez Hostinger ou une URL comme chez OVH)
    - Mettre l'identifiant de votre accès FTP : identifiantFTP
    - Mettre le mot de passe de votre accès FTP : motDePasseFTP
    - Mettre le port de votre accès SFTP : 22 ("22" pour OVH, ou "65002" pour Hostinger par exemple)

:!: Attention : refaire cette étape autant de fois que vous avez d'hébergements indépendants que vous souhaitez sauvegarder qui possèdent leur propre interface d'admin, leur propre espace FTP, leur propres bases de données et leur propres tâches Cron.

Et voilà, c'est fait !
Votre backup doit maintenant être entièrement automatisé et se dérouler de manière autonome toutes les nuits :
  • entre 1h et 2h du matin, export des bases de données,
  • à 3h du matin, rapatriement des bases de données,
  • et à 4h du matin, rapatriement des fichiers :)

5/ [Optionnel] Sécurisation des connexions à ses hébergeurs via des clés SSH, sans mot de passe
En effet, maintenant que tout fonctionne, il y a encore moyen, si on le souhaite, d'améliorer la sécurité de l'ensemble.
Ca n'est pas obligatoire, la plupart d'entre vous êtes probablement en SFTP à l'issu de ce tuto, ce qui est déjà bien, mais on peut encore faire mieux en se passant totalement de l'emploi de mots de passe dans les commandes LFTP/SFTP. Ils ne seront alors plus visibles en clair dans les scripts et plus envoyés sur le net aux hébergeurs (même cryptés).

Pour ce faire, on va utiliser la technique de l'authentification par clés SSH publique/privée.
Pour faire simple...
  • cela permet de générer une paire de clés cryptées pour le compte utilisateur du NAS qui est utilisé pour les connexions avec les hébergeurs (le compte utilisateur exécutant les tâches planifiées),
  • ces clés seront au nombre de 2, une privée qui restera sur le NAS et ne devra jamais être divulguée, et une publique qui sera installée sur chaque serveur FTP auquel on voudra se connecter en utilisant cette technique,
  • et ça permettra à chaque demande de connexion aux serveurs FTP de ne pas envoyer de mot de passe avec le username, mais juste d'indiquer la clé privée qu'il faudra utiliser en local pour authentifier la connexion.
  • Le serveur distant pourra ainsi utiliser la clé publique installée de son côté pour chiffrer un message de défi envoyé au NAS, ce message sera déchiffré côté NAS à l’aide de la clé privée, puis combiné à un identifiant de session pour être renvoyé au serveur distant et si cette réponse correspond au message de défi envoyé, l'accès aux données sera alors autorisé.
:!: Attention : cette technique ne fonctionne qu'avec les hébergements pour lesquels vous avez le service SSH d'activé, donc pour ceux pour lesquels vous avez pu faire tout le reste du paramétrage de ce tuto en SFTP, pas en FTP !

Voilà.
Maintenant, voyons ça en détail.

Génération d'une paire de clés SSH pour le compte utilisé sur le NAS pour se connecter aux hébergeurs
Pour ce faire, il faut :
  • Activer le SSH sur le NAS (si ce n'est pas déjà fait)
    1. Se connecter au NAS > Panneau de configuration > Terminal & SNMP > Terminal > Activer le SSH : cocher
    2. Remplacer le port par défaut pour garantir un bon niveau de sécurité. Port : choisir n'importe quel port non réservé > [Appliquer]
    Image
    3. Suivre la recommandation d'activer le blocage automatique en cas de tentatives de connexion trop fréquentes.
    Panneau de configuration > Sécurité > Protection > Activer le blocage auto : cocher > [Appliquer]
    Image
    Ces deux mesures de sécurité ne sont vraiment indispensables que si le NAS est accessible depuis Internet, mais les activer ne fait pas de mal et reste une précaution utile dans tous les cas.
  • Activer le "service d'accueil de l'utilisateur" (répertoire homes")
    1. Panneau de configuration > Utilisateur et groupe > Avancé > Activer le service d'accueil de l'utilisateur : cocher > [Appliquer]
    Image
    Ce service crée un répertoire /homes/ à la racine de votre espace de stockage, puis un sous-répertoire par compte utilisateur.
    Ces sous-répertoires utilisateurs seront indispensables au moment de générer les clés, car c'est dans ces répertoires qu'elles seront déposées.
  • Se connecter au NAS en SSH, avec le compte administrateur qui sera utilisé pour exécuter les tâches planifiées
    1. Lancer une application terminal sur votre ordinateur :
    - Windows 10/11 : Windows PowerShell ([Win]+[x] et ensuite [i])
    - macOS : Terminal.app
    - Linux : Terminal
    2. Saisir la commande suivante pour se connecter au NAS et appuyer sur [Entrée]

    Code : Tout sélectionner

    ssh monCompteAdmin@00.00.00.00 -p 0000
    monCompteAdmin = l'identifiant du compte administrateur qui sera utilisé pour exécuter les tâches planifiées (ne pas utiliser "root", c'est inutile, voir déconseillé à chaque fois que c'est inutile)
    00.00.00.00 = l'adresse IP de votre NAS
    0000 = le port que vous avez choisi pour le service SSH (cf. ci-dessus)

    3. Répondre "yes" et appuyer sur [Entrée] pour continuer, si vous êtes notifié que l'authenticité du serveur ne peut être établie (uniquement pour la 1ère connexion, c'est normal car le serveur est inconnu - il sera alors ajouté au fichier "known_host" des serveurs connus)
    4. Saisir votre mot de passe (celui du compte administrateur utilisé pour se connecter), puis [Entrée].
    Image
    Et voilà, vous devriez être connecté au NAS par une liaison cryptée SSH.
  • Générer les clés SSH pour l'utilisateur en cours (celui avec lequel vous venez de vous connecter au NAS en SSH)
    1. Saisir la commande suivante pour demander la création des clés et appuyer sur [Entrée]

    Code : Tout sélectionner

    ssh-keygen -t ed25519 -a 100
    -t = permet de spécifier le type de clé à créer
    ed25519 = ed25519 est le schéma de signature numérique le plus performant du moment, aussi sécurisé que le RSA 4096, mais plus rapide.
    -a 100 = spécifie le nombre d'application de la fonction de dérivation de clé pour une meilleure résistance au déchiffrement par force brute

    2. Appuyer sur [Entrée] pour ne pas modifier le nom de fichier par défaut des 2 clés
    3. Appuyer sur [Entrée] pour ne pas saisir de passphrase (de mot de passe), sinon elle vous serait demandée à la connexion, ce qui n'est pas possible pour un script
    4. Appuyer sur [Entrée] pour confirmer qu'on ne veut pas de passphrase
    Image
    Et voilà, cette fois vous devriez avoir à la racine du volume de stockage de votre NAS, dans le dossier /homes/monCompteAdmin/, un sous-dossier /.ssh/ avec dedans 2 fichiers :
    - id_ed25519 qui est le fichier contenant votre clé privée (à garder strictement confidentielle !)
    - et id_ed25519.pub qui est le fichier contenant votre clé publique (qui sera installée sur les serveurs sur lesquels on voudra se connecter)
  • Sécuriser le dossier /.ssh/ et la clé privée (obligatoire !)
    En effet, en tant que mécanisme de sécurité, SSH est très prudent avec les droits associés aux clés et ne fonctionnera pas sans des droits suffisamment restrictifs. Pour ce faire, il faut donc :
    1. Limiter les droits sur le répertoire /.ssh/ en saisissant la commande suivante et en appuyant sur [Entrée]

    Code : Tout sélectionner

    chmod 700 /var/services/homes/monCompteAdmin/.ssh
    700 = le propriétaire du répertoire a tous les droits dessus, tous les autres utilisateurs n'ont aucun droit, même pas de lecture
    monCompteAdmin = l'identifiant du compte pour lequel vous avez créé les clés SSH

    2. Limiter les droits sur le fichier de la clé privée en saisissant la commande suivante et en appuyant sur [Entrée]

    Code : Tout sélectionner

    chmod 600 /var/services/homes/monCompteAdmin/.ssh/id_ed25519
    600 = le propriétaire du fichier a les droits de lecture/écriture mais le fichier n'est pas exécutable, tous les autres n'ont aucun droit, même pas de lecture
    monCompteAdmin = l'identifiant du compte pour lequel vous avez créé les clés SSH

    Image
Voilà. Cette fois-ci tout l'environnement SSH est prêt côté NAS.

Installation de la clé publique sur ses comptes chez les hébergeurs
Il faut maintenant passer à l'installation de sa clé publique chez les hébergeurs qui hébergent les données que l'on sauvegarde sur le NAS.
Ici la procédure diffère d'un hébergeur à l'autre, donc voici les procédures pour nos 2 exemples :
Chez OVH, pour les offres mutualisées
Pour les offres mutualisées, il n'existe pas dans son manager (son outil d'administration) de fonctionnalité simplifiant l'installation des clés publiques. Il faudra donc l'installer à la main, mais on va voir que ça n'est pas bien compliqué.

Il faudra tout simplement :
  • Se connecter à son hébergement avec un client FTP comme Filezilla,
  • Créer un dossier /.ssh/ dans la racine de son hébergement (dans /home/userOVH/),
  • Donner les droits d'accès (attributs) 700 au dossier /.ssh/,
  • Créer un fichier texte nommé authorized_keys dans le dossier /.ssh/,
  • Donner les droits d'accès (attributs) 600 au fichier authorized_keys,
    Image
  • Et copier/coller le contenu de sa clé publique id_ed25519.pub créée côté NAS (copier tout le texte contenu dans le fichier), dans le fichier authorized_keys sur le serveur FTP OVH.
Chez Hostinger
Chez Hostinger, il faut tout simplement :
  • Se connecter à son hpanel (son outil d'administration),
  • Hébergement > [Gérer],
  • Avancé > Accès SSH > [Ajouter une clé SSH],
  • Donner un nom à cette clé, comme "Clé ed25519 NAS",
  • Copier/coller le contenu de sa clé publique id_ed25519.pub créée côté NAS (copier tout le texte contenu dans le fichier), dans la zone de texte "Clé publique SSH" côté Hostinger,
  • Et cliquer sur [Ajouter une clé SSH] pour valider.
Image

Et voilà, c'était assez simple.
Cette fois-ci, la clé publique est maintenant installée chez les différents hébergeurs et on peut passer à la dernière étape.

Mise à jour des scripts LFTP pour se connecter en utilisant les clés SSH à la place des mots de passe
Rendez-vous côté NAS cette fois, pour 2 petites modifications sur les scripts des 2 tâches planifiées.

Script de sauvegarde des bases de données
  • Se connecter au NAS > Panneau de configuration > Planificateur de tâches > sélectionner la tâche "Backup bases de données" > [Modifier]
  • Remplacer la ligne...

    Code : Tout sélectionner

    lftp -c 'set sftp:auto-confirm yes ; open sftp://00.00.00.00 -u identifiantFTP,motDePasseFTP -p 22 ; mget -E /home/repertoireHebergement/exports_bdd/*.zip -O "/volume1/Backup hébergements/Hébergement 1/Bases de données"'
    ...par la ligne...

    Code : Tout sélectionner

    lftp -c 'set sftp:auto-confirm yes ; set sftp:connect-program "ssh -a -x -i .ssh/id_ed25519" ; open sftp://00.00.00.00 -u identifiantFTP, -p 22 ; mget -E /home/repertoireHebergement/exports_bdd/*.zip -O "/volume1/Backup hébergements/Hébergement 1/Bases de données"'
    En fait, on a juste fait 2 petites modifications en :
    - rajoutant cette commande (qui indique le chemin vers la clé privée à utiliser) : set sftp:connect-program "ssh -a -x -i .ssh/id_ed25519" ;,
    - et en retirant le mot de passe (attention à bien laisser la virgule qui était entre l'identifiant et le mot de passe : identifiantFTP, !).
  • [OK] pour valider
Script de sauvegarde des fichiers
  • Se connecter au NAS > Panneau de configuration > Planificateur de tâches > sélectionner la tâche "Backup fichiers" > [Modifier]
  • Remplacer la ligne...

    Code : Tout sélectionner

    lftp -c 'set sftp:auto-confirm yes ; open sftp://00.00.00.00 -u identifiantFTP,motDePasseFTP -p 22 ; mirror -e /home/repertoireHebergement "/volume1/Backup hébergements/Hébergement 1/Fichiers"'
    ...par la ligne...

    Code : Tout sélectionner

    lftp -c 'set sftp:auto-confirm yes ; set sftp:connect-program "ssh -a -x -i .ssh/id_ed25519" ; open sftp://00.00.00.00 -u identifiantFTP, -p 22 ; mirror -e /home/repertoireHebergement "/volume1/Backup hébergements/Hébergement 1/Fichiers"'
    En fait, on a juste fait 2 petites modifications en :
    - rajoutant cette commande (qui indique le chemin vers la clé privée à utiliser) : set sftp:connect-program "ssh -a -x -i .ssh/id_ed25519" ;,
    - et en retirant le mot de passe (attention à bien laisser la virgule qui était entre l'identifiant et le mot de passe : identifiantFTP, !).
  • [OK] pour valider

Ca y est, cette fois c'est tout bon !
Vous pouvez tester vos scripts avec le bouton [Exécuter], ils devraient maintenant fonctionner en se connectant à vos serveurs FTP sans envoyer de mot de passe (on les a retirés des scripts), uniquement grâce aux clés SSH publique et privée.

Enjoy! :)
L'urgent est fait, l'impossible est en cours, pour les miracles prévoir 24h !
Avatar de l’utilisateur
FTP
Messages : 1028
Inscription : 06 mars 2004 14h41
Contact :

Re: [Synology] Installer un backup automatisé de ses données hébergées, vers son NAS, en SFTP

Message par FTP »

Première mise à jour :)
  • Suppression des recommandations de faire exécuter les 2 tâches sur le NAS par le super utilisateur "root" (inutile dans ce contexte, donc déconseillé)
    Attention : si vous avez déjà mis en place vos sauvegardes en utilisant "root" comme utilisateur exécutant les tâches et que vous souhaitez changer pour votre compte d'admin ordinaire, supprimez d'abord tous les fichiers & sous-dossiers des 2 backup sur le NAS (bases de données et fichiers), changez l'utilisateur exécutant les 2 tâches et relancez les 2 tâches de backup. Sinon vous risquez des erreurs, notamment sur la tâche de sauvegarde des fichiers car elle devrait mettre à jour des fichiers appartenant à "root".
  • Lignes de commande FTP : remplacement des wget par des commandes LFTP mget et mirror pour les harmoniser avec les commandes SFTP
  • Lignes de commande FTP : rajout de la suppression des sauvegardes des bases de données sur le serveur FTP une fois rapatriées sur le NAS (mget -E). Sinon elles s'accumulaient sur le serveur FTP et étaient sauvegardées une seconde fois avec le reste des fichiers.
  • Lignes de commande FTP : correction des chemins cibles sur le serveur distant (utilisation de //)
  • Lignes de commande SFTP : suppression des "quit" en fin de liste de commandes LFTP (inutile quand on utilise -c et de toute façon erroné)
  • Ajout de l'étape 5/ optionnelle, de sécurisation des connexions à ses hébergeurs via des clés SSH, sans mot de passe
L'urgent est fait, l'impossible est en cours, pour les miracles prévoir 24h !
Répondre