Jusque-là, je stockais mes mots de passe complexes (20 chars générés aléatoirement avec pwgen et/ou le classique echo `< /dev/random tr -dc _A-Z-a-z-0-9 | head -c20`) destinés aux sites web sur lesquels j'ai un compte dans des fichiers texte, un par site web, le tout planqué dans un dossier dans un conteneur luks. Mes passphrases (luks, système, ssh, systèmes distants, gpg) étaient seulement dans ma tête. Ça fait un petit moment que je m'interroge sur une meilleure solution (gestionnaire de mots de passe ? lequel ? un simple fichier texte chiffré + signé ?).
Qu'est-ce que pass apporte de plus ?
* pass copie directement le mot de passe dans le presse-papier. On évite donc l'eavesdropping, c'est-à-dire, les regards indiscrets par-dessus notre épaule pendant un copier/coller manuel ;
* Le mot de passe traîne dans le presse-papier un intervalle de temps court pré-défini à l'avance ce qui restreint l'intervalle de temps pendant lequel une attaque est possible. De plus, ça évite les mauvaises manipulations (genre je colle mon mdp sur IRC/XMPP, par exemple) ;
* En cas d'accès malveillant (luks protège contre le vol de l'ordinateur éteint mais pas contre une faille de sécu, un malware ou, plus simplement, une session non verrouillée), l'attaquant peut récupérer la liste des sites web sur lesquels j'ai un compte mais plus les login/mdp ;
* Ça simplifie toute la chaîne, de la génération d'un mot de passe fiable à son accès en passant par son stockage. Tout est intégré dans un même outil ;
* pass permet un partage sécurisé simplifié : il est possible de chiffrer toute l'arborescence ou seulement une partie avec plusieurs clés publiques dans l'optique de partager un ou plusieurs mots de passe. Super pratique au sein d'une équipe d'adminsys ;
On garde les autres avantages/inconvénients : git pour le versionning/synchro sur plusieurs machines, bête arborescence dossiers/fichiers et le fait que la liste des mots de passe est en claire (relire le point numéro 3 ci-dessus).
Quels sont les inconvénients de pass ?
* On n'est pas protégé à 100% des regards indiscrets. Il n'est pas possible d'afficher tout sauf le mot de passe. Or, il y a des sites web relous (banques, administrations,...) qui vous font saisir soit le login, soit le mdp sur un clavier virtuel. Dans le cas où le site web demande la saisie du mdp à la souris, on est foutu car on est obligé de l'afficher pour le recopier à la mano. Dans le cas d'un login, c'est dommage d'afficher aussi le mdp avec « pass show »... On peut écrire une fonction bash à mettre dans .bashrc pour masquer le mot de passe sauf si l'on passe une option « -f » à « pass show » :
function pass {
passbin=/usr/bin/pass
if [ "$1" = "show" ]; then
if [ "$2" = "-c" ]; then
$passbin $@
elif [ "$2" = "-f" ]; then
$passbin show $3
else
$passbin show $2 | tail -n +2
fi
else
$passbin $@
fi
}
Utiliser le même nom permet de conserver l'autocompletion.
* pass repose sur gnupg et donc sur une clé/configuration solide (pas d'algos moisis ou en dernier recours). Voir :
http://www.guiguishow.info/2014/07/17/ma-premiere-vraie-cle-pgp/#toc-5108-gnrer-une-paire-de-cls ÉDIT DU 09/11/2015 à 11h05 : Et si je perds ma clé GPG ? Ha bah c'est perdu hein, la sécurité n'est pas gratuite. Et si ma clé GPG expire ou est révoquée ? Ça n'a pas d'importance : l'expiration n'est pas une fatalité (lire le lien donné précédemment) et, en cas de révocation, vous ne pourrez plus ajouter de nouveaux mots de passe mais tous vos mots de passe présents dans le trousseau restent accessibles. Et donc, je fais comment pour changer de clé ? Lisons le man pass « init [ --path=sub-folder, -p sub-folder ] gpg-id... Initialize new password storage and use gpg-id for encryption. Multiple gpg-ids may be specified, in order to encrypt each password with multiple ids. This command must be run first before a password store can be used. If the specified gpg-id is different from the key used in any existing files, these files will be reencrypted to use the new id. ». Ça fonctionne tant que vous avez la clé privée, on est bien d'accord ?! Testé et approuvé. FIN DE L'ÉDIT.
Pourquoi pas keepassX (= la version 1 mais multi-plateforme qui lit aussi les fichiers bases de données de keepass 2 ) ou keepass2 ?
* + Keepass résout nativement et totalement le problème des regards indiscrets puisque le mot de passe est remplacé par des étoiles... Sauf à la demande de l'utilisateur ;
* + La liste des sites web ne fuite pas avec un simple ls ;
* + Keepass 2 est multiplateformes. Je m'en fiche, ce n'est pas une propriété que je recherche. Ceci dit, des implémentations d'OpenPGP existent aussi sous winwin mais c'est moins bien intégré à l'environnement ;
* - pass repose sur OpenPGP qui est normalisé à l'IETF (voir
https://tools.ietf.org/rfc/rfc4880.txt) alors que Keepass repose sur son propre format non normalisé ;
* - Keepass2 est écrit en Microsoft .NET... NON, juste NON. Sans virer à la parano anti-MS, on peut argumenter qu'un soft en .NET sera toujours plus complexe que n'importe quel éditeur de texte (nano, vim, emacs). D'où un audit plus difficile et des failles potentielles en plus. Et puis même, j'suis pas là pour utiliser du .NET. KeepassX utilise C++/QT.
Néanmoins, il existe plusieurs outils libres qui permettent de lire/écrire des bases de mots de passe au format Keepass sans recourir à Mono (implé .NET libre). Le seul qui est packagé dans Debian stable (sauf la lib perl Clipboard qu'il faut récup' en plus dans CPAN), c'est kpcli (
http://kpcli.sourceforge.net/). C'est donc celui-ci que j'ai testé.
* Il manque la fermeture auto du trousseau, ce que permet Keepass. pass permet ça grâce à l'agent gnupg. Il manque également le nettoyage auto du presse-papier : il faut venir saisir une commande (« xx »). C'est un coup à oublier. Ces points sont bloquants selon moi ;
* Il faut patcher la lib Clipboard (voir
https://github.com/lfont/dotfiles/blob/master/kpcli/Xclip.patch).
En résumé, j'ai choisi pass avec quelques ajustements dans mon .bashrc :
* Réduire le temps entre la mise dans le presse-papier d'un mot de passe et le nettoyage du presse-papier à 10 secondes au lieu de 45 : export PASSWORD_STORE_CLIP_TIME=10 ;
* Changer l'emplacement du trousseau : export PASSWORD_STORE_DIR=/chemin/vers/le/trousseau/ . N'oubliez pas le « / » final sinon l'autocomplétion de l'arborescence ne fonctionnera pas.
Tout un écosystème a été développé autour de pass dont le plus intéressant me semble être l'extension Firefox « passff » (
https://github.com/jvenant/passff) qui permet la complétion automatique des formulaires dans les pages web. Bien que cette extension soit pratique et bien fichue, je suis plutôt sceptique à l'idée de l'utiliser :
* À la fin du README, il est écrit, en gros : « This is a beta. For testing purposes only. » ;
* Du JavaScript qui manipule mes mots de passe pour éxecuter pass dans un sous-processus puis remplir les éléments DOM correspondant au formulaire de login ? Ok, c'est dans un cadre restreint prévu par Firefox mais quand même... Aucun risque de fuite avec un appel JS depuis un site web ? Vraiment ?
* ATTENTION : ne pas utiliser les fonctions « Copy login » et « Copy password » : le presse-papier n'est JAMAIS nettoyé ! (voir la fin de la fonction « onCopyToClipboard »,
https://github.com/jvenant/passff/blob/master/src/modules/menu.js#l246). Il faut utiliser seulement les fonctions « Fill [...] » qui n'utilisent pas le presse-papier. Si passff ne remplit pas un des champs, c'est que celui-ci a un nom stupide. Trouvez-le dans le source HTML et ajoutez-le dans « [...] input names » dans « Autofilling » dans les préférences de passff pour qu'il soit reconnu ;
*
https://stackoverflow.com/questions/33358753/firefox-extension-refer-to-object-defined-in-bootstrap-js-from-xul-file. Je contribue sur une extension qui manipule des putain de mots de passe mais « I have no idea what I'm doing :) »...
Merci à benvii pour la découverte de pass, à blusky pour le débat animé sur les avantages et inconvénients de chaque solution et la découverte de kpcli et à johndescs pour son côté bash-nazi.