Comment sauvegarder en chiffrant dans NextCloud ?

Par @jbnahan69
Photo de l‘intérieur d‘un disque dur à plateaux.
https://www.pxfuel.com/en/desktop-wallpaper-zuvnu

Après les vœux, appliquons nous à cocher un élément dans notre longue liste de choses à faire. Le principe de sauvegarde des données est quelque chose de très répandu. Le principe de sauvegarde 3-2-1 un peu moins, et je ne parle pas de la mise en application. C'est un peu comme pour la mise en place de la 2FA. Personnellement, j'ai les mêmes problèmes que vous pour les sauvegardes perso. La volonté de les réaliser, mais pas toujours le temps ou l'énergie pour m'en occuper. Donc mettons un robot (non pas une IA). Avant d'entrer dans le vif du sujet, je plante un petit décor sur la sauvegarde et le chiffrement. (essayer de lire un peu avant de fuire, histoire de me dire pourquoi ça vous plait pas)

La sauvegarde

Le principe de sauvegarde 3-2-1 est le suivant :

Vous devez avoir au minimum 3 copies des données : une en exploitation et 2 sauvegardes minimum.

Pour ces 2 sauvegardes, au moins une doit être hors du site d'exploitation. Ce qui sous entend pour des serveurs dans un autre centre de données physique.

Ce sont nos données, nous en sommes responsables, alors n'attendons pas qu'un tiers s'en occupe à notre place.

Un autre principe est qu'une sauvegarde n'existe que si la procédure de restauration est exécutée et validée régulièrement. Une sauvegarde qu'il n'est pas possible de restaurer sur un autre ordinateur ne vaut rien. Ca ressemble à des lapalissades mais pourtant ont les entends ceux qui n'ont fait aucune sauvegarde avant le crache, l'incendie ou l'hameçonnage.

Il faut pouvoir récupérer les données mais également les exploiter à nouveau. Une base de données, par exemple, si vous disposez du dump (export d'une base de données) mais pas de l'exécutable capable d'exploiter le dump la sauvegarde est inutile.

Pour valider la sauvegarde, il est nécessaire de réinstaller le serveur, la configuration et les données. Réaliser l'opération permet également de mieux sauvegarder les données nécessaires pour la restauration.

NextCloud

Ce logiciel permet la mise à disposition à distance d'un espace de stockage d'un serveur (et bien d'autres fonctionnalités, mais c'est le stockage qui m'intéresse dans cet article). Vous pouvez l'installer sur votre serveur, ou louer un espace de stockage via un service en ligne ou un hébergeur.

L'espace de stockage est disponible via le protocole WebDav. Ce protocole permet de gérer les fichiers et dossiers en s'appuyant sur le protocole HTTP. Ce qui ne rend facilement utilisable même derrière un proxy. Ce protocole souffre de problèmes de performance dans certains cas d'usage.

Le besoin

Avant de renter dans les détails techniques, de quoi ai-je besoin ?

Pour les besoins de l'article, voici une situation fictive. Toute ressemblance avec une situation existante est probable (la mienne ou la vôtre, qui sait...), continuer la lecture vous apprendrez sûrement quelques choses. J'ai différents serveurs contenant des données à sauvegarder journalièrement. Ces données sont stockées en clair sur le serveur mais il n'est pas envisageable de les sauvegarder sur un espace cloud en clair même sur un espace dédié et protégé. (la protection de votre vie privée est notre bla bla bla...) Les fuites de données sont trop nombreuses et je ne peux pas éviter la sauvegarde en dehors du site d'exploitation.

Les données doivent donc être sauvegardées sur les serveurs distant mais chiffrées avant l'envoi. Vous êtes encore là ? Merci beaucoup, on attaque la partie plus technique, c'est parti.

Le chiffrement

C'est bien de vouloir chiffrer mais quoi choisir ? Chiffrement asymétrique ? Chiffrement symétrique ? Quel protocole ? Quelle longueur de clé ?

Bien qu'incapable de faire les démonstrations mathématiques, j'ai pourtant toujours baigné dans le chiffrement en commençant pas le chiffre César (ROT13) quand j'étais enfant.

Les algorithmes sont bien plus complexes et une simple recherche de fréquence ne suffit plus à casser le chiffrement. Pour revenir à mes sauvegardes, j'ai besoin que les fichiers soient chiffrés avant l'envoie sur l'espace de stockage.

Avec les clés asymétrique (une clé pour chiffrer et une autre clé pour déchiffrer), le fait que la clé privée ne soit pas sur le serveur pour chiffrer les données est très intéressant ! Mais il a un gros défaut, le chiffrement de gros fichier est lent et déconseillé.

Les clés asymétriques les plus courantes sont des clés RSA, et la taille minimale de la clé que j'ai trouvée est de 2048 bits. 

C'est un bon début mais comment chiffrer par exemple un fichier de 200Mo rapidement ? Ce qui ressort très souvent est l'utilisation d'un protocole de chiffrement symétrique. Contrairement à l'asymétrique, une seule clé est nécessaire et c'est très performant pour le chiffrement/déchiffrement.

Mais comment protéger la clé symétrique ? Et bien avec la clé publique de chiffrement asymétrique.

Pour les clés symétriques, l'un des protocoles courant est l'AES (Advanced Encryption Standard) avec des clés de chiffrement de 128 bits.

L'intégrité des données

Qui dit chiffrement, dit également intégrité des données. Et contrairement à ce qui semble logique, ce contrôle d'intégrité est réalisé sur les données chiffrées. Le contrôle d'intégrité est réalisé par une fonction de hachage. Cette fonction réalise des calculs pour donner un résultat non réversible (comme un hachoir à viande) mais, particularité intéressante, elle retourne le même résultat si les données d'entrées sont les mêmes. Ce qui permet de prouver qu'une donnée est la même qu'avant juste en comparant sont hash fournis avec la données et en calculant à nouveau le hash sur les données. S'il correspondent, c'est que la données est bien la même.

Actuellement, la fonction de calcul d'un hash recommandé est SHA-256. Ce qui donne un résultat en 256 bits soit 32 octets.

Donc, lors du chiffrement des données, un hash sera calculé pour permettre la vérification avant le déchiffrement. Cool, les algos sont choisis pour le chiffrement et le hachage, comment les mettre ensemble ? (non, demandé à ChatGPT n'est pas une bonne idée le résultat est plutôt mauvais)

Comment chiffrer ?

Pour pouvoir chiffrer les données correctement, je me suis basé sur des algorithmes existant et utilisés par d'autres outils. Pour chaque fichier, je vais générer une clé de chiffrement AES de 128 bits (16 octets) et un vecteur d'initialisation de la même taille. Avant que j'oublie, le vecteur d'initialisation est une suite d'octets généré aléatoirement avec une fonction cryptographique approuvée. Il servira de point de départ avec la clé pour chiffrer les données et éviter une possible attaque par fréquence.

Que ce passe-t-il pour le chiffrement d'un fichier, la première étape consiste à chiffrer la clé AES spécifique au fichier avec la clé publique RSA 2048 bits. La seconde consiste à chiffrer le fichier en lui-même avec la clé AES. (la version non chiffrée, hein !)

Enfin, le hash est calculé sur les données suivantes : Vecteur d'initialisation + clé AES chiffrée + données chiffrées.

Le fichier résultant contient, en premier le vecteur d'initialisation suivi de la clé AES chiffrée, suivi des données chiffrées et pour finir le résultat de la fonction de hachage.

Explication visuel de l'organisation du fichier

Ainsi, je peux sauvegarder le fichier résultant sur NextCloud. Bravo, vous êtes bien accroché. Maintenant que tout fonctionne pour le mieux, les problèmes vont commencer à arriver...

Pour le choix de la construction cryptographique, je vous laisse choisir après avoir lu les recommandations de l'ANSSI

Les problèmes de performance

Avec le premier fichier un peu lourd que ça commence ! En chiffrant le fichier en un seul morceau, il est nécessaire de pouvoir mettre en mémoire deux fois le fichier (une fois en clair, et une sa version chiffrée). Sur ma machine ça ne pose pas de problème mais certains serveurs n'ont pas beaucoup de ressource. Il est important d'en tenir compte.

Pour pallier ce problème, chaque fichier sera chiffré par morceaux de 32Ko. Chaque bloc aura son propre vecteur d'initialisation pour éviter l'analyse par fréquence car la clé sera la même pour tout le fichier et par conséquent son résultat de hash.

Ainsi, il est possible de chiffrer de gros fichiers avec peu d'utilisation de mémoire.

Illustration du chiffrement de fichier par bloc

Conclusion

Whaou, merci d'avoir lu jusqu'ici, cette histoire de sauvegarde n'est pas terminée ! Comme je disais, les problèmes ne font que commencer ! Suivez-moi sur les réseaux ou je suis disponible pour être averti de la sortie de la suite.

Je retourne écrire mon code et je vous laisse me contacter pour me dire ce que vous en pensez !

 

Les acticles de ce dossier
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