GnuPG, Keybase, le web of trust : à quoi ça sert ?

Stephen Kitt / @thekittster
79D9 C58C 50D6 B5AA 65D5 30C1 7597 78A9 A36B 494F

Internet : un vecteur fiable ?

Anatomie d’un téléchargement

Le long parcours d’un fichier

Premier écueil (version 2017)...

Premier écueil (version 2014)...

Checksums à la rescousse !

Pas simple à utiliser

Mais pas mal

  • MD5 est vulnérable
  • ... pas SHA-2
  • Signatures fournies depuis un hôte autre que le téléchargement
  • Signatures "protégées" par SSL

SSL ?

https://xkcd.com/1353/

https://xkcd.com/1354/

https://xkcd.com/424/

SSL : les grands principes

  • Clés publiques / privées
  • Clés publiques associées par des certificats à des distinguished names et des alternative names
    • Adresse électronique
    • Entrée DNS
  • Certificats identifiés par leur émetteur et leur objet
  • Partage de certificats généralement dans les communications
  • Confiance établie par signature de certificat
    • Uniquement par des autorités de certification
  • Valeur des signatures décidée par les navigateurs web

SSL : les grands défauts

SSL : quelques évolutions récentes

  • HSTS (HTTP Strict Transport Security)
  • STS preloading
  • HPKP (HTTP Public Key Pinning)

On ne peut pas faire confiance aux connexions sur Internet

http://www.lemondeinformatique.fr/actualites/lire-twitter-et-facebook-buttent-sur-le-chiffrement-de-bout-en-bout-56933.html

Peut-on mieux faire ?

Vérification GPG


$ gpg --verify php-7.1.1.tar.xz.asc php-7.1.1.tar.xz
gpg: Signature made Tue 17 Jan 2017 21:46:34 CET
gpg:                using RSA key 0xF9BA0ADA31CBD89E
gpg: requesting key 0xF9BA0ADA31CBD89E from hkps server hkps.pool.sks-keyservers.net
gpg: key 0xF9BA0ADA31CBD89E: public key "Joe Watkins <krakjoe@php.net>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
gpg: Good signature from "Joe Watkins <krakjoe@php.net>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 5289 95BF EDFB A719 1D46  839E F9BA 0ADA 31CB D89E

La signature est bonne ...

... mais on ne sait pas d’où vient la clé.

(On bénéficie quand même d’un niveau d’indirection supplémentaire par rapport à MD5 ou SHA-256.)

OpenPGP : les grands principes

  • Clés publiques / privées
  • Clés associées à des user ids
    • Nom, adresse électronique
    • Photo
  • Clés identifiées par leur empreinte
  • Partage de clés « hors bande »
    • Réseau de serveurs de clés
    • Trousseaux de clés
  • Confiance établie par signature de clé
    • Par n’importe quelle autre clé (presque)
  • Appréciation individuelle de la valeur des signatures

L’arbre des clés PHP (avant...)

On peut encore mieux faire !

Une signature de confiance

Sur un tag du noyau Linux :


$ git tag -v v4.9
object 69973b830859bc6529a7a0468ba0d80ee5117826
type commit
tag v4.9
tagger Linus Torvalds <torvalds@linux-foundation.org> 1481483882 -0800

Linux 4.9
gpg: Signature made Sun 11 Dec 2016 20:18:02 CET
gpg:                using RSA key 79BE3E4300411886
gpg: Good signature from "Linus Torvalds <torvalds@linux-foundation.org>" [full]

Une signature de confiance

Sur une archive du noyau Linux :


$ gpg --verify linux-4.9.8.tar.sign linux-4.9.8.tar
gpg: Signature made Sat 04 Feb 2017 09:47:47 CET
gpg:                using RSA key 0x38DBBDC86092693E
gpg: Good signature from "Greg Kroah-Hartman (Linux kernel stable release signing key)
                                                                <greg@kroah.com>" [full]

L’arbre des clés Linux

Le web of trust

  • Chaque ensemble de clés connectées constitue une toile de confiance
  • La multiplication des connexions rend la toile résistante
  • Chacun peut décider du niveau de confiance de chaque signataire (owner trust)
  • GnuPG calcule le niveau de confiance de chaque clé
  • La toile la plus importante est le strong set
    • Près de 60 000 clés
    • Distance moyenne de 6,2
    • 9,2 signatures en moyenne (la clé la plus signée en compte 660)
    • Très résistant (la taille du strong set décroît de façon linéaire avec la suppression de clés aléatoires)

Pour explorer le web of trust : http://pgp.cs.uu.nl/

Certification peer-to-peer

Mais compliquée à utiliser

No trust value assigned to:
4096R/0x38DBBDC86092693E 2011-09-23
      "Greg Kroah-Hartman (Linux kernel stable release signing key) <greg@kroah.com>"
 Primary key fingerprint: 647F 2865 4894 E3BD 4571  99BE 38DB BDC8 6092 693E

Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

  1 = I don't know or won't say
  2 = I do NOT trust
  3 = I trust marginally
  4 = I trust fully
  s = skip this key
  q = quit

Your decision?

Le modèle de confiance GnuPG

  • « Owner trust » : valeur donnée aux liens (signatures) entre clés
    • N/A
    • aucune
    • marginale
    • totale
  • Critères de validité d'une clé :
    • elle a suffisamment de signatures de confiance
      • signature directe
      • signature par une clé avec une confiance totale
      • signatures par trois clés avec une confiance marginale
    • le chemin de retour se fait en cinq liens ou moins

Une tentative de simplification : TOFU

  • Trust on first use
  • Détection de changement
  • Clés marginales par défaut

Linux et OpenPGP

  • Modèle de développement ouvert
  • Contributions ouvertes à tous, par patches échangés par courrier électronique ou sur Facebook
  • ~ 12,5 millions de lignes de code
  • ~ 1 100 développeurs actifs
  • > 7 modifications intégrées par heure
  • Quelques dizaines de dépôts git sur kernel.org
  • Comptes kernel.org limités par clés OpenPGP
    • Pour obtenir un compte, on doit avoir une clé signée par une clé déjà utilisée sur kernel.org
  • Tous les tags de version et les archives téléchargeables sont signés

Source : « Who writes Linux 2013 »

Debian

~ 20 000 projets upstream
~ 1 milliard de lignes de code

Debian

~ 1 000 « développeurs »
~ 1 100 contributeurs actifs
~ 4 paquets modifiés par heure
12 11 10 plateformes supportées

Utilisateurs / Distributions dérivées

Debian et OpenPGP

  • Pour obtenir des droits d’upload, il faut avoir une clé signée par deux développeurs Debian
  • Les archives upstream peuvent être vérifiées avec une clé connue d’avance
  • Tous les uploads doivent être signés par une clé dans le trousseau Debian
  • Tous les fichiers disponibles en téléchargement sont signés (indirectement) par une clé d’archive
  • Les clés OpenPGP sont le moyen d’accès à l’infrastructure Debian

Keybase : un autre web of trust

« Keybase maps your identity to your public keys, and vice versa. »

Keybase : un exemple

Keybase : vérification Twitter

Keybase : les grands principes

  • Signatures publiques de liens « sociaux » publics existants (par leur « propriétaire »)
  • Clé privé hébergée ou non
  • Signatures d'états par des followers
  • Un état inclut toutes les signatures et révocations
  • Les annonces publiques sont intégrées au blockchain Bitcoin
  • Tout est vérifiable sans Keybase

Keybase : des réseaux sociaux

Keybase : des réseaux sociaux

Keybase : un web plus grand

  • 116 954 personnes
  • 408 087 clés

La confiance : une question personnelle

À qui faites-vous confiance ?

  • Maven
  • pip
  • RubyGems (compromis en janvier 2013)
  • CPAN
  • npm
  • Des scripts JS minifiés sur un CDN
  • Des PPA référencés sur un forum
  • ...

Peu s’en soucient... https://github.com/grant-olson/rubygems-openpgp-ca.org/blob/master/public/blog/nobody-cares-about-signed-gems.html

Vous pouvez participer

  • Demandez-moi une invitation Keybase
  • Signez vos clés OpenPGP
  • Utilisez les outils
  • Remontez les bugs d'UX

Pour aller plus loin

Merci !

Des questions ?

© 2014, 2017 Stephen Kitt, disponible sous licence CC-BY-SA 4.0

Moteur reveal.js © 2014 Hakim El Hattab, disponible sous licence MIT
Graphes pilotés par arbor.js © 2011 Samizdat Drafting Co., disponible sous licence MIT
Vignettes xkcd © 2008, 2014 Randall Munroe, disponible sous licence CC-BY-NC 2.5
Lignes de code comptées par SLOCCount de David A. Wheeler