Comment utiliser Duplicity avec GPG pour sauvegarder des données sur des espaces DigitalOcean

introduction

Duplicity est un utilitaire de ligne de commande écrit en Python qui produit des volumes tar chiffrés pour le stockage sur un référentiel local ou distant. Il utilise lesGNU Privacy Guard (GPG) pour crypter et signer ses archives et l'algorithme rsync pour créer des sauvegardes incrémentielles et économes en espace. Les sauvegardes peuvent être transmises à différents référentiels, notamment le stockage de fichiers local, les serveurs SFTP ou FTP et les librairies compatibles S3.

Dans ce didacticiel, nous allons installer Duplicity et expliquer comment sauvegarder les données du projet sur DigitalOcean Spaces, un service de stockage d’objets compatible S3. Nous allons créer un référentiel Spaces à cette fin et expliquer comment sauvegarder manuellement des données dans celui-ci. Enfin, nous allons automatiser ce processus en créant un script qui configurera des calendriers de sauvegarde complète incrémentiels et hebdomadaires.

Conditions préalables

Pour ce tutoriel, vous aurez besoin de:

Une fois que vous avez configuré votre espace et ces informations, vous pouvez passer à l’installation de Duplicity.

Installer la duplicité

Pour obtenir une version à jour de Duplicity, nous pouvons l'installer à partir desDuplicity releases Personal Package Archive (PPA):

sudo apt-add-repository ppa:duplicity-team/ppa

Nous installerons également le packagepython-boto pour avoir accès àBoto, un package Python qui fournit des interfaces vers Amazon Web Services. Cela nous aidera à tirer parti de l’interopérabilité de Spaces avec l’API AWS S3. Nous installeronspython-boto à partir des référentiels officiels Ubuntu, car cette version est compatible avec la version de Python fournie avec notre image serveur Ubuntu. Si vous préférez utiliserBoto3, vous pouvez l'installer à partir des sources, bien que la compatibilité des fonctionnalités avec Python 3.3+ soit encore en cours de développement.

En plus depython-boto, nous installerons égalementHaveged, un outil qui nous aidera à générer lesentropy nécessaires pour créer nos clés GPG. Pour créer ces clés, GPG s'appuie sur le niveau d'entropie ou d'imprévisibilité de notre système. L'installation dehaveged nous aidera à accélérer le processus de création de clé.

Avant d'installer ces packages, mettez à jour l'index du référentiel local:

sudo apt-get update

Installez ensuiteduplicity,python-boto ethaveged en tapant:

sudo apt-get install duplicity haveged python-boto

Appuyez sury lorsque vous êtes invité à confirmer l'installation. Duplicity est maintenant installé sur notre système et nous sommes prêts à créer nos dossiers de projet et nos fichiers de configuration.

Création d'un répertoire de sauvegarde

Pour illustrer le fonctionnement du processus de sauvegarde, nous allons créer un répertoire pour nos sauvegardes dans le répertoire de base de notre utilisateur non root, avec quelques exemples de données. Nous appellerons notre répertoiresammy_backups:

mkdir ~/sammy_backups

Ensuite, créez un exemple de fichier de projet appeléhistorical_sharks.txt:

echo "The ancient Megalodon shark reached lengths of up to 59 feet, and is widely regarded as one of history's most fearsome predators." >> ~/sammy_backups/historical_sharks.txt

Avec notre répertoire de sauvegarde et nos données de test en place, nous sommes prêts à générer une clé GPG pour notre utilisateur non root.

Génération de clés GPG

Ensuite, nous allons générer une paire de clés GPG pour notre utilisateur. Pour assurer la transmission sécurisée des informations, GPG utilise le cryptage à clé publique. Dans notre contexte, cela signifie que les données seront chiffrées dans notre clé publique et envoyées dans notre référentiel. Pour en savoir plus sur les clés GPG et le chiffrement, consultez notre tutoriel surHow To Use GPG to Sign and Encrypt Messages.

Nos trousseaux de clés seront stockés sur notre compte utilisateur dans un répertoire appelé~/.gnupg, qui sera créé lors de la génération des clés. Lorsque nous utilisons la commandeduplicity, nous spécifierons un identifiant de clé publique qui pointe vers notre paire de clés. L'utilisation de cet identifiant active le cryptage des données et la signature qui vérifie notre propriété de la clé privée. Les données cryptées seront transmises à notre référentiel, où il sera difficile d'en déduire beaucoup plus que la taille et le temps de téléchargement des fichiers eux-mêmes. Cela protège vos données, que notre utilisateur peut restaurer intégralement à tout moment avec la clé privée.

GPG doit être installé sur notre serveur par défaut. Pour tester ceci, tapez:

gpg --version

Une fois que vous avez vérifié que GPG est installé, vous pouvez générer une paire de clés comme suit:

gpg --gen-key

Une série de questions vous sera posée pour configurer vos clés:

  • Type de clé. Sélectionnez(1) RSA and RSA (default).

  • Taille de la clé. Appuyez surENTER pour confirmer la taille par défaut des bits de2048.

  • Date d'expiration de la clé. En entrant1y, nous allons créer une clé qui expire après un an.

  • Confirmez vos choix. Vous pouvez le faire en entranty.

  • ID utilisateur / vrai nom. Entrezyour name.

  • Adresse e-mail Entrezyour email address.

  • Commentaire. Ici, vous pouvez entrer unoptional comment qui sera visible avec votre signature.

  • Changer (A), © omment, (E) mail ou (O) kay / (Q) uit? TapezO si vous êtes prêt à continuer.

  • Entrez la phrase secrète. Il vous sera demandé de saisir ici unpassphrase. Be sure to take note of this passphrase. Nous y renverrons tout au long de ce tutoriel sous le nom deyour-GPG-key-passphrase.

Après avoir créé ces paramètres,gpg générera les clés en fonction du niveau d'entropie dans le système. Puisque nous avons installéhaveged, nos clés doivent être générées très rapidement ou immédiatement. Vous verrez une sortie comprenant les éléments suivants:

Output...
gpg: /home/sammy/.gnupg/trustdb.gpg: trustdb created
gpg: key your-GPG-public-key-id marked as ultimately trusted
public and secret key created and signed.
...

Prenez note deyour-GPG-public-key-id, car nous l'utiliserons dans la section suivante pour configurer nos variables d'environnement local.

Création de sauvegardes manuelles

Nous allons maintenant définir des variables d'environnement afin de ne pas avoir besoin de saisir d'informations confidentielles sur la ligne de commande lors de l'exécution de la commandeduplicity. Ces variables seront disponibles pour notre utilisateur au cours de notre session en cours et nous les stockerons dans un répertoire caché afin qu'elles soient disponibles pour une utilisation ultérieure. Les variables dontduplicity aura besoin, que nous définirons comme variables d'environnement, incluent notre clé d'accès et notre secret d'espaces, ainsi que notre ID de clé publique GPG et notre phrase de passe.

Commençons par créer un répertoire caché dans le répertoire de base de notre utilisateur qui contiendra le fichier de configuration:

mkdir ~/.duplicity

Ensuite, créons un fichier appelé.env_variables.conf pour définir nos variables, ce que nous ferons en utilisant les instructionsexport. Ces instructions mettront les variables à la disposition des programmes pour une utilisation ultérieure. Ouvrez le fichier en tapant:

nano ~/.duplicity/.env_variables.conf

Dans le fichier, définissez votre clé d'accès et votre secret Spaces, ainsi que votre ID et clé secrète de clé publique GPG:

~/.duplicity/.env_variables.conf

export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
export GPG_KEY="your-GPG-public-key-id"
export PASSPHRASE="your-GPG-key-passphrase"

Enregistrez et fermez le fichier lorsque vous avez terminé.

Nous pouvons maintenant définir des autorisations sur le fichier pour garantir que seul notre utilisateur non root actuel dispose d'un accès en lecture et en écriture:

chmod 0600 ~/.duplicity/.env_variables.conf

Rendre ces variables disponibles pour une utilisation dans la session Bash en cours en tapant:

source ~/.duplicity/.env_variables.conf

Ensuite, nous exécuteronsduplicity pour créer une sauvegarde manuelle complète de notre répertoire~/sammy_backups. L'exécution deduplicity sans l'actionfull créera une sauvegarde complète initiale, suivie de sauvegardes incrémentielles. Nous créerons une sauvegarde complète lors de notre première utilisation de la commande, mais si vous souhaitez créer une autre sauvegarde manuelle complète de ce répertoire, vous devrez spécifier l'actionfull.

Les autres options que nous définirons dans notre commande incluent:

  • --verbosity: Cela spécifiera le niveau d'information que nous souhaitons dans notre sortie. Nous allons spécifierinfo, qui fournira plus de détails que le paramètre par défautnotice.

  • --encrypt-sign-key: Cela dira àduplicity de chiffrer la clé publique dans la paire que nous avons identifiée avecyour-GPG-public-key-id dans la variableGPG_KEY. Il indiquera également àduplicity d'utiliser le même identifiant pour activer la fonction de signature.

  • --log-file: Cette option spécifie un emplacement pour les fichiers journaux qui seront également disponibles pour d'autres programmes. Cela nous donnera un endroit simple à regarder au cas où nous aurions besoin de dépanner. Nous allons spécifier l'emplacement du fichier journal comme/home/sammy/.duplicity/info.log.

Enfin, nous spécifierons le répertoire que nous sauvegardons et notre point de terminaison du référentiel. Nous allons sauvegarder le répertoire~/sammy_backups dans le répertoire personnel de notre utilisateur. Notre référentiel sera notre Espace, que nous définirons à l'aide des informations suivantes:s3://spaces_endpoint/bucket_name/. Vous pouvez déterminer votre point de terminaison et le nom de votre compartiment comme suit: si l'URL de votre espace esthttps://sammys-bucket.nyc3.digitaloceanspaces.com, alorssammys-bucket est le nom de votre compartiment etnyc3.digitaloceanspaces.com est votre point de terminaison.

Notre commandeduplicity ressemblera finalement à ceci:

duplicity --verbosity info --encrypt-sign-key=$GPG_KEY --log-file /home/sammy/.duplicity/info.log /home/sammy/sammy_backups \
s3://nyc3.digitaloceanspaces.com/sammys-bucket/

Après avoir exécuté cette commande, nous verrons la sortie comme suit:

Output...
--------------[ Backup Statistics ]--------------
StartTime 1522417021.39 (Fri Mar 30 13:37:01 2018)
EndTime 1522417021.40 (Fri Mar 30 13:37:01 2018)
ElapsedTime 0.01 (0.01 seconds)
SourceFiles 2
SourceFileSize 4226 (4.13 KB)
NewFiles 2
NewFileSize 4226 (4.13 KB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 2
RawDeltaSize 130 (130 bytes)
TotalDestinationSizeChange 955 (955 bytes)
Errors 0
-------------------------------------------------

Pour vérifier que les fichiers téléchargés sur votre espace comme prévu, vous pouvez accéder à vosSpaces page in the DigitalOcean control panel pour vérifier qu'ils s'y trouvent.

Restauration de fichiers

Pour vérifier que nous pouvons restaurer nos données, nous allons maintenant supprimer notre fichier exemple et le restaurer à partir de notre référentiel. Pour restaurer des fichiers avec Duplicity, nous pouvons utiliser l'option--file-to-restore. Il est également nécessaire d'inverser l'ordre des éléments dans notre commandeduplicity: l'URL de notre référentiel servira désormais d'origine, et notre répertoire de sauvegarde sera la destination de notre fichier restauré.

Supprimez le fichier en tapant:

rm ~/sammy_backups/historical_sharks.txt

Vérifiez que le fichier a bien été supprimé:

cat ~/sammy_backups/historical_sharks.txt

Vous devriez voir la sortie suivante:

Outputcat: /home/sammy/sammy_backups/historical_sharks.txt: No such file or directory

Ensuite, restaurons ce fichier à partir de notre espace. L'option--file-to-restore nous permet de spécifier le chemin du fichier que nous souhaitons restaurer. Ce chemin doit être relatif au répertoire que nous avons sauvegardé; dans notre cas, notre chemin relatif serahistorical_sharks.txt. Nous inverserons également l'ordre de notre URL d'espace et de notre répertoire de sauvegarde pour indiquer que nous restaurons le fichier à partir de notre référentiel:

duplicity --verbosity info --encrypt-sign-key=$GPG_KEY --log-file /home/sammy/.duplicity/info.log --file-to-restore historical_sharks.txt \
s3://nyc3.digitaloceanspaces.com/sammys-bucket /home/sammy/sammy_backups/historical_sharks.txt

Vous verrez une sortie comme celle-ci:

Output...
Processing local manifest /home/sammy/.cache/duplicity/d9911d387bb9ee345a171141106ab714/duplicity-full.20180402T170008Z.manifest (195)
Found 1 volumes in manifest
Deleting /tmp/duplicity-e66MEL-tempdir/mktemp-_A24DP-6
Processed volume 1 of 1

Exécuter à nouveaucat affichera le contenu du fichierhistorical_sharks.txt restauré:

cat ~/sammy_backups/historical_sharks.txt
OutputThe ancient Megalodon shark reached lengths of up to 59 feet, and is widely regarded as one of history's most fearsome predators.

Maintenant que nous avons créé une sauvegarde manuelle du répertoire~/sammy_backups et restauré les données de notre référentiel, nous sommes prêts à passer à l'automatisation du processus de sauvegarde.

Automatisation des sauvegardes

L'automatisation du processus de sauvegarde peut aider à garantir que les données de notre répertoire~/sammy_backups restent récupérables et à jour. Nous pouvons utiliser le planificateur de travaux decronpour créer une planification de sauvegarde qui comprendra une sauvegarde complète chaque semaine et des sauvegardes incrémentielles dans le cas contraire. Pour en savoir plus sur l'utilisation decron pour planifier des tâches, consultez notre tutoriel surHow To Schedule Routine Tasks With Cron and Anacron on a VPS.

Commençons par créer un script de sauvegarde dans notre répertoire~/.duplicity:

nano ~/.duplicity/.backup.sh

Dans ce fichier, nous allons d’abord spécifier que ce script sera exécuté par le shell Bash:

~/.duplicity/.backup.sh

#!/bin/bash

Ensuite, nous allons créer une variableHOME à utiliser avec nos commandessource etduplicity. Assurez-vous de remplacer le nom d'utilisateur, le répertoire de sauvegarde et le nom du compartiment mis en surbrillance par vos informations:

~/.duplicity/.backup.sh

...
HOME="/home/sammy"

source "$HOME/.duplicity/.env_variables.conf"

duplicity \
    --verbosity info \
    --encrypt-sign-key="$GPG_KEY" \
    --full-if-older-than 7D \
    --log-file "$HOME/.duplicity/info.log" \
    /home/sammy/sammy_backups \
    s3://nyc3.digitaloceanspaces.com/sammys-bucket/

Les commandessource etduplicity font ici le même travail que lorsque nous avons créé notre sauvegarde manuelle:source charge nos variables d'environnement dans le contexte actuel, tandis queduplicity crée des volumes tar à envoyer à notre référentiel. Nos options restent toutes les mêmes, à l'exception de l'ajout de l'option--full-if-older-than. Définie à7D, cette option spécifie qu'une sauvegarde complète aura lieu chaque semaine, une fois que la dernière sauvegarde complète aura plus de sept jours.

Les derniers éléments de notre script seront les commandesunset qui supprimeront nos variables d'environnement par mesure de sécurité:

~/.duplicity/.backup.sh

...
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset GPG_KEY
unset PASSPHRASE

Le script complet ressemblera à ceci:

~/.duplicity/.backup.sh

#!/bin/bash

HOME="/home/sammy"

source "$HOME/.duplicity/.env_variables.conf"

duplicity \
    --verbosity info \
    --encrypt-sign-key="$GPG_KEY" \
    --full-if-older-than 7D \
    --log-file "$HOME/.duplicity/info.log" \
    /home/sammy/sammy_backups \
    s3://nyc3.digitaloceanspaces.com/sammys-bucket/

unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset GPG_KEY
unset PASSPHRASE

Lorsque vous êtes satisfait du script, vous pouvez enregistrer et fermer le fichier. Nous allons également définir des autorisations pour nous assurer que seul notre utilisateur actuel non-sudo aura la possibilité de lire, écrire et exécuter le fichier:

chmod 0700 ~/.duplicity/.backup.sh

Enfin, nous pouvons automatiser notre planification de sauvegarde en éditant le fichiercrontab de notre utilisateur. Ouvrez ce fichier pour le modifier en tapant:

crontab -e

Comme il s’agit de notre première édition de ce fichier, il nous sera demandé de choisir un éditeur:

crontab

no crontab for root - using an empty one
Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.basic
  4. /usr/bin/vim.tiny
Choose 1-4 [2]:
...

Vous pouvez sélectionner2 pour nano, ou saisir le numéro correspondant à l'éditeur de votre choix.

Au bas du fichier, nous allons ajouter une ligne pour spécifier la fréquence d'exécution de notre script. Pour tester ses fonctionnalités, nous pouvons définir notre intervalle de temps sur deux minutes comme suit:

crontab

...

*/2 * * * * /home/sammy/.duplicity/.backup.sh

Enregistrez et fermez le fichier. Après deux minutes, vous pouvez accéder à vosSpaces page in the DigitalOcean control panel, où vous devriez voir les fichiers de sauvegarde incrémentielle. Vous pouvez maintenant modifier le fichiercrontab pour spécifier l'intervalle de temps que vous souhaitez utiliser pour vos sauvegardes incrémentielles.

Conclusion

Dans ce didacticiel, nous avons expliqué comment sauvegarder le contenu d'un répertoire spécifique dans un référentiel Spaces. À l'aide d'un fichier de configuration permettant de stocker les informations de notre référentiel, nous avons créé une sauvegarde manuelle de nos données, que nous avons testée en restaurant un fichier exemple, ainsi qu'un programme de sauvegarde automatisé.

Pour plus d'informations sur la duplicité, vous pouvez consulter lesproject website ainsi que lesduplicity man page. Cette documentation couvre les nombreuses fonctionnalités de Duplicity et offre des conseils sur la création de sauvegardes système complètes.