Sauvegarde

Ubuntu 20.04 – Réalisez une sauvegarde chiffrée de vos données avec GnuPG

Dans cet article, nous allons voir comment réaliser une sauvegarde de vos données en créant une archive chiffrée avec GnuPG. Le chiffrement sera asymétrique (une paire de clés publique et privée) et nous aborderons une façon atypique de sécuriser et de sauvegarder votre paire de clés. La restauration sera aussi traitée car celle-ci reste évidemment la pierre angulaire d’une bonne sauvegarde.

1 – Prérequis

  • Vous devez disposer d’Ubuntu 20.04 en version Desktop, Server ou ARM (Raspberry Pi). Si vous disposez d’une version antérieure, vous pouvez mettre à jour votre système en suivant cette procédure.
  • Votre utilisateur doit avoir accès à sudo.
  • Vos dépôts APT doivent être à jour. Dans le doute, tapez la commande suivante :
    sudo apt-get update

2 – Sauvegarde et création de l’archive

  1. Rendez-vous dans votre dossier personnel et créez le répertoire backup dédié à la sauvegarde :

    cd
    mkdir backup
    cd backup
  2. Créez l’archive compressée avec bzip2 en modifiant /directory/to/backup/ par le chemin absolu de votre dossier à sauvegarder :

    tar cjvf backup.tar.bz2 -C /directory/to/backup .
    Une archive backup.tar.bz2 compressée avec bzip2 est générée. Attention, l’utilisateur exécutant la commande tar doit bien évidemment avoir les droits de lecture sur le dossier à sauvegarder.
  3. Vous pouvez vérifier l’archive générée en affichant la liste des fichiers composant l’archive :

    tar -jtvf backup.tar.bz2

3 – Création des clés de chiffrement

Nous allons utiliser l’outil GnuPG pour chiffrer l’archive, à l’instar de OpenSSL, qui a présenté certaines failles critiques ces dernières années. GnuPG permet la création, l’échange et la vérification des paires de clés, le chiffrement et le déchiffrement de fichiers, et pour finir l’authentification avec signatures numériques.

Dans un système à clé publique, chaque utilisateur possède une paire de clés constituée d’une clé privée et d’une clé publique. La clé privée de l’utilisateur est gardée secrète, elle ne doit pas être révélée. La clé publique peut être distribuée à toute personne avec qui l’utilisateur souhaite communiquer.

  1. Créez une nouvelle paire de clés (une clé publique et une clé privée) en tapant la commande suivante :

    gpg --full-generate-key
    gpg (GnuPG) 2.2.19; Copyright (C) 2019 Free Software Foundation, Inc.
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    
    gpg: directory '/home/howto/.gnupg' created
    gpg: keybox '/home/howto/.gnupg/pubring.kbx' created
    Please select what kind of key you want:
       (1) RSA and RSA (default)
       (2) DSA and Elgamal
       (3) DSA (sign only)
       (4) RSA (sign only)
      (14) Existing key from card
    Your selection? 1

    Choisissez le type de clé par défaut (1).

    RSA keys may be between 1024 and 4096 bits long.
    What keysize do you want? (3072) 4096

    Choisissez la taille de clé maximale soit 4096.

    Requested keysize is 4096 bits
    Please specify how long the key should be valid.
             0 = key does not expire
          <n>  = key expires in n days
          <n>w = key expires in n weeks
          <n>m = key expires in n months
          <n>y = key expires in n years
    Key is valid for? (0) 0

    Choisissez une paire de clés qui n’expire jamais.

    Key does not expire at all
    Is this correct? (y/N) y

    Vérifiez et validez vos choix.

    GnuPG needs to construct a user ID to identify your key.
    
    Real name: James GOSLING
    Email address: james@gosling.com
    Comment: 
    You selected this USER-ID:
        "James GOSLING <james@gosling.com>"
    
    Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O

    Saisissez vos informations et validez avec O.

    
                ┌──────────────────────────────────────────────────────┐                                       
                │ Please enter the passphrase to                       │                                       
                │ protect your new key                                 │                                       
                │                                                      │                                       
                │ Passphrase: ________________________________________ │                                       
                │                                                      │                                       
                │       <OK>                              <Cancel>     │                                       
                └──────────────────────────────────────────────────────┘

    Entrez un mot de passe fort pour protéger votre clé privée.

    We need to generate a lot of random bytes. It is a good idea to perform
    some other action (type on the keyboard, move the mouse, utilize the
    disks) during the prime generation; this gives the random number
    generator a better chance to gain enough entropy.

    Enfin comme l’outil l’indique, tapez au clavier ou déplacez votre souris pour générer des nombres aléatoires.

    gpg: /home/howto/.gnupg/trustdb.gpg: trustdb created
    gpg: key **************** marked as ultimately trusted
    gpg: directory '/home/howto/.gnupg/openpgp-revocs.d' created
    gpg: revocation certificate stored as '/home/howto/.gnupg/openpgp-revocs.d/*****************************.rev'
    public and secret key created and signed.
    
    pub   rsa4096 YYYY-MM-DD [SC]
          ****************************************
    uid                      James GOSLING <james@gosling.com>
    sub   rsa4096 YYYY-MM-DD [E]
  2. Vérifiez que votre clé ait bien été générée en tapant la commande :

    gpg --list-keys
    gpg: checking the trustdb
    gpg: marginals needed: 3  completes needed: 1  trust model: pgp
    gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
    /home/user/.gnupg/pubring.kbx
    ------------------------------
    pub   rsa4096 YYYY-MM-DD [SC]
          ****************************************
    uid           [ultimate] James GOSLING <james@gosling.com>
    sub   rsa4096 YYYY-MM-DD [E]

4 – Chiffrement de l’archive à sauvegarder

  1. Chiffrez l’archive :

    gpg --symmetric --cipher-algo aes256 backup.tar.bz2

    Après avoir saisi votre passphrase à deux reprises, Un fichier backup.tar.bz2.gpg est créé. Celui-ci est votre archive de sauvegarde chiffrée, vous pouvez désormais la copier sur un périphérique externe ou l’envoyer sur un serveur dédié ou votre cloud préféré.

5 – Génération du MD5 de l’archive à sauvegarder

Calculer une signature MD5 à partir de votre archive permet de lui attribuer une empreinte unique. Cette signature vous permettra de vérifier l’intégrité de votre archive lors d’une restauration future.

Générez le MD5 avec la commande suivante :

md5sum backup.tar.bz2.gpg > backup.tar.bz2.gpg.md5

6 – Restauration d’une sauvegarde chiffrée

  1. Vérifiez l’intégrité de l’archive en comparant la signature MD5 de l’archive avec la valeur contenue dans le fichier backup.tar.bz2.gpg.md5 avec la commande suivante :

    md5sum -c backup.tar.bz2.gpg.md5

    Si les deux signatures sont identiques, vous obtiendrez sur la sortie standard :

    backup.tar.bz2.gpg: OK
  2. Déchiffrez l’archive en tapant les commandes suivantes :

    gpg -o backup.tar.bz2 -d backup.tar.bz2.gpg
  3. Décompressez l’archive :

    tar -xf backup.tar.bz2

7 – Sauvegarde de votre paire de clés

7.1 – La clé publique

Vous devez tout d’abord identifier l’ID de votre clé publique en tapant la commande suivante :

gpg --list-key --keyid-format long
/home/user/.gnupg/pubring.kbx
------------------------------
pub   rsa4096/4242424242424242 YYYY-MM-DD [SC]
      ****************************************
uid                 [ultimate] James GOSLING <james@gosling.com>
sub   rsa4096/61C9483C90C1E31E YYYY-MM-DD [E]
  • pub : clé publique
  • rsa4096 : méthode de chiffrement et taille de votre clé en bits
  • 4242424242424242 : ID de la clé
  • 2018-06-25 : date de création de la clé
  • James GOSLING : nom du propriétaire de la clé
  • <james@gosling.com> : email du propriétaire de la clé

Backup sur support…

Exécutez la commande suivante pour exporter votre clé publique dans un fichier pubring.gpg en remplaçant 4242424242424242 par l’ID de votre clé :

gpg --export 4242424242424242 > pubring.gpg

La clé publique pubring.gpg peut être directement copiée vers votre cloud ou périphérique de sauvegarde.

Backup sur un serveur de clés…

Votre clé publique n’ayant pas besoin d’être gardée secrète, il peut être intéressant de passer par un serveur de clés en plus de réaliser un backup sur clé USB / disque dur.
L’utilisation d’un serveur facilite la récupération et l’échange de clés, il peut aussi être utile si la clé est sujette à modification. Il est possible de modifier la date d’expiration, de révoquer (annuler) la clé ou d’ajouter sa signature à une clé publique.

Si vous vous inquiétez de la disponibilité de ces serveurs, sachez que la plupart des serveurs de clés sont synchronisés entre eux, ce qui veut dire que, si nous envoyons une clé à un serveur, elle sera répliquée sur les autres serveurs.

Envoyez votre clé publique en tapant la commande suivante et en remplaçant 4242424242424242 par l’ID de votre clé :

gpg --keyserver eu.pool.sks-keyservers.net --send-keys 4242424242424242
gpg: sending key 4242424242424242 to hkp://eu.pool.sks-keyservers.net

Il est possible de visualiser la clé publique sur un des serveurs de clés comme http://pool.sks-keyservers.net/. Lors de la recherche par ID de votre clé, il est nécessaire de préfixer l’ID de la clé publique par 0x. Donc si l’ID de la clé publique est 4242424242424242, il vous faudra rechercher 0x4242424242424242.

7.2 – La clé privée

Affichez votre clé privée avec la commande suivante :

gpg --list-secret-keys --keyid-format long
gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
/home/user/.gnupg/pubring.kbx
------------------------------
sec   rsa4096/4242424242424242 YYYY-MM-DD [SC]
      762E5A0DB94C5D4079D82C2514CCC0685B24B528
uid           [ultimate] James GOSLING <james@gosling.com>
ssb   rsa4096/S27DG72G72DG72D7 YYYY-MM-DD [E]

Backup sur support…

Exécutez la commande suivante pour exporter votre clé privée dans un fichier secring.gpg en remplaçant 4242424242424242 par l’ID de votre clé :

gpg --export-secret-key 4242424242424242 > secring.gpg

La clé privée secring.gpg peut être directement copiée vers votre cloud ou périphérique de sauvegarde.

Backup sur papier

Outre la recommandation de sauvegarder votre clé privée sur un support physique tel qu’une clé USB ou un disque dur, ou encore d’exporter votre clé dans un cloud ou sur un autre serveur dédié, il peut être aussi intéressant de créer un QR code de votre clé privée, de l’imprimer et le mettre dans un endroit sûr (comme chez vous par exemple !). En effet, le papier peut être facilement détruit mais peut aussi perdurer très longtemps, bien plus que les périphériques magnétiques ou optiques que nous utilisons généralement pour sauvegarder nos données numériques.

Nous allons utiliser l’outil Paperkey permettant d’exporter sa clé privée dans un format qui convient à l’impression sur papier. Paperkey permet aussi de réduire la taille de votre clé privée en prélevant les « octets secrets » de celle-ci. En effet chaque clé secrète contient une copie complète de votre clé publique.

    • Installez les paquets paperkey, qrencode et imagemagick :

      sudo apt-get install -y paperkey qrencode imagemagick
    • Exportez votre clé privée au format binaire (raw) permettant de réduire la taille de celle-ci et convertissez la en base64 pour obtenir des caractères lisibles nécessaires à la création du QR Code :

      gpg --export-secret-key 4242424242424242 | paperkey --output-type raw | base64 > secring.txt
    • Pour comprendre la suite de ce tutoriel, il est nécessaire de présenter brièvement les QR Codes. Un QR Code est un type de code-barres en deux dimensions (ou code matriciel datamatrix) constitué de modules noirs disposés dans un carré à fond blanc. L’agencement de ces points définit l’information que contient le code. Il existe 40 versions de QR Code, de la plus petite (version 1) pouvant contenir au maximum 17 octets à la plus grande (version 40) pouvant contenir au maximum 2 953 octets.

      Si votre clé est chiffrée sur 4 096 bits, il est fort probable que celle-ci soit trop large pour tenir dans un QR Code. Vous pouvez afficher le nombre d’octets de votre clé privée grâce à la commande wc -m :

      wc -m secring.txt 
      3680 secring.txt

      Pour contourner cette limite, nous allons créer plusieurs QR Codes contenant chacun une partie de votre clé privée. Dans l’exemple précédent, la clé privée était composée de 3 660 octets, il est donc facile de voir que la clé privée peut être contenue dans deux QR Codes. Cependant, vous allez obtenir deux QR Codes (version 40) avec de grandes résolutions difficilement lisibles par votre smartphone ou webcam. Pour être facilement lisible par un de vos périphériques, il est recommandé de ne pas créer des QR Codes supérieurs à la version 20. Sachant que celle-ci ne peut contenir que 858 octets au maximum, votre clé privée sera donc composée de 5 QR Codes.

      Mais nous n’allons pas nous arrêter là… Les QR Codes utilisent le système Reed-Solomon pour la correction d’erreur : le code contient par défaut 7% de redondance (niveau L). Nous allons spécifier le taux de redondance maximum que permet un QR Code, à savoir 30% (niveau H). Avec un tel taux de redondance, le nombre d’octets maximum stockable dans un QR Code de niveau 20 passe de 828 octets à 382. Votre clé privée sera donc constituée de 10 QR Codes. Vu que ces QR Codes sont destinés à être imprimés, nous allons aussi spécifier une résolution plus importante, à savoir 300dpi au lieu de 72 par défaut :

      cat secring.txt | qrencode -Sv20 -lH -dpi=300 -o secring.png

      10 fichiers PNG sont générés : secring-01.png, , etc. Chacun de ces fichiers représente un QR code.

    • Pour faciliter l’impression nous allons concaténer l’ensemble des QR Codes sur 3 colonnes et générer une seule image, puis nous allons convertir cette image au format PDF :

      montage -mode concatenate -tile 3x secring-*.png secring.png
      convert secring.png -page A4 secring.pdf

      Si vous obtenez l’erreur suivante :

      convert-im6.q16: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.

      Vous devez modifier le fichier /etc/ImageMagick-6/policy.xml et supprimer les lignes suivantes en toute fin de fichier :

        <!-- disable ghostscript format types -->
        <policy domain="coder" rights="none" pattern="PS" />
        <policy domain="coder" rights="none" pattern="PS2" />
        <policy domain="coder" rights="none" pattern="PS3" />
        <policy domain="coder" rights="none" pattern="EPS" />
        <policy domain="coder" rights="none" pattern="PDF" />
        <policy domain="coder" rights="none" pattern="XPS" />

      Relancez ensuite la commande précédente.

Vous pouvez désormais imprimer le document secring.pdf et le placer dans un endroit sûr. Les QR Codes se lisent de gauche à droite, puis de haut en bas.

Il est fortement recommandé de faire un test d’importation de votre clé privée pour vérifier la qualité de votre impression et de comparer la clé privée d’origine à celle importée.

8 – Restauration de votre paire de clés

8.1 – Restaurer la clé publique

Si votre clé publique est copiée directement d’un disque dur ou clé USB de backup, il est juste nécessaire d’importer la clé avec la commande suivante :

gpg --import pubring.gpg

Importer la clé publique d’un serveur de clés avec la commande suivante :

gpg --keyserver eu.pool.sks-keyservers.net --recv 4242424242424242

Si la clé est importée avec succès, vous obtiendrez sur la sortie standard :

gpg: keyring `/home/user/.gnupg/secring.gpg' created
gpg: requesting key 4242424242424242 from hkp server pool.sks-keyservers.net
gpg: key 4242424242424242: public key "James GOSLING <james@gosling.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

8.2 – Restaurer la clé privée

Il est nécessaire d’importer la clé publique avant de tenter d’importer la clé privée.

…d'un support physique

Si votre clé privée est copiée directement d’un disque dur ou clé USB de backup, il est juste nécessaire d’importer la clé avec la commande suivante :

gpg --import secring.gpg

…d'une feuille de papier

Si l’import se fait à partir des QR Codes, il est nécessaire d’installer une application permettant de lire les QR Codes sur votre smartphone.

  • Les QR Codes se lisent de gauche à droite, et de haut en bas. Pour chaque QR Code lu, copiez le contenu dans le presse-papier, email ou tout autre outil de votre smartphone et concaténez le tout. N’insérez aucun saut de ligne entre chaque QR Code…
  • Importez les données concaténées sur le nouveau serveur dans un fichier secring_base64.txt.
  • Installez l’outil paperkey sur le nouveau serveur :

    sudo apt-get install paperkey
  • Importez la clé privée avec la commande suivante :

    cat secring_base64.txt | base64 -d | paperkey --pubring pubring.gpg --input-type raw | gpg --import
    gpg: key 4242424242424242: secret key imported
    gpg: key 4242424242424242: "James GOSLING <james@gosling.com>" not changed
    gpg: Total number processed: 1
    gpg:              unchanged: 1
    gpg:       secret keys read: 1
    gpg:   secret keys imported: 1

En cas d'erreur…

Si vous obtenez l’erreur suivante lors de l’import de la clé privée :

gpg: key 4242424242424242/4242424242424242: error sending to agent: Inappropriate ioctl for device
gpg: error building skey array: Inappropriate ioctl for device
  • Ajoutez les deux lignes suivantes dans le fichier ~/.gnupg/gpg.conf (le créer si celui-ci n’existe pas) :

    use-agent 
    pinentry-mode loopback
  • Ajoutez la ligne suivante dans le fichier ~/.gnupg/gpg-agent.conf (le créer si celui-ci n’existe pas) :

    allow-loopback-pinentry
  • Redémarrez l’agent avec la commande suivante :

    echo RELOADAGENT | gpg-connect-agent
  • Tentez à nouveau l’import avec la commande :

    cat secring_base64.txt | base64 -d | paperkey --pubring pubring.gpg --input-type raw | gpg --import

Ubuntu 20.04 Servergpg (GnuPG) 2.2.19
tar (GNU tar) 1.30
paperkey 1.6-1
qrencode 4.0.2-2
imageMagick 6.9.10.23

0 réponses

Laisser un commentaire

Participez-vous à la discussion?
N'hésitez pas à contribuer!

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *