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.
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.