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.