Sauvegarde sur NextCloud, la mise en prod !

Par @jbnahan69
Nuage dans le ciel qui forme le mot “Backup“
https://www.pxfuel.com/en/desktop-wallpaper-zuvhf

Revenons à notre projet de sauvegarde sur NextCloud après la technique de débug des dépréciations trop nombreuses. La première partie de cet article a été publiée fin janvier 2023. Je vous présentais le besoin et toute la partie technique du logiciel de sauvegarde écrit avec le langage de programmation Rust.

J'avais fini par une amélioration de la façon de chiffrer les gros fichiers pour éviter de surcharger la mémoire du serveur. Alors, que s'est t'il passé après ça ? Ha tiens, GLIBC !

GLIBC 2.29

Pour l'instant,  je réalise tous les tests depuis mon ordinateur de développement qui fonctionne sur Win... Non, GNU/Linux et plus précisément, la distribution Linux Mint (très bien pour les débutants ça ressemble à Windows).

J'apprécie particulièrement d'être sur les dernières mises à jour. Et là ça va me poser problème...

Quand je compile il utilise les versions des librairies installées sur le système. Et, manque de change pour moi, la librairie GLIBC est trop récente par rapport au serveur qui fonctionne sur GNU/Linux Debian 10. Le serveur dispose de GLIBC 2.28 ! Oui, un problème d'une version mineure m'empêche de construire mon binaire pour le serveur.

Je demande à Google comment compiler en limitant la version utilisable GLIBC à la version 2.28, mais rien n'y fait.

Fatigué de ces déconvenues, j'ouvre VirtualBox et je tombe sur une machine Debian 10, tien comme le serveur !

Je la démarre, met à jour, installe Rust, charge le projet, et lance la compilation.

Et là comme par magie (c'est jamais de la magie en informatique) le nouveau binaire fonctionne sur le serveur.

Mais revenons un peux plus tôt dans l'histoire de cet outil, au moment ou il a fallu expérimenter le chiffrement des fichiers. Au début, j'ai écrit le programme en...

La version en PHP

PHP. Dès le début, je voulais écrire ce programme avec le langage Rust. Ca me semble plus logique pour ce type de programme mais également je souhaitais le réutiliser.

Mais, pour expérimenter il n'est pas recommandé d'utiliser un langage non maîtrisé. J'ai donc utilisé le PHP pour expérimenter le chiffrement.

L'implémentation du chiffrement ne fût pas difficile en soit mais j'ai dû apprendre à générer un nombre non signé de 64bits. Merci Julien Pauli pour ta conférence du Forum PHP 2018 sur le chiffrement, j'ai trouvé la solution dedans.

Pour valider que le chiffrement se passe bien, il faut déchiffrer le fichier puis comparer les sommes de contrôle de l'original et du fichier déchiffré.

Là encore, j'ai utilisé PHP pour déchiffrer le fichier. Malheureusement pour moi, rien ne s'est passé comme prévu, le fichier est resté illisible jusqu'au moment où j'ai compris que le résultat du chiffrement de la clé symétrique AES du fichier (128 bits) était de la même longueur que la clef asymétrique (4096 bits).

Pour m'en apercevoir, j'avais ajouté des log de partout, les clés et vecteurs d'initialisation étaient affiché dans la console sans aucune protection. Ne reproduisez surtout pas ça chez vous et surtout ne laissez jamais une copie des clés de chiffrement dans les logs !

A la fin, j'ai réussi à déchiffrer le premier fichier chiffré. Le problème venait de la procédure de déchiffrement (donc le fichier chiffré était intègre).

Revenons maintenant au moment où j'ai enfin réussi à exécuter le programme écrit en Rust sur le serveur.

Première exécution

Il est maintenant possible de configurer l'application, je commence par générer une clé de chiffrement asymétrique sur mon ordinateur local et j'ai envoyé la clé publique sur le serveur. Il n'est pas nécessaire d'avoir la clé privée pour la réalisation des sauvegardes.

Je fais ensuite l'inventaire des dossiers contenant les fichiers à sauvegarder, et je les configure.

Je saisis les informations d'identification pour le serveur distant puis je tente une première exécution.

Tout semble fonctionner correctement. Du premier coup ? Étrange.

En regardant sur NextCloud, pourtant aucune données ! Après 2 minutes, je trouve les données, elles sont bien là.

La sauvegarde peut continuer. Mais pendant le temps d'exécution de la sauvegarde, je vais commencer la vérification.

Validation de la sauvegarde

Je télécharge les derniers fichiers sauvegardés sur mon ordinateur.

J'installe l'exécutable, la configuration, la clé privée, le mot de passe de la clé privée et enfin je suis prêt.

De retour sur le navigateur je clique machinalement sur le nom de l'une des archives et le gestionnaire d'archives ouvre le fichier. Comme ça, aucune erreur. J'ai une sueur froide d'un coup. En une fraction de seconde, j'ai un horrible doute, les sauvegardes sont parties en clair...

Je tente de décompresser l'archive: une erreur. J'essaie à nouveau en utilisant Nautilus, pareils : erreurs. Ça va un peu mieux.

Je vais dans le terminal et, j'exécute la commande de déchiffrement, tout se passe bien.

Je calcule la somme de contrôle du fichier, c'est bien la même que celle du serveur, ouf les données sont biens déchiffrées, et toutes les sauvegardes sont bien envoyées chiffrées. La pression redescend.

Je peux donc programmer l'exécution du programme pour que les sauvegardes soient envoyées régulièrement sur le serveur NextCloud. Me voilà avec une sauvegarde hors du serveur.

Conclusion

Cette aventure m'a permis de me remettre dans le Rust pour mettre en place une sauvegarde simple de fichier. Si ce programme vous intéresse, n'hésitez pas à me contacter.

J'ai également appris que réaliser une première mouture avec un langage de programmation maîtrisé est primordial. J'ai pu utiliser le premier fichier chiffré avec PHP comme test pour mon programme en Rust et j'ai pu utilisé le programme en PHP pour vérifier le chiffrement réalisé en Rust.

J'ai pu écrire la procédure de récupération des données et leur déchiffrement.

J'ai également constaté qu'il serait bien de pouvoir télécharger un fichier de sauvegarde depuis NextCloud directement depuis le serveur. Mais bon, ça sera pour un peu plus tard.

Qu'avez-vous pensez de ces articles ? Donnez-moi votre avis par le formulaire de contact où les réseaux sociaux.

Author avatar
Jean-Baptiste Nahan

Consultant Expert Web, j'aide les entreprises ayant des difficultés avec leur projet Web (PHP, Symfony, Sylius).

@jbnahan69 | Macintoshplus | Linkedin | JB Dev Labs