Sauvegarde chiffrée sur un stockage en ligne avec rclone
Introduction
Il y a quelques mois, je vous proposais un article sur comment j’ai mis en place une sauvegarde chiffrée des données de mon serveur perso sur un stockage en ligne chez OVH. Le coeur du système était piloté par Duplicati, un outil de sauvegarde open source que j’apprécie bien, mais que je trouve assez peu pertinent dans le cas présent en fait. Déjà, il ne démarrait pas toujours au reboot du serveur de backup, ce qui me gênait un peu. Ensuite, j’ai eu du mal à être notifié d’une bonne exécution des sauvegardes.
Après quelques recherches, j’ai finalement vu que j’avais déjà tout le nécessaire sans avoir besoin d’ajouter une surcouche (ici : Duplicati). En effet, pour m’interfacer avec mon compte OVH, j’avais utilisé RClone, un outil libre de gestion de compte de stockage Cloud. Il s’avère que celui-ci est parfaitement capable de chiffrer les fichiers lors de l’envoi vers le service en ligne, et de les récupérer proprement. La simplicité de mise en oeuvre en est presque déconcertante comme vous pourrez le voir !
Je ne reviendrai pas sur la configuration initiale de rclone
, tout est dans l’article original à ce sujet. Dans cet article, nous avions uniquement configuré l’accès au BackupStorage comme il est nommé chez OVH. Le principe sera simple : on créé des remotes supplémentaires qui s’appuieront sur le connecteur BackupStorage. Ces remotes seront du type “encrypt”.
Configurer RClone
Création du nouveau remote avec la commande rclone config
.
$ rclone config
Current remotes:
Name Type
==== ====
BackupStorage swift
local local
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q>
Taper “n” pour déclarer un nouveau. Saisissez le choix “10”, pour “Encrypt/Decrypt a remote”.
10 / Encrypt/Decrypt a remote
\ "crypt"
Renseignez maintenant le nom du conteneur qui sera à chiffrer. Il s’agit du conteneur au sein de votre service ObjectStorage. Dans mon cas, j’ai créé un pour le test appelé “testencrypt”. Il est visible via le connecteur BackupStorage, pour y accéder il suffit de le spécifier de la manière suivante : BackupStorage:testencrypt
** See help for crypt backend at: https://rclone.org/crypt/ **
Remote to encrypt/decrypt.
Normally should contain a ':' and a path, eg "myremote:path/to/dir",
"myremote:bucket" or maybe "myremote:" (not recommended).
Enter a string value. Press Enter for the default ("").
remote> BackupStorage:testencrypt
RClone va maintenant demander comment chiffrer les noms de fichiers. Il s’agit là de renommer les fichiers avec une chaine de caractère qui ne sera pas signifiante. Pour ma part, j’ai laissé en “standard”
How to encrypt the filenames.
Enter a string value. Press Enter for the default ("standard").
Choose a number from below, or type in your own value
1 / Encrypt the filenames see the docs for the details.
\ "standard"
2 / Very simple filename obfuscation.
\ "obfuscate"
3 / Don't encrypt the file names. Adds a ".bin" extension only.
\ "off"
filename_encryption> standard
Même chose pour les dossiers si vous en avez, on peut masquer leur nom. J’ai choisi oui, donc “true”.
Option to either encrypt directory names or leave them intact.
Enter a boolean value (true or false). Press Enter for the default ("true").
Choose a number from below, or type in your own value
1 / Encrypt directory names.
\ "true"
2 / Don't encrypt directory names, leave them intact.
\ "false"
directory_name_encryption> true
Rclone demande maintenant la clé de chiffrement des données, communément appelée “passphrase”. Il vous propose d’en générer une ou bien d’en saisir une. J’ai opté pour lui en donner une, générée par Keepass. Je ne saurais que trop vous conseiller de stocker cette info dans un gestionnaire sécurisé de mots de passe. La perte de celle-ci rendra vos données indéchiffrables !
Password or pass phrase for encryption.
y) Yes type in my own password
g) Generate random password
y/g> y
Enter the password:
password:
Confirm the password:
password:
Maintenant, Rclone veut ajouter son grain de sel… Il vous propose de générer un salage en plus du mot de passe pour renforcer la robustesse contre les attaques de type dictionnaire. Cette chaîne de caractère sera ajoutée à la séquence de chiffrement pour augmenter le niveau de sécurité. J’ai opté pour lui laisser m’en fournir une. Avec comme longueur 1024, soit le maximum. Comme la passphrase, il est nécessaire de sauvegarder cette donnée dans un gestionnaire sécurisé !
Password or pass phrase for salt. Optional but recommended.
Should be different to the previous password.
y) Yes type in my own password
g) Generate random password
n) No leave this optional password blank (default)
y/g/n> g
Password strength in bits.
64 is just about memorable
128 is secure
1024 is the maximum
Bits> 1024
Your password is: <written by a cat sleeping on your keyboard>
Use this password? Please note that an obscured version of this
password (and not the password itself) will be stored under your
configuration file, so keep this generated password in a safe place.
y) Yes (default)
n) No
y/n> y
RClone vous affiche ensuite un récap :
Remote config
--------------------
[testencrypt]
type = crypt
remote = BackupStorage:testencrypt
filename_encryption = standard
directory_name_encryption = true
password = *** ENCRYPTED ***
password2 = *** ENCRYPTED ***
--------------------
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d>
Répondre yes pour valider, votre config est faite.
Tester la configuration
Il n’y a pas d’option particulière à spécifier lors de la synchro avec RClone, le remote configuré chiffrera automatiquement les données.
Créons un fichier de test :
$ echo hello > fichier.txt
$ cat test.txt
hello
On envoie le fichier avec la commande rclone copy
. L’argument -P
permet d’afficher l’avancement.
$ rclone copy test.txt testencrypt: -P
Transferred: 0 / 0 Bytes, -, 0 Bytes/s, ETA -
Checks: 1 / 1, 100%
Elapsed time: 0.0s
Si je consulte mon ObjectStorage, je vois qu’il contient ceci : 5vo441jb8rtqh83unst8ocsgbo
. Si je le télécharge et que je l’ouvre, c’est de la bouillie.
$ file 5vo441jb8rtqh83unst8ocsgbo
5vo441jb8rtqh83unst8ocsgbo: data
$ cat 5vo441jb8rtqh83unst8ocsgbo
RCLONE�
��O��ّ黳"��aE<h]y��Y!ק}]B�~*�gZ.�B��-
RClone permet de consulter le stockage distant de manière lisible. Si vous faites rclone ls testencrypt:
:
$ rclone ls testencrypt:
6 test.txt
# consultons le contenu
$ rclone cat testencrypt:test.txt
hello
J’ai effacé le fichier de mon PC, pour le récupérer il me suffit de jouer la commande rclone copy
dans l’autre sens. Le fichier obtenu sera déchiffré en chemin.
$ rm test.txt
$ ls test.txt
ls: cannot access 'test.txt': No such file or directory
$ rclone copy testencrypt:test.txt . -P
Transferred: 6 / 6 Bytes, 100%, 81 Bytes/s, ETA 0s
Transferred: 1 / 1, 100%
Elapsed time: 0.0s
$ ls test.txt
test.txt
Chiffrer la conf RClone
Tout ceci est bien joli, mais la conf RClone reste en clair sur le serveur. Bonne nouvelle, on peut la chiffrer elle aussi ! Pour cela, rappeler la commande rclone config
et choisir “Set configuration password” (s).
Attention ! Ce mot de passe sera demandé systématiquement par RClone. On peut le mettre dans une variable d’environnement temporaire si besoin, mais il convient d’éviter de mettre des caractères spéciaux que le shell pourrait interpréter.
$ rclone config
Current remotes:
Name Type
==== ====
BackupStorage swift
local local
testencrypt crypt
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> s
Your configuration is not encrypted.
If you add a password, you will protect your login information to cloud services.
a) Add Password
q) Quit to main menu
a/q> a
Enter NEW configuration password:
password:
Confirm NEW configuration password:
password:
Password set
Your configuration is encrypted.
c) Change Password
u) Unencrypt configuration
q) Quit to main menu
c/u/q>
Comme toujours, sauvegardez ce password dans votre gestionnaire sécurisé favori. Maintenant, si je veux lire rclone.conf
, c’est de la bouillie.
$ cat rclone.conf
# Encrypted rclone configuration File
RCLONE_ENCRYPT_V0:
Bnm9no8tUoAjsXwzH(....)
Désormais, lorsque vous appellerez la commande rclone config
, il vous demandera le mot de passe de celle-ci. Mais cela peut être un peu fastidieux, donc vous pouvez éventuellement créer une petite fonction pour initialiser une variable d’environnement sur laquelle il s’appuie pour lire le mot de passe.
# rclone demande le mot de passe à chaque fois
$ rclone config
Enter configuration password:
password:
Faisons une petite fonction shell rapide.
$ vi ~/.bashrc
# ajouter à la fin :
function setrclonepasswd {
echo "Provide rclone config password"
read -s RCLONE_CONFIG_PASS
export RCLONE_CONFIG_PASS
}
# sauvegarder et quitter
$ source ~/.bashrc
$ setrclonepasswd
Provide rclone config password
(...)
$ export |grep RCLONE
declare -x RCLONE_CONFIG_PASS="monmotdepasse"
$ rclone config
Current remotes:
Name Type
==== ====
BackupStorage swift
local local
testencrypt crypt
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q>
Et voilà !
De mon côté, dans la mesure où j’exécute les sauvegardes avec Jenkins, il m’a simplement fallu mettre le mot de passe de la config en Secret Text dans son gestionnaire de credentials, puis de le lier à une variable d’environnement dans le job. (Build Environment => Use secret text or file => Binding variable)
Conclusion
Cet apprentissage d’utilisation de RClone m’a permis de revoir mes sauvegardes sur mon stockage chez OVH. Duplicati est un chouette outil, mais je le réserve désormais à un usage Desktop car je ne trouve pas qu’il ait sa place sur un serveur au final. RClone rempli parfaitement son office car il possède aussi une commande sync
permettant de synchroniser le remote avec le contenu local.
En reprenant les deux soucis que j’ai évoqué en introduction, ce simple changement a permis de les résoudre d’une traite :
- rclone n’est pas un service, c’est une commande ad-hoc qu’on appelle à la demande, pas de risque de non réponse
- mes backups sont planifiées et exécutées par Jenkins. Avant, il se contentait de copier les données vers le serveur de backup. Maintenant, il déclenche au passage la commande rclone et me notifie en cas d’échec.
Si vous avez des remarques ou suggestions sur le contenu de cet article, n’hésitez-pas à en discuter :)