PGP, ou plutôt OpenPGP, est un standard de chiffrement pour les communications, en particulier utilisé pour les emails.

Nous allons voir dans ce billet comment utiliser GnuPG, une implémentation libre du standard OpenPGP, pour générer une clé et l’importer ensuite sur une clé YubiKey.

Ce billet est inspiré de cet excellent guide que je vous invite à lire.

Installation de Tails

Il est vivement recommandé d’utiliser une distribution Live pour générér la clé afin d’éviter tout risque.
La meilleure solution est d’installer Tails.

Pour vérifier l’ISO téléchargé n’oubliez pas d’importer la clé utilisée pour signer la signature d’image ISO :

gpg --import tails-signing.key
gpg --no-options --keyid-format 0xlong --verify tails-amd64-3.10.1.iso.sig tails-amd64-3.10.1.iso

Une fois Tails installée démarrez en activant l’accès root (en ajoutant une option supplémentaire sur l’écran de configuration de Tails), cela vous permettra d’installer les paquets nécessaires.

Mettez à jour la liste des paquets et installez les paquets nécessaires :

sudo apt-get update
sudo apt-get install -y \
    gnupg2 gnupg-agent \
    cryptsetup scdaemon pcscd \
    yubikey-personalization \
    dirmngr \
    secure-delete

Vérifiez que l’entropie de votre système soit suffisante :

cat /proc/sys/kernel/random/entropy_avail

Une valeur supérieure à 2000 est suffisante.
Si ce n’est pas le cas essayez d’installer rng-tools.

Création des clés

Générez un répertoire de travail temporaire pour GnuPG :

export GNUPGHOME=$(mktemp -d)
cd $GNUPGHOME

Téléchargez le fichier de configuration de GnuPG disponible ici.

wget https://raw.githubusercontent.com/drduh/config/master/gpg.conf

Utilisez le navigateur Tor pour le télécharger si le téléchargement avec wget ne fonctionne pas.

Vous pouvez désormais vous déconnecter du réseau pour la suite.

Clé principale

Nous allons tout d’abord créer la clé principale.
Elle sera uniquement utilisée pour certifier les autres clés que nous utiliserons au quotidien.

Créez une nouvelle clé RSA de signature d’une longueur de 4096 bits sans date d’expiration et entrez vos informations personnelles :

gpg --expert --full-generate-key

Exportez l’identifiant de la clé afin de pouvoir le réutiliser plus tard :

export KEYID=0x<ID>

Sous-clés

Nous allons ensuite générer trois sous-clés d’une longueur de 4096 bits et d’une durée de validité d’un an (vérifiez que votre YubiKey supporte bien cette longueur, les clés NEO ne supportent que des clés d’une taille de 2048 bits maximum).
Pensez à noter dans votre agenda de renouveller vos sous-clés dans 11 mois

Éditez votre clé maîtresse :

gpg --expert --edit-key $KEYID

Demandez à ajouter une clé RSA de signature avec la commande addkey.

Créez ensuite une clé RSA de chiffrement en utilisant à nouveau addkey.

Enfin créez une clé RSA d’authentification, toujours en utilisant addkey.
Attention : GnuPg ne propose pas la possibilité de créer une clé d’authentification directement. Il faut donc indiquer que l’on souhaite créer une clé RSA avec des possibilités personnalisées.
Par défaut GnuPG proposera une clé de signature et de chiffrement. Désactivez ces possibilités et activez à la place l’authentification.

Enfin sauvegardez vos changements avec la commande save.

Vérifiez que vos quatre clés sont bien présentes :

gpg --list-secret-keys

Enfin vérifiez la bonne configuation de vos clés :

gpg --export $KEYID | hokey lint

Sauvegarde des clés

Nous allons à présent sauvegarder les clés sur une clé USB chiffrée.

Commencez par les exporter :

gpg --armor --export-secret-keys $KEYID > $GNUPGHOME/mastersub.key
gpg --armor --export-secret-subkeys $KEYID > $GNUPGHOME/sub.key

Puis branchez une clé USB vide, effacez sa table de partition avec fdisk :

sudo fdisk /dev/sdc
o (pour créer une table de partitions DOS)
w (pour sauvegarder et quitter)

Réinsérez la clé USB et créez une partition :

sudo fdisk /dev/sdc
n (laissez les options par défaut, partition primaire n°1 occupant tout l'espace disponible)
w

Chiffrez la partition avec LUKS :

sudo cryptsetup luksFormat /dev/sdc1

Montez la partition :

sudo cryptsetup luksOpen /dev/sdc1 usb

Et créez un système de fichiers :

sudo mkfs.ext4 /dev/mapper/usb -L usb (permet de nommer la clé "usb")

Enfin montez la partition et copiez le répertoire de GnuPG :

sudo mount /dev/mapper/usb /mnt
sudo cp -avi $GNUPGHOME /mnt

Terminez en démontant la partition :

sudo umount /mnt
sudo cryptsetup luksClose usb

Configuration de la YubiKey

Insérez votre YubiKey et éditez la en tant que smart card :

gpg --card-edit

La première étape à réaliser est de renseigner les codes PIN utilisateur et administrateur :

admin
passwd
3 (pour changer le PIN administrateur par défaut, 12345678)
1 (pour changer le PIN utilisateur par défaut, 123456)
q (pour quitter)
name (pour renseigner le "surname", nom de famille, et le "given name", le prénom)
lang (pour renseigner la langue, fr par exemple)
login (pour indiquer l'adresse email)
quit

Éditez votre clé :

gpg --edit-key $KEYID

Sélectionnez la première clé, celle de signature :

key 1

Et exportez la sur la carte :

keytocard

note : la clé exportée sur la carte sera supprimée de votre trousseau GnuPG

Désélectionnez la première clé, sélectionnez la deuxième, celle de chiffrement, et exportez la :

key 1
key 2
keytocard

Enfin exportez la troisième clé, celle d’authentification et sauvegardez :

key 2
key 3
keytocard
save

Vérifiez que les clés ont bien été exportées sur la YubiKey :

gpg --list-secret-keys

les clés privées sont indiquées par le libellé ssb>

Nettoyage

Exportez votre clé publique sur une autre clé USB :

gpg --armor --export $KEYID > /mnt/public-usb-key/pubkey.txt

Vérifiez que les points suivants ont bien été faits :

  • Sauvegarde de la clé de signature, de chiffrement et d’authentification sur la YubiKey
  • Mémorisation des codes PIN de la YubiKey (utilisateur et administrateur)
  • Mémorisation de la phrase de passe de la clé principale
  • Sauvegarde de la clé principale et des sous-clés sur une clé USB chiffrée
  • Mémorisation de la phrase de passe de la clé USB chiffrée
  • Sauvegarde de la clé publique

Supprimez de manière sécurisée le répertoire de travail de GnuPG :

sudo srm -r $GNUPGHOME

Redémarrez et lancez votre système d’exploitation habituel.

Utilisation des clés

Configurez à nouveau GnuPG (en utilisant le fichier d’exemple disponible ici).

Importez votre clé publique :

gpg --import /mnt/pubkey.txt

Puis éditez là afin d’indiquer que vous faites confiance à cette clé avec le niveau maximum :

gpg --edit-key 0x<ID>
trust
5
save

Insérez votre YubiKey et vérifiez son statut :

gpg --card-status

Le libellé sec# indique que la clé principale n’est pas disponible.
C’est normal puisqu’elle doit uniquement être conservée sur votre clé USB chiffrée.

Chiffrement

Vous pouvez tester le chiffrement d’un message avec la clé publique :

echo "Hello, world!" | gpg --encrypt --armor --recipient 0x<ID>

Puis son déchiffrement :

gpg --decrypt --armor

Cette fois le code PIN de votre YubiKey sera demandée.

Signature

Vous pouvez également tester la signature d’un message avec la clé de signature :

echo "Hello, world!" | gpg --armor --clearsign --default-key 0x<ID SIGN>

Et vérifier la signature :

gpg (copiez la signature puis CTRL+D)

Authentification

Pour terminer vous pouvez également utiliser la clé d’authentification afin de vous authentifier à SSH en utilisant l’agent fourni par GnuPG.
L’article mentionné en début de billet contient toutes les informations pour sa mise en place.