Chiffrement OpenPGP de mots de passe et carte NFC Fidesmo

Fidesmo NFC card
OpenPGP est un standard libre permettant le chiffrement et la signature de messages de façon asymétrique. Il s’agit du principe des clés publiques et privées décrit dans un précédent billet. Les implémentations libres de openPGP le rend accessible à tous, d’autant plus qu’il n’y a pas de dépendance envers une autorité externe de certification de l’identité des contacts. La confiance dans l’identification de usagers provient du réseau de relations de chaque usager.
Sans tomber dans la paranoïa, il est indispensable de chiffrer un certain nombre d’informations personnelles qui intéressent les escrocs. Si relativement peu de personnes sont concernées par un espionnage étatique, nous sommes tous une cible potentielle pour les escrocs. Si ces escrocs n’utilisent pas eux même les informations qu’ils collectent, ils les distribuent sur un marché de revente d’information. Leurs moyens techniques sont sensiblement égaux aux moyens d’un état.
Malheureusement le chiffrement est difficile à utiliser. Il doit être suffisamment robuste, sans risquer de perdre les clés privées de chiffrement. En l’absence de ces clés les informations sont définitivement perdues pour tous. Seul un usage régulier permet d’avoir confiance dans les procédures de chiffrement / déchiffrement.
Ce billet va présenter des outils pour utiliser régulièrement un chiffrement openPGP de façon suffisamment simple et sécurisé. Ces outils vous permettrons de gérer essentiellement votre portefeuille de mots de passe.

Protection des mots de passe

De nos jours il est impératif de disposer de mots de passe différents pour chaque service que l’on utilise. Si un service est corrompu le mot de passe éventuellement découvert sera réutilisé pour essayer d’accéder à votre boîte mail, votre compte bancaire… Idéalement il faudrait retenir un grand nombre de mots de passe ou leurs variantes.
Il existe beaucoup de solutions pour stocker ses mots de passes dans un portefeuille de mots de passe. À mon avis il faut exclure les solutions en ligne : si la solution est corrompue tous vos comptes deviennent accessibles.
Une autre contrainte est que le portefeuille doit être pouvoir occasionnellement être accessible depuis votre téléphone mobile. Cependant, la sécurité des téléphones mobiles est aujourd’hui généralement faible. Il est très difficile de s’assurer de la qualité de toutes les applications installées par défaut. Un téléphone peut également facilement s’égarer.

Password Store

Je vous propose alors d’utiliser l’application Password Store (ou pass en ligne de commande).
Le principe est simple : les mots de passe sont enregistrés individuellement dans de simples fichiers textes chiffrés avec openPGP et organisés dans une arborescence de dossiers. Cela permet de facilement les synchroniser avec le gestionnaire de version git.
git permet de récupérer et modifier ces fichiers sur chacune de ses machines et de disposer d’un historique des modifications. Même si certains déposent leurs portefeuille de mots de passe chiffrés sur le dépôt public github, il est sans doute préférable de posséder un dépôt privé accessible par clé ssh.
Chaque fichier contient un mot de passe ou plusieurs lignes (la première ligne peut être copiée dans le presse papier lors du déchiffrage du fichier).
Pour Linux ou MacOS pass est un simple script bash de quelques lignes qui gère les opérations entre les fichiers, git et GnuPG (GnuPG - gpg est l’implémentation en ligne de commande de OpenPGP). Il existe également des clients pour Windows, iPhone, Android et même un plugin pour le navigateur web Firefox.

Je ne détaillerai pas ici l’usage de pass. $ man pass est très bien et il existe de multiples tutoriaux en ligne. (Migration depuis lastpass.)

La difficulté réside plutôt la gestion des clés de chiffrement sur des appareils peu fiables, comme un téléphone mobile, ou sur un ordinateur portable que l’on peut perdre.

PGP et sous-clés pour appareils mobiles

Si vous ne disposez pas encore de clé PGP, elle se crée facilement en ligne de commande avec $ gpg --gen-key. Aujourd’hui il est recommandé d’utiliser des clés RSA de 4096 bits.

Sur Linux et MacOS ces opérations se réalisent facilement en ligne de commande (il existe aussi des interfaces graphiques qui masquent ces commandes) :

$ gpg --gen-key

Sélectionnez le type de clef désiré :
   (1) RSA et RSA (par défaut)
   (2) DSA et Elgamal
   (3) DSA (signature seule)
   (4) RSA (signature seule)
Quel est votre choix ? 1
les clefs RSA peuvent faire entre 1024 et 4096 bits de longueur.
Quelle taille de clef désirez-vous ? (2048) 4096
La taille demandée est 4096 bits

....

( ajout NOM et adresse mail )
( calcul de l'entropie 
  si nécessaire ajout d'entropie avec :
  $ sudo rngd -r /dev/urandom )

....

gpg: clef 843D7920 marquée de confiance ultime.
les clefs publique et secrète ont été créées et signées.

gpg: vérification de la base de confiance

pub   4096R/843D7920 2016-08-12
      Empreinte de la clef = 18E0 E8D9 5274 31A5 D7C7  EBFE 16B2 3DC4 843D 7920
uid                  yvesago <yvesago@xxxx.me>
sub   4096R/8DFCF5A7 2016-08-12

La sécurité du chiffrement asymétrique repose sur le secret des clés privées. Il est dangereux de recopier cette clé sur plusieurs appareils qui peuvent être compromis et où les clés peuvent être volées. Il faut alors créer des couples de sous-clés (signature / chiffrement) pour les divers appareils mobiles (avec une durée limitée).

Lorsque la clé principale est créé (ici avec l’identifiant 843D7920), on ajoute des sous-clés de signature et de chiffrement :

$ gpg --edit-key 8DFCF5A7

La clef secrète est disponible.

pub  4096R/843D7920  créé : 2016-08-12  expire : jamais       utilisation : SC  
                     confiance : ultime        validité : ultime
sub  4096R/8DFCF5A7  créé : 2016-08-12  expire : jamais       utilisation : E   
[  ultime ] (1). yvesago <yvesago@xxxx.me>

gpg> 
gpg> addkey               (choisir une pour sign, puis une autre pour encrypt)
La clef est protégée.

Une phrase de passe est nécessaire pour déverrouiller la clef secrète de

Sélectionnez le type de clef désiré :
   (3) DSA (signature seule)
   (4) RSA (signature seule)
   (5) Elgamal (chiffrement seul)
   (6) RSA (chiffrement seul)
Quel est votre choix ? 4

....

pub  4096R/843D7920  créé : 2016-08-12  expire : jamais       utilisation : SC  
                     confiance : ultime        validité : ultime
sub  4096R/8DFCF5A7  créé : 2016-08-12  expire : jamais       utilisation : E   
sub  4096R/27B6AFCA  créé : 2016-08-12  expire : 2017-08-12  utilisation : S   
sub  4096R/839A1C83  créé : 2016-08-12  expire : 2017-08-12  utilisation : E 
[  ultime ] (1). yvesago <yvesago@xxxx.me>


gpg> save

On exporte ensuite la clé publique, qui peut être diffusée à toute personne souhaitant nous envoyer un message chiffré ou vérifier la signature d’un de nos messages. Puis les sous-clés privées (notez le ! après l’identifiant de clé)

$ gpg --armor --export 843D7920 > yvespub.asc
$ gpg --output subkeys.gpg --export-secret-subkey 27B6AFCA! 839A1C83!

L’exportation des sous-clés privées de signature et chiffrement subkeys.gpg peut ensuite être transféré avec un maximum de précaution sur les autres machines.
Après avoir importé ces sous-clés, il faut ensuite définir la confiance qu’on leur accorde. Il est également préférable de définir un mot de passe différent de la clé maître principale.

$ gpg --import subkeys.gpg
$ gpg --edit-key 843D7920
gpg> trust                 (ultime)
gpg> passwd                (chg passphrase)
gpg> save

PGP sur appareils mobiles

Pour Android, l’application OpenKeyChain permet de gérer les clés PGP. A priori, il suffit de les importer, cependant, à mon sens il est risqué de laisser ces clés sur un appareil où il existe de multiples applications de provenance inconnue et où les mises à jour systèmes de la part de l’opérateur se font de plus en plus rares.

Il est plus sûr de conserver ces clés sur un jeton physique (token) séparé de l’appareil. Les clés ne sont utilisables que en associant, lorsque cela est nécessaire, le token et l’appareil mobile. Les clés privées ne peuvent alors pas être capturés.
Néanmoins, il faut garder à l’esprit qu’il reste toujours un risque pendant que l’information est déchiffrée et manipulée sur un appareil potentiellement compromis.

Carte NFC Fidesmo

Depuis quelques mois il est possible d’acheter des java-cartes NFC Fidesmo. La société suédoise Fidesmo AB, qui produit ces cartes, propose plusieurs applications embarquables et téléchargeables sur sa carte. Pour 15€ (14€ si vous utilisez le code promotionnel de OpenKeyChain) on peut obtenir une carte avec les applications openPGP et un gestionnaire de jetons TOTP compatible avec les jetons USB/NFC YubiKey.
La carte Fidesmo est pour l’instant la solution de jeton physique la moins chère du marché. Pour un niveau de sécurité qui ne peut de toute façon pas être totalement garanti, l’investissement semble raisonnable.

Voici mes tests de cette carte Fidesmo.

Dans un premier temps, la création d’une clé privée se fait facilement avec OpenKeyChain:
Définition d'un code d'accès

Mais les premières limitations apparaissent également:

  • une clé privée créé sur un token ne peut pas être utilisée sans ce token. C’est une fonctionnalité de sécurité nécessaire.
  • un seul jeu de clés peut être enregistré sur la carte Fidesmo : on ne peut pas alors choisir entre nos identités personnelles ou professionnelles.
  • les clés sont limitées à une taille de 2048 bits : cette taille reste néanmoins satisfaisante pour les 10 prochaines années. Cela semble être une limitation physique de la plupart des cartes NFC existantes.
  • le vrai problème est, pour l’instant, l’incapacité de OpenKeyChain d’enregistrer nos sous-clés sur la carte. Il semble alors difficile de ré-importer une copie de secours des clés générées. Le support des cartes NFC est très récent. Il s’agit peu-être d’un bug qui sera bientôt corrigé.

Ces limitations peuvent sembler rébarbatives mais l’objectif initial était de pouvoir accéder occasionnellement à un portefeuille de mots de passe.
Password Store a une fonctionnalité essentielle qui permet de chiffrer les mots de passe pour plusieurs utilisateurs. Il est alors possible et de changer facilement la liste des utilisateurs valides en rechiffrant tous les fichiers : $ pass init XXXXXX YYYYYY ZZZZZZ (où XXXXXX YYYYYY ZZZZZZ sont les identifiants des clés publiques des utilisateurs valides).
Si cette fonctionnalité est destinée au partage de mots de passe dans un groupe de collaborateurs, elle va également nous permettre de partager nos mots de passe entre nos appareils fiables et nos téléphones moins fiables.
On va alors créer une clé spécifique de 2048 bits pour la carte Fidesmo. Il suffit d’exporter la clé publique et de l’intégrer aux trousseaux PGP de nos autres machines. De la même façon on configure Password Store pour chiffrer les mots de passe pour la carte Fidesmo et notre clé publique principale.
En cas de perte ou de changement de la carte NFC (le jeton de stockage), il suffit de rechiffrer le magasin de mots de passe avec la nouvelle clé.

Le risque de perte de la carte impose de se limiter à l’usage d’une clé spécifique dédié et destinée à des usages temporaires comme le chiffrement de conversation ou le transfert ponctuel de fichier.
Cette clé différente de notre clé principale ne permet pas de déchiffrer les messages adressés à notre identité principale. Cette limitation permet en réalité d’éviter de traiter des informations sensibles sur un téléphone. Cela reste une sage précaution.

Exemple de portefeuille de mots de passe entre un terminal et un téléphone:
Terminal: affichage et copie dans le presse papierAndroid

La lecture d’un mot de passe sur le téléphone impose de présenter la carte NFC.


L’autre fonctionnalité intéressante de la carte Fidesmo est l’enregistrement des tokens TOTP sur la carte NFC.
Attente de la carteAffichage temporaire du code

Ici aussi il n’est pas possible de faire une copie de sauvegarde. Mais il s’agit d’une très bonne solution pour éviter le vol du token TOTP sur le mobile.

Conclusion

L’usage de Password Store permet d’utiliser régulièrement des clés de chiffrement PGP et ainsi d’être suffisamment confiant et à l’aise avec le chiffrement. On peut ensuite plus facilement s’en servir s’il devient nécessaire de chiffrer des mails ou d’autres documents.
Pour la protection des clés privés les tokens mixtes USB/NFC sont de très bonnes solutions mais le prix est généralement élevé.
La carte Fidesmo propose actuellement, pour un prix raisonnable, une solution de sécurité acceptable pour un usage modéré du chiffrement PGP sur un téléphone mobile. On peut surveiller les annonces de la société française NEOWAVE qui devrait bientôt proposer une solution de token NFC/USB à bas prix.