OpenPGP - Exporter les clefs secrètes sur une Yubikey

OpenPGP - Exporter les clefs secrètes sur une Yubikey


Nous avons vu dans l'article précedent la génération de clefs OpenPGP. Pour rappel, nous avons dans notre trousseau de clefs privées gpg :

wilson@spaceship:~$ gpg2 --list-secret-keys sec# rsa4096/1A8132B1 2017-10-05 [C] [expires: 2018-10-05] uid [ultimate] Wilson Eleven <wilson.eleven@labs.com> ssb rsa4096/B73A9C79 2017-10-05 [E] [expires: 2018-10-05] ssb rsa4096/9CC8B2FB 2017-10-05 [S] [expires: 2018-10-05] ssb rsa4096/8047B454 2017-10-05 [A] [expires: 2018-10-05]

Nous avons également exporté les clefs dans des fichiers :

  • 1A8132B1.priv.asc : contient toutes les clefs privées
  • 1A8132B1.pub.asc : contient toutes les clefs publiques
  • 1A8132B1.sub_priv.asc : contient uniquement les clefs privées des sous-clefs

Avec cette configuration, nous avons une stratégie efficace contre le vol ou la perte de la clef privée qui sert à la certification. Si un attaquant venait à s'emparer de l'ordinateur, il ne pourra pas certifier d'autre clef. Cependant, les clefs privées qui permettent de signer, chiffrer et s'authentifier sont encore présentes sur l'ordinateur. Donc, en cas de vol des clefs, il serait possible de signer des messages pendant un certains temps (le temps que la sous-clef dérobée soit révoquée).

Pour contrer cette attaque, il est possible de placer les clefs privées dans une carte à puce (smart card). Ces dispositifs sont très résistants à des techniques d'extraction de clef. En plus des attaques physiques, il y a un code pin avec 3 essais uniquement. Ensuite, elle se bloque.

Nous allons voir dans cet article l'export des clefs privées des sous-clefs dans une carte à puce. Pour cet exemple, je vais utiliser une Yubikey 4.

Yubikey, qu'est ce que c'est ?

Yubikey est un dispositif de la taille d'une clef usb classique. Cette clef permet d'effectuer la double authentification sur des sites web, tel que Google ou Github. Ainsi, si une personne est en possession de l'email et du mot de passe de la victime, l'attaquant ne pourra pas se connecter sans cette clef usb. C'est le principe de la double authentification, il faut être en possession de deux secrets.

La Yubikey implémente un protocole ouvert : universal 2nd factor.

En plus de ce principal protocole, elle en supporte d'autres : OpenPGP, TOTP, HOTP, défi-réponse.

Celui qui va nous intéresser est OpenPGP.

Comment s'en procurer une

Je vous recommande de passer par la boutique officielle pour s'assurer de la provenance du produit. Nous sommes sur des produits liés à la sécurité, il est important de savoir d'où provient le produit acheté.

Pour ceux qui ont un compte Github, il y a une offre promotionelle qui permet d'avoir -10% sur le panier. Intéressant :). Par contre, elle n'est valable qu'une seule fois. Je vous recommande d'en commander au moins 2. La deuxième sera utile pour faire une sauvegarde en cas de perte de la première.

Dernier point important, notre clef OpenPGP a été générée avec une taille de 4096 bits. Seule la version 4 de la Yubikey permet d'enregistrer des clefs de cette taille. La version 3 et la NEO, et ne supporte que des clefs de 3072 bits au maximum.

Installons les outils nécessaires

Pour rappel, nous avons commencé notre génération de clef OpenPGP avec une machine sous Ubuntu 16.04 et GnuPG 2.1.11. Pour pouvoir faire l'export des clefs vers la Yubikey, nous devons installer des outils supplémentaires.

wilson@spaceship:~$ sudo apt-get install -y gnupg-agent pinentry-curses scdaemon pcscd yubikey-personalization libusb-1.0-0-dev

Personnaliser la Yubikey avec gpg

Avant d'utiliser la Yubikey, vérifer que la bande de garantie ne soit pas altérée. Si c'est le cas, ne pas l'utiliser.

Insérer la Yubikey dans un port USB et taper la commande suivante pour vérifier que la carte est bien reconnue.

wilson@spaceship:~$ gpg2 --card-status Reader ...........: 1050:0407:X:0 Application ID ...: D2760001240102010006064764950000 Version ..........: 2.1 Manufacturer .....: Yubico Serial number ....: 06476495 Name of cardholder: [not set] Language prefs ...: [not set] Sex ..............: unspecified URL of public key : [not set] Login data .......: [not set] Signature PIN ....: not forced Key attributes ...: rsa2048 rsa2048 rsa2048 Max. PIN lengths .: 127 127 127 PIN retry counter : 3 0 3 Signature counter : 0 Signature key ....: [none] Encryption key....: [none] Authentication key: [none] General key info..: [none]

La carte est vierge, il n'y aucune information personnelle. Il est recommandé de compléter les informations au cas où une personne retrouve cette clef.

Éditons la carte et passons en mode admin. Vous pouvez entrer help pour avoir la liste des commandes disponibles.

wilson@spaceship:~$ gpg2 --card-edit gpg/card> admin Admin commands are allowed

Nous allons tout d'abord changer le code PIN d'administration de la clef et le code PIN utilisateur. Par défaut, le code PIN de l'administrateur est 12345678 et 123456 pour le code PIN utilisateur.

Le PIN administrateur est requis pour quelques opérations sur la carte (l'export de clef par exemple), et pour débloquer quand un code PIN a été entré 3 fois par erreur.

Entrer passwd pour les changer. Commençons par le PIN administrateur et ensuite le PIN utilisateur.

gpg/card> passwd
gpg: OpenPGP card no. D2760001240102010006064764950000 detected

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection? 3
PIN changed.

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection? 1
PIN changed.

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection? q
gpg/card>

Ensuite, entrer les informations pour personnaliser votre clef :

gpg/card> name Cardholder's surname: Wilson Cardholder's given name: Eleven Editer la clef gpg/card> lang Language preferences: fr gpg/card> login Login data (account name): wilson.eleven@labs.com gpg/card> sex Sex ((M)ale, (F)emale or space): m gpg/card> quit

La clef est a présent configurée. Nous pouvons exporter les clefs privées des sous-clefs dans la carte à puce.

Exporter les clefs vers la Yubikey

L'objectif est de déplacer les clefs secrètes des sous-clefs dans la Yubikey. Pour cela, nous allons séléctionner chaque sous-clef une par une avec la commande key n et la déplacer dans la carte avec keytocard. À la fin, il n'y aura plus aucun secret dans le trousseau de clef gpg.

Éditons la clef.

wilson@spaceship:~$ gpg2 --expert --edit-key 1A8132B1 gpg (GnuPG) 2.1.11; Copyright (C) 2016 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. Secret key is available. pub rsa4096/1A8132B1 created: 2017-10-05 expires: 2018-10-05 usage: C trust: ultimate validity: ultimate ssb rsa4096/B73A9C79 created: 2017-10-05 expires: 2018-10-05 usage: E ssb rsa4096/9CC8B2FB created: 2017-10-05 expires: 2018-10-05 usage: S ssb rsa4096/8047B454 created: 2017-10-05 expires: 2018-10-05 usage: A [ultimate] (1). Wilson Eleven <wilson.eleven@labs.com> gpg>

Exportons la clef de chiffrement B73A9C79.

gpg> key 1 pub rsa4096/1A8132B1 created: 2017-10-05 expires: 2018-10-05 usage: C trust: ultimate validity: ultimate ssb* rsa4096/B73A9C79 created: 2017-10-05 expires: 2018-10-05 usage: E ssb rsa4096/9CC8B2FB created: 2017-10-05 expires: 2018-10-05 usage: S ssb rsa4096/8047B454 created: 2017-10-05 expires: 2018-10-05 usage: A [ultimate] (1). Wilson Eleven <wilson.eleven@labs.com>

Le petit astérisque devant l'empreinte de la clef indique qu'elle est sélectionnée.

Entrer keytocard pour l'exporter vers la Yubikey. Ensuite, taper 2 qui est l'unique choix. La Yubikey peut stocker les 3 types de sous-clefs.

gpg> keytocard Please select where to store the key: (2) Encryption key Your selection? 2 pub rsa4096/1A8132B1 created: 2017-10-05 expires: 2018-10-05 usage: C trust: ultimate validity: ultimate ssb* rsa4096/B73A9C79 created: 2017-10-05 expires: 2018-10-05 usage: E card-no: 0006 06476495 ssb rsa4096/9CC8B2FB created: 2017-10-05 expires: 2018-10-05 usage: S ssb rsa4096/8047B454 created: 2017-10-05 expires: 2018-10-05 usage: A [ultimate] (1). Wilson Eleven <wilson.eleven@labs.com>

gpg va vous demander le mot de passe de la clef secrète de chiffrement et ensuite le code pin d'administration de la clef Yubikey. Une fois le code pin d'administration de la Yubikey entré, la clef secrète de chiffrement est bien dans la Yubikey. Nous pourrons le vérifier juste après avoir déplacé les deux autres clef.

Séléctionnons la clef de signature. Il faut désélectionner la première clef et séléctionner la seconde.

gpg> key 1 pub rsa4096/1A8132B1 created: 2017-10-05 expires: 2018-10-05 usage: C trust: ultimate validity: ultimate ssb rsa4096/B73A9C79 created: 2017-10-05 expires: 2018-10-05 usage: E card-no: 0006 06476495 ssb rsa4096/9CC8B2FB created: 2017-10-05 expires: 2018-10-05 usage: S ssb rsa4096/8047B454 created: 2017-10-05 expires: 2018-10-05 usage: A [ultimate] (1). Wilson Eleven <wilson.eleven@labs.com> gpg> key 2 pub rsa4096/1A8132B1 created: 2017-10-05 expires: 2018-10-05 usage: C trust: ultimate validity: ultimate ssb rsa4096/B73A9C79 created: 2017-10-05 expires: 2018-10-05 usage: E card-no: 0006 06476495 ssb* rsa4096/9CC8B2FB created: 2017-10-05 expires: 2018-10-05 usage: S ssb rsa4096/8047B454 created: 2017-10-05 expires: 2018-10-05 usage: A [ultimate] (1). Wilson Eleven <wilson.eleven@labs.com> gpg>

La seconde clef est bien séléctionnée car il y a la petite astérisque devant la clef 9CC8B2FB.

Répétons l'opération. Il faudra sélectionner 1 car c'est une clef de signature.

gpg> keytocard Please select where to store the key: (1) Signature key (3) Authentication key Your selection? 1 pub rsa4096/1A8132B1 created: 2017-10-05 expires: 2018-10-05 usage: C trust: ultimate validity: ultimate ssb rsa4096/B73A9C79 created: 2017-10-05 expires: 2018-10-05 usage: E card-no: 0006 06476495 ssb* rsa4096/9CC8B2FB created: 2017-10-05 expires: 2018-10-05 usage: S ssb rsa4096/8047B454 created: 2017-10-05 expires: 2018-10-05 usage: A [ultimate] (1). Wilson Eleven <wilson.eleven@labs.com> gpg>

C'est ok pour la seconde clef. Répéter avec la troisième.

gpg> key 2 pub rsa4096/1A8132B1 created: 2017-10-05 expires: 2018-10-05 usage: C trust: ultimate validity: ultimate ssb rsa4096/B73A9C79 created: 2017-10-05 expires: 2018-10-05 usage: E card-no: 0006 06476495 ssb rsa4096/9CC8B2FB created: 2017-10-05 expires: 2018-10-05 usage: S ssb rsa4096/8047B454 created: 2017-10-05 expires: 2018-10-05 usage: A [ultimate] (1). Wilson Eleven <wilson.eleven@labs.com> gpg> key 3 pub rsa4096/1A8132B1 created: 2017-10-05 expires: 2018-10-05 usage: C trust: ultimate validity: ultimate ssb rsa4096/B73A9C79 created: 2017-10-05 expires: 2018-10-05 usage: E card-no: 0006 06476495 ssb rsa4096/9CC8B2FB created: 2017-10-05 expires: 2018-10-05 usage: S ssb* rsa4096/8047B454 created: 2017-10-05 expires: 2018-10-05 usage: A [ultimate] (1). Wilson Eleven <wilson.eleven@labs.com> gpg> keytocard Please select where to store the key: (3) Authentication key Your selection? 3 pub rsa4096/1A8132B1 created: 2017-10-05 expires: 2018-10-05 usage: C trust: ultimate validity: ultimate ssb rsa4096/B73A9C79 created: 2017-10-05 expires: 2018-10-05 usage: E card-no: 0006 06476495 ssb rsa4096/9CC8B2FB created: 2017-10-05 expires: 2018-10-05 usage: S ssb* rsa4096/8047B454 created: 2017-10-05 expires: 2018-10-05 usage: A [ultimate] (1). Wilson Eleven <wilson.eleven@labs.com> gpg>

Nous avons terminé. Taper save et quit.

Vérifions que nous n'avons plus aucune clef secrète dans notre trousseau de clefs gpg.

wilson@spaceship:~$ gpg2 --list-secret-keys /home/wilson/.gnupg/pubring.gpg -------------------------------- sec# rsa4096/1A8132B1 2017-10-05 [C] [expires: 2018-10-05] uid [ultimate] Wilson Eleven <wilson.eleven@labs.com> ssb> rsa4096/B73A9C79 2017-10-05 [E] [expires: 2018-10-05] ssb> rsa4096/9CC8B2FB 2017-10-05 [S] [expires: 2018-10-05] ssb> rsa4096/8047B454 2017-10-05 [A] [expires: 2018-10-05]

Le chevron > devant ssb indique que la clef secrète n'existe pas pour cette clef. C'est un bouchon.

Vérifions que ces clefs secrètes sont bien dans la Yubikey.

wilson@spaceship:~$ gpg2 --card-status Reader ...........: 1050:0407:X:0 Application ID ...: D2760001240102010006064764950000 Version ..........: 2.1 Manufacturer .....: Yubico Serial number ....: 06476495 Name of cardholder: Eleven Wilson Language prefs ...: fr Sex ..............: male URL of public key : [not set] Login data .......: wilson.eleven@labs.com Signature PIN ....: not forced Key attributes ...: rsa4096 rsa4096 rsa4096 Max. PIN lengths .: 127 127 127 PIN retry counter : 3 0 3 Signature counter : 0 Signature key ....: 49B7 73DB 292F 8A66 C254 AC97 69FE 9865 9CC8 B2FB created ....: 2017-10-05 11:39:18 Encryption key....: 88CD 3F3C BA60 1AFD D0A6 22E9 FE2B A21E B73A 9C79 created ....: 2017-10-05 11:36:19 Authentication key: 0E2F 255E DE28 F044 474D E571 F000 F81C 8047 B454 created ....: 2017-10-05 11:43:21 General key info..: sub rsa4096/9CC8B2FB 2017-10-05 Wilson Eleven <wilson.eleven@labs.com> sec# rsa4096/1A8132B1 created: 2017-10-05 expires: 2018-10-05 ssb> rsa4096/B73A9C79 created: 2017-10-05 expires: 2018-10-05 card-no: 0006 06476495 ssb> rsa4096/9CC8B2FB created: 2017-10-05 expires: 2018-10-05 card-no: 0006 06476495 ssb> rsa4096/8047B454 created: 2017-10-05 expires: 2018-10-05 card-no: 0006 06476495

Nous retrouvons bien les informations personnelles dans la première partie. Ensuite, il y a les informations sur les clefs présentes dans la Yubikey.

Nous voyons qu'il y a le chevron > devant ssb. Comme vu plus haut, cela indique l'absence de la clef secrète dans le trousseau de clefs. Mais juste en dessous, il y a une ligne supplémentaire qui permet de dire à gpg où trouver la clef secrète. Ici, nous avons le numéro de série de la Yubikey card-no: 0006 06476495. Ce numéro de série est également imprimé sur la clef physiquement. Si vous avez plusieurs Yubikey, il sera facile de retrouver celle que vous cherchez.

Conclusion

À travers ces deux premiers articles, nous avons couvert la création d'une clef OpenPGP et l'exportation des secrets sur une carte à puce. L'utilisation d'une carte à puce permet une protection supplémentaire contre le vol des clefs secrètes. Il ne suffira pas de pirater l'ordinateur pour les voler, mais il sera nécessaire de voler physiquement la clef et le code PIN associé pour utiliser les clefs secrètes. De plus, comme vu en introduction, la clef secrète ne peut être extraite. Notre clef est bien protégée, sauf contre le facteur humain qui reste la seule menace.

Par ailleurs, vous pouvez diffuser votre clef publique sur un serveur de clefs et d'autre services (GitHub, Kraken, keybase.io). Cela vous permet de recevoir des messages chiffrés, et de signer vos commits sur GitHub (exemple sur ce commit 31dd621).

Dans un prochain article, nous allons mettre en place une stratégie de sauvegarde en cas de perte des clefs secrètes. Une erreur peut vite arriver, comme formater son ordinateur suite à un ransonware (ce qui est d'actualité en ce moment).

Article en relation

Resources

Remarques

Ce tutoriel utilise une Yubikey pour le stockage des secrets. La Yubikey est la clef la plus répandue dans le grand public, notamment pour la fonctionnalité de second facteur d'authentification. Il existe d'autre clefs supportant OpenPGP comme la NitroKey. Contrairement à la Yubikey, la NitroKey est open-source. Une sécurité avec du matériel fermé et propriétaire n'est pas une solution viable sur le long terme. C'est également contraire à l'esprit OpenPGP qui se veut être ouvert. Cepedant, j'ai fait le choix de la Yubikey pour sa facilité de mise en oeuvre et sa capacité à faire de la double authentification.

Auteur(s)

Thierry T.

Thierry T.

Super Data Boy

Voir le profil

Vous souhaitez en savoir plus sur le sujet ?
Organisons un échange !

Notre équipe d'experts répond à toutes vos questions.

Nous contacter

Découvrez nos autres contenus dans le même thème

Comment tester son script Apache Spark avec Pytest ?

Tester son script Apache Spark avec pytest

Dans le domaine de la data, la qualité de la donnée est primordiale. Pour s'en assurer, plusieurs moyens existent, et nous allons nous attarder dans cet article sur l'un d'entre eux : tester unitairement avec Pytest.

Un long couloir fait à partir de données

Démarrer avec Apache Spark étape par étape

Le domaine de la data est présent dans le quotidien de chacun : la majorité de nos actions peut être traduite en données. Le volume croissant de ces données exploitables a un nom : "Big Data". Dans cet article, nous verrons comment exploiter ce "Big data" à l'aide du framework Apache Spark.