Le gestionnaire de mot de passe parfait

TL;DR: Je présente une solution à base de Yubikey 4 avec « touch-to-sign » pour contenir vos clés GPG, avec utilisation de ces clés pour l’authentification SSH et pour stocker vos secrets avec password-store

Le problème

Depuis longtemps, je cherche une solution sécurisé et robuste pour stocker mes mots de passes, et mes secrets en général (clés SSH et GPG, fichiers personnels…)

Il y a une chose qui me pose problème avec toutes les solutions que j’ai testées, de logiciels comme KeePass à des solutions « cloud » comme LastPass: si mon ordinateur est compromis à un certain point, il devient possible d’extraire tous mes secrets quand je déverouille mon coffre-fort pour accéder à un secret.

En ce sens, un papier dans mon porte-monnaie est bien plus sécurisé, puisque mon ordinateur ne connaîtrait seulement les secrets que je copie sur mon ordinateur, quand je les utilise vraiment.

Le seul outil qui résout ce problème est le mooltipass, un périphérique externe qui contient tous vos mots de passe et qui peut simuler un clavier, les recopiant quand vous en avez besoin. C’est un périphérique intéressant, entièrement libre, et je vous conseille d’aller y jeter un œil.

Mais il y a une autre solution dont je veux parler, qui est basée sur la « Yubikey », avec une combinaison d’outils qui répondent à tous mes besoins, pas seulement pour enregistrer des mots de passes, mais aussi pour me connecter à des serveurs SSH distants et chiffrer/déchiffrer des messages PGP, tout en me donnant une garantie que les secrets que je n’utilise pas resteront bien à l’abri, même si mon ordinateur se fait compromettre.

La solution

Suivant l’esprit Unix, j’utilise une combinaison d’outils qui ont chacun un rôle simple. Commençons par le gestionnaire de mots de passe:

GPG pour votre gestionnaire de mots de passe: password-store

Comme vous l’avez probablement compris via le titre, tout repose sur GPG, et nous verrons plus tard comment sécuriser ces clés GPG.

Mais pour l’instant, découvront un outil appelé password-store.

C’est un simple script bash qui utilise GPG, et vous permet de stocker chacun de vos secrets / mots de passe dans un fichier chiffré avec GPG.

La clé GPG que vous utiliserez pour stocker vos mots de passe sera requise à chaque fois que vous accéderez à un secret. Mais, puisque c’est du chiffrement à clé publique, vous pourrez créer de nouveaux secrets sans avoir à accéder à votre clé secrète !

En terme de sécurité, hé bien, c’est GPG. Chacun de vos secrets est stocké dans un fichier dans votre « home », c’est à vous de faire vos sauvegardes. Mais ça à l’avantage d’être propre, et simple.

zx2c4@laptop ~ $ pass
Password Store
├── Business
│   ├── some-silly-business-site.com
│   └── another-business-site.net
├── Email
│   ├── donenfeld.com
│   └── zx2c4.com
└── France
    ├── bank
    ├── freebox
    └── mobilephone

Il y a même des extensions pour navigateur (firefox, chrome), pour utiliser password-store !

GPG pour vos clés SSH: gpg-agent

Je veux aussi faire une disgression rapide, pour vous expliquer que vous pouvez utiliser GPG non seulement pour stocker vos mots de passe, mais aussi pour vous authentifier auprès de vos serveurs via SSH.

Ce n’est pas tout ! Vous pouvez utilisez le « key forwarding » (qui permet de, depuis un serveur distant, se connecter à un autre serveur avec vos clés locales), sans risque que le serveur distant abuse de votre clé dans votre dos: tous les usages de votre clé nécessiteront de toucher la Yubikey !

Par exemple, je peux me connecter sur mon serveur avec ma Yubikey, et depuis ce dernier je peux copier des fichiers sur un autre serveur, ou pousser du code vers mon dépôt git, en touchant cette dernière et sans taper le moindre mot de passe.

Pour cela, vous aurez besoin de remplacer votre agent SSH par l’agent de GPG, tout est expliqué en annexe.

Protection des clés GPG: Yubikey

../_images/yubikey.png

Certains d’entre vous auront probablement entendu parler des Yubikeys. L’idée est d’avoir une Yubikey qui stocke des clés GPG que vous avez générées sur un ordinateur propre et déconnecté d’internet.

Elles servent principalement pour de l’authentication à deux facteur, mais ici nous allons nous concentrer sur la fonction de smartcard GPG.

Une fois installée, GPG va se connecter à votre Yubikey à chaque fois qu’il aura besoin d’accéder à votre clé secrète. La Yubikey fera tout le travail cryptographique, si bien que votre clé secrète n’en sortira jamais. Si jamais votre ordinateur est compromis, un attaquant peut utiliser votre clé secrète seulement si votre Yubikey est connectée et déverouillée.

Le problème de cette solution, c’est qu’en pratique ma Yubikey sera souvent connectée et déverouillée. Si mon ordinateur est compromis, alors il peut lui demander de déchiffrer tous mes mots de passe, se connecter à tous mes serveurs… sans que je ne me rende compte de rien : pas top !

C’est là que la dernière génération des Yubikeys (la 4), a une fonctionnalité dont j’ai très peu entendu parler, mais que je trouve très importante : il est possible de configurer la Yubikey pour que toute opération impliquant votre clé secrète nécessite que vous la touchiez. Ce qui veut dire qu’il est impossible d’accéder à vos secrets sans que vous l’acceptiez physiquement.

Combiné avec les outils ci-dessus, vous devrez toucher votre Yubikey à chaque fois que vous voudrez accéder à un de vos mots de passe, déchiffrer ou signer un message GPG, ou vous connecter à un de vos serveurs. Sans que vous n’ayez déverouillé et que vous touchiez votre Yubikey, il devient impossible de se connecter à un de vos serveur ou d’accéder à vos mots de passe. Et ce, même si votre ordinateur est compromis.

Conclusion

Je trouve cette solution très sécurisée, plutôt facile à utiliser et non-intrusive.

Histoire de contredire le titre de l’article, voici quelques inconvénients auxquels je peux penser:

  • Même s’il est impossible d’accéder à vos secrets, il reste possible de les remplacer, puisque le chiffrement par clé public ne nécessite pas d’y accéder. Ceci pourrait être rendu impossible en forçant vos fichiers secrets à être signés par votre clé privée.

  • Si jamais votre ordinateur était compromis, il pourrait être possible de demander à votre Yubikey de faire quelque chose d’autre que ce que vous avez demandé. Mais dans ce cas, vous devriez la toucher deux fois, et vous vous en rendriez probablement compte.

  • Oh, et malheureusement, la version 4 de la Yubikey (avec touch-to-sign) n’a pas de firmware open source :(

Mais bon, comparé aux autre solutions dont j’ai entendu parler, je trouve que ce sont des inconvénients plutôt mineurs, et que la sécurité est globalement très bonne.

Annexe: installation pratique

Générer vos clés PGP

Clé principale

Pour que ce système soit sécurisé, il faut d’abord générer vos clés GPG sur un ordinateur sécurisé, déconnecté d’internet. Ou au moins depuis un live CD, ou un ordinateur dont vous pouvez avoir une confiance supérieure à celle de votre ordinateur de tous les jours.

Une fois que vous êtes sur ce système sécurisé et jetable, utilisez GPG pour génerer une clé maître (si vous n’en avez pas déjà une) :

$ gpg --gen-key

Générer une clé de signature seulement (le reste ira dans vos sous-clés)

Je suggère aussi que vous utilisiez tous les défauts, mais que vous mettiez une date d’expiration au cas où vous perderiez votre clé (quelques années dans le futur).

Tant que vous n’avez pas pour projet de copier vos clés secrètes ailleurs, à part dans un stockage hors-ligne et chiffré, comme expliqué plus bas, vous pouvez laisser le mot de passe pour protéger votre clé vide.

Sous-clés

Maintenant que vous avez votre clé principale, nous pouvons créer trois sous-clés, qui iront sur votre Yubikey.

$ gpg --expert --edit-key palkeo

Remplacez « palkeo » par le nom que vous avez fourni pour votre clé principale, ou l’identifiant de la clé que vous pouvez voir en faisant gpg --list-secret-keys.

Vous devriez maintenant avoir un prompt gpg>. Nous allons l’utiliser pour créer trois sous-clés.

  • Une pour le chiffrement: pour déchiffrer les messages que vous recevez, ainsi que vos mots de passe.

  • Une pour les signatures: pour signer les messages GPG que vous envoyez.

  • Une pour l’authentification: principalement pour l’authentification SSH.

Voyons maintenant comment créer votre clé de chiffrement, par exemple:

gpg> addkey

Please select what kind of key you want:
(3) DSA (sign only)
(4) RSA (sign only)
(5) Elgamal (encrypt only)
(6) RSA (encrypt only)
(7) DSA (set your own capabilities)
(8) RSA (set your own capabilities)
Your selection? 8

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Sign Encrypt

(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished

Your selection? s

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Encrypt

(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished

Your selection? q
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 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) 5y
Key expires at Wed Dec  8 22:56:10 2021 UTC
Is this correct? (y/N) y
Really create? (y/N) y

...

pub  2048R/A41164CD  created: 2016-12-09  expires: never       usage: SC
                     trust: ultimate      validity: ultimate
sub  2048R/D7857578  created: 2016-12-09  expires: 2021-12-08  usage: E
gpg>

Vous pouvez voir que j’ai utilisé « toggle » pour inverser les différents rôles de la clé, jusqu’à ce qu’il ne reste plus que le chiffrement:

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Encrypt

Répétez maintenant le processus avec la commande addkey, mais en laissant cette fois le rôle de signature. Refaites-le une dernière fois, en activant seulement l’authentification.

Vous devriez maintenant avoir trois sous-clés. Elles vont bientôt aller sur votre Yubikey.

C’est l’heure des backups

C’est l’heure des sauvegardes, ne négligez pas cette étape !

Exportez votre clé principale et vos sous-clés, de cette façon :

$ gpg -a --export-secret-keys A41164CD > key.txt
$ gpg -a --export-secret-subkeys A41164CD > subkeys.txt

Copiez maintenant ces fichiers en lieu sûr. Vous devez les mettre dans un périphérique externe, complètement déconnecté, et chiffrée. Ainsi, votre ordinateur n’y aura jamais accès, mais si vous perdez votre Yubikey vous pouvez facilement le retrouver et les copier de nouveau.

Je recommande aussi que vous fassiez une copie de votre répertoire ~/.gnupg, qui vous a servi à générer ces clés.

Installation de la Yubikey

Une fois que vous avez votre Yubikey, vous pouvez l’installer :

Smartcard GPG

Note

Puisque vous accédez/copiez vos clés secrètes, ceci doit être fait de nouveau sur un ordinateur jetable/déconnecté d’internet. Je vous recommande de faire ceci juste après avoir généré les clés.

Tout d’abord, beaucoup d’article mentionnent l’utilisation de l’utilitaire ykpersonalize pour activer GPG sur la Yubikey. Pour la Yubikey 4, je n’en ai pas eu besoin et tout les modes étaient fonctionnels par défaut.

Vous pouvez maintenant installer le support des smartcard dans GPG:

$ sudo apt-get install scdaemon pcscd gnupg-agent

Vous pouvez brancher votre Yubikey, et exécuter gpg --card-status. Vous devriez voir quelque chose comme :

Reader ...........: 1050:0407:X:0
Application ID ...: D2760001240102010006050314690000
Version ..........: 2.1
Manufacturer .....: Yubico
Serial number ....: 05031469
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]

Configurons la smartcard :

$ gpg --card-edit

... (same as above) ...

gpg/card> admin
Admin commands are allowed

gpg/card> passwd

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

Un dialogue vous demandera le code PIN d’administration: c’est 12345678. De même pour le code PIN utilisateur: 123456.

Faites en sorte que votre nouveau PIN d’administration reste bien secret, et impossible à deviner. Vous pouvez le stocker avec vos clés GPG. Il sera nécessaire seulement pour administrer la smartcard, jamais à l’utilisation quotidienne.

Le code PIN utilisateur est celui que vous nécessiterez tous les jours pour déverouiller votre Yubikey, quand vous la brancherez à votre ordinateur. L’objectif est d’empêcher que quelqu’un volant votre Yubikey puisse utiliser la clé secrète.

Copie des clés

Maintenant, déplaçons les clés sur la Yubikey:

$ gpg --edit-key palkeo

pub  2048R/A41164CD  created: 2016-12-09  expires: 2021-12-08  usage: SC
                     trust: ultimate      validity: ultimate
sub  2048R/486B21CF  created: 2016-12-09  expires: 2021-12-08  usage: S
sub  2048R/D7857578  created: 2016-12-09  expires: 2021-12-08  usage: E
sub  2048R/DA1E5137  created: 2016-12-09  expires: 2021-12-08  usage: A
[ultimate] (1). palkeo

gpg> toggle

sec  3744R/1C5C4717  created: 2016-12-09  expires: 2021-12-08
ssb  2048R/486B21CF  created: 2016-12-09  expires: 2021-12-08
ssb  2048R/A11F46D2  created: 2016-12-09  expires: 2021-12-08
ssb  2048R/DA1E5137  created: 2016-12-09  expires: 2021-12-08
(1)  palkeo

gpg> key 1

sec  3744R/1C5C4717  created: 2016-12-09  expires: 2021-12-08
ssb* 2048R/486B21CF  created: 2016-12-09  expires: 2021-12-08
ssb  2048R/A11F46D2  created: 2016-12-09  expires: 2021-12-08
ssb  2048R/DA1E5137  created: 2016-12-09  expires: 2021-12-08
(1)  palkeo

gpg> keytocard
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]

Please select where to store the key:
(1) Signature key
(3) Authentication key
Your selection? 1

sec  3744R/1C5C4717  created: 2016-12-09  expires: 2021-12-08
ssb* 2048R/486B21CF  created: 2016-12-09  expires: 2012-12-08
                     card-no: 0060 00000042
ssb  2048R/A11F46D2  created: 2016-12-09  expires: 2012-12-08
ssb  2048R/DA1E5137  created: 2016-12-09  expires: 2012-12-08
(1)  palkeo

gpg>

Ceci est un exemple déplaçant ma clé de signature sur ma Yubikey. Notez bien que la clé est déplacée (d’où l’intérêt d’avoir fait des backups au préalable !), et remplacée par un pointeur vers l’identifiant de la smartcard.

Vous devez refaire ce processus deux fois de plus, pour déplacer les deux autres clées (utilisez la commande key pour désélectionner la clé 1, sélectionner la clé 2, etc.).

Une fois que c’est terminé, faites gpg --card-status pour vous assurer que vos clés ont bien été mises sur la Yubikey.

Mise en place du touch-to-sign

Il vous faut maintenant activer la fonctionnalité qui vous force à toucherla Yubikey quand une opération cryptographique est demandée.

It’s quite granular, as this flag is set per key slot. But I recommend that you set it to all your three keys.

Ce lien contient toutes les informations dont vous aurez besoin. Il pointe vers un script yubitouch.sh que vous aurez à télécharger et lancer pour activer le touch-to-sign.

Configurez vos machines pour utiliser votre Yubikey

Pour que vos machines utilisent votre Yubikey, il vous faudra exporter votre clé publique de votre système sécurisé:

$ gpg -a --export palkeo > public-key.txt

Déplacez ce fichier (et seulement celui-ci, pas vos clés secrètes !) vers votre machine de travail de tous les jours, et importez-le :

$ gpg --import < public-key.txt

Voilà, vous devriez pouvoir utiliser de manière transparente votre Yubikey pour chiffrer et signer des messages GPG :)

Configuration de password-store

Une fois que GPG est configuré pour utiliser votre Yubikey, password-store est trivial à utiliser:

Tout d’abord, il vous faut l’initialiser, en passant l’identifiant de votre clé principale:

pass init 1C5C4717

Ensuite, vous pouvez ajouter de nouveaux mots de passe avec pass insert.

Note

Si vous utilisez pass edit pour éditer vos secrets avec votre éditeur de texte préféré, sachez que vos secrets sont déchiffrés vers votre répertoire temporaire pour cela. Et il est possible que votre éditeur de texte fasse une sauvegarde du fichier en clair, ailleurs. Si vous utilisez vim, il y a un plugin qui vous permet d’éviter ça. Il y a aussi d’autres scripts intéressants dans le répertoire contrib/ de password-store.

Utilisez vos clés pour l’authentification SSH

Nous allons maintenant utiliser l’agent GPG pour remplacer l’agent SSH.

Tout d’abord, activez ce support dans l’agent GPG :

echo enable-ssh-support >> $HOME/.gnupg/gpg-agent.conf

Puis, démarrez-le

eval `gpg-agent --daemon`

Ceci à pour effet de bord d’initialiser des variables d’environnement comme SSH_AUTH_SOCK.

Il vous faudra aussi faire en sorte qu’il démarre en même temps que votre session, ou alors au démarrage du terminal…

Vous devriez voir votre nouvelle clé public SSH en faisant ssh-add -l.

Notez qu’en utilisant ssh-add -L, vous la verrez dans un format qui sera prêt à ajouter au fichier authorized_keys de vos serveurs.

Un rappel important

Je voulais vous rappeler ces deux points, qui sont à la base de tout ce système :

  • Soyez certain que le PIN d’administration de votre Yubikey est changé, et stocké sur un périphérique déconnecté et sécurisé. Avec ce code, il est possible de désactiver le touch-to-sign (entre autre choses).

  • Faites en sorte de toujours avoir une sauvegarde hors-ligne de la clé secrète qui est sur votre Yubikey. Ainsi, si vous la perdez, vous pouvez toujours copier cette clé sur une nouvelle Yubikey, et avoir toujours accès à vos mots de passe !