Pass - Stockage et partage de mots de passes
Password Store est un outil en ligne de commande de stockage de mots passes. C’est un outil très simple à mettre en place. La base de données est simplement un répertoire, la cryptographie est opérée par OpenPGP.
Nous allons voir comment utiliser pass
pour partager les mots de passes au
sein d’une équipe ou une entreprise, avec une gestion de droits, et le tout en
ligne de commande.
Toutes les entrées de mot de passe sont des nouveaux fichiers chiffrés par votre clé
GPG qui peuvent bien sûr être rangés par répertoire. L’ajout et l’édition de
mots passes se fait par les commandes suivantes : pass generate myserver/user
et
pass edit myserver/user
.
Pour plus de détails je vous invite à vous reporter à la page de documentation officielle.
Fonctionnement sous le capot
La documentation officielle décrit très bien le fonctionnement du pass
. Voici
quelques commandes que pass
utilise en interne pour chiffrer et déchiffrer
les mots de passe enregistrés.
Le répertoire utilisé par défaut par pass
est ~/.password-store
:
$> tree ~/.password-store
/home/user/.password-store
├── .gpg-id
├── banque
│ ├── cb.gpg
│ └── id.gpg
├── mail
│ └── user.name@example.com.gpg
├── matrix_recover.gpg
└── ledger-recover-words.gpg
On peut facilement accéder aux fichiers chiffrés avec :
$> gpg -q -d ~/.password-store/banque/cb.gpg
0123456678
Le contenu de ~/.password-store/.gpg-id
devrait ressembler à ça :
$> cat ~/.password-store/.gpg-id
F05A2D9D328BD6AE384148EC8E2F89A6607718D0
Mots de passes partagés avec pass
La base de donnée de pass
étant simplement un répertoire, le moyen le plus
simple de partager des mots de passe est d’utiliser l’outil git
et notamment
les sous commandes git push
et git pull
.
Cependant cette méthode à quelques désavantages qui seront décrits plus bas.
Répertoires protégés avec différentes clés
L’outil pass
peut être utilisé pour stocker les mots de passes personnels de
une seule personne, ou être partagé à toute une équipe. Dans ce cas il faut que
chaque utilisateur puisse déchiffrer les contenus. pass
permet de chiffrer
toutes les entrées avec plusieurs clés publiques.
Pour configurer les clés avec lesquelles pass
va chiffrer il faut soit
utiliser la commande pass init <les clés avec lesquelles chiffrer>
soit en
éditant le fichier ~/.password-store/.gpg-id
.
D’ailleurs ce fichier .gpg-id
peut exister dans n’importe quel
sous-répertoire, dans ce cas, pass
utilisera les clés de .gpg-id
le plus
proche dans l’arborecsence plutôt que les clés décrites dans le fichier
.gpg-id
racine.
pass init --path=critical-server bob alice
pass init --path=admin bob charles darlene
Ce mécanisme peut être utilisé pour faire une gestion de droits. Ainsi certains utilisateurs n’auraient pas accès à tous les mots de passes.
Le contenu de .gpg-id
peut être un nom, une adresse de courriel ou plus
généralement l’identifiant d’une clé GPG, une clé par ligne. Il faudra tout de
même que ces identifiants soient reconnus par gpg
. La commande gpg
--list-keys
permet de lister toutes les clés connues.
$> tree ~/.password-store
/home/user/.password-store
├── .gpg-id
├── admin
│ ├── .gpg-id
│ └── web.gpg-id
├── critial-server
│ ├── .gpg-id
│ ├── root.gpg
...
gpg
peut se synchroniser sur un serveur de clés pour récupérer une clé publique.
Plusieurs coffres en même temps
Il peut être utile de gérer plusieurs coffres pass
. Par exemple un coffre
personnel et coffre pour le travail, chiffré avec la même clé ou une clé
différente.
Submodule
La première solution envisagée est l’utilisation des submodules git
. Dans ce
cas pass
va modifier le sous-module le plus imbriqué en premier. Par contre
pass
ne va pas mettre à jour les dépôts supérieurs à jour.
cd ~/.password-store
mkdir external
git -C external init
git -C external commit --allow-empty -m first
git submodule add external
pass init --path external bob alice
pass generate external/root
git -C external log
L’utilisation des submodule
est un moyen simple pour rassembler différents
coffres en un seul. Cependant, cette méthode vient avec tous les problèmes liés
aux submodule
et demande une bonne connaissance de git. La synchronisation
des sous-coffres peut se faire grace à la commande :
pass git submodule foreach git pull
Répertoires séparés
pass
nous offre la possibilité de définir un répertoire de coffre différent
de celui par défaut. Le variable PASSWORD_STORE_DIR=
peut être utilisée pour
définir un coffre différent.
PASSWORD_STORE_DIR=~/private-pass pass generate mail.com/bob@example.com
PASSWORD_STORE_DIR=~/work-pass pass generate servers1/root
Évidemment, on perd un peu de la simplicité originale. Heureusement on peut
facilement créer des alias
shell pour simplifier cette commande.
Définir quelque part dans votre fichier shell d’initialisation :
alias ppass="PASSWORD_STORE_DIR=~/private-pass pass"
alias wpass="PASSWORD_STORE_DIR=~/work-pass pass"
Maintenant on peut, à nouveau, facilement utiliser pass
avec la commande
ppass
ou wpass
en fonction du coffre désiré.
Complétion avec ZSH
Le problème des alias est que souvent les shells gèrent mal la complétion. En
effet, avec ZSH par exemple, la complétion est parfaitement gérée pour
l’outil pass
. Mais si on utilise un alias, ZSH va continuer à aller
chercher les entrées dans le répertoire par défaut.
Il faut pour éviter cela, ajouter une configuration de complétion à ZSH :
function custom-pass () {
case $1 in
"-c" | "show" | "insert" | "edit" | "generate" | "init" | "ls" | "grep" |"find" | "rm" | "mv" | "cp" | "git" | "help" | "version")
force_clipboard=""
;;
*)
force_clipboard="-c"
;;
esac
PASSWORD_STORE_DIR=${CUSTOM_PASS_DIR} pass ${force_clipboard} $@
}
zstyle ':completion::complete:custom-pass::' prefix "${CUSTOM_PASS_DIR}"
compdef _pass custom-pass
Maintenant la commande custom-pass
permet d’accéder directement au coffre
définit par la variable CUSTOM_PASS_DIR
. De plus ce script permet d’avoir
l’option -c
(Copie dans le presse papier) par défaut. Et bien sur la
complétion fonctionne !
Les problèmes de perte de clés ou corruption
Se pose évidemment la question : Que se passe-t-il si on perd sa clé privée ? La réponse est simple : On perd son accès à tous les mots de passes.
Il convient donc de prendre soin à ne PAS perdre sa clé privée. De réaliser toutes les sauvergades nécessaires de la clé ainsi que du coffre. Cela va de soi, le coffre et la clé ne doivent pas être sauvegardés au même endroit.
Comme expliqué plus haut, pass
et git
sont copains et fonctionnent très bien
ensemble. git
peut donc être utilisé pour faire la synchronisation et la
duplication sur plusieurs serveurs.
Cependant l’utilisation de git
amène un autre problème. En effet si votre clé
privée venait à être corrompue, vous voudriez re-chiffrer tout le coffre avec
une nouvelle clé. Cependant comme git
sauvegarde tout l’historique, les mots
de passes enregistrés avec la clé corrompue seront toujours accessibles par
quiconque aura eu un accès au dépôt git.
Donc si votre clé est corrompue, il faudra renouveler tous les mots de passes.
Les extensions
Il existe une liste incroyable d’extension créé pour pass
.
Pour ma part j’utilise uniquement OTP.
Conclusion
pass
est un outil de ligne de commande très simple d’utilisation qui peut
être facilement étendu et personnalisé. C’est un outil indispensable aux
administrateurs systèmes, mais pas que…. On peut également l’utiliser avec une
extension pour gérer les mots de passes firefox (Je n’utilise pas cette
extension).
Il convient tout de même de faire attention aux risques liés à la perte ou la corruption de la clé privée.