Gestion des mots de passe avec pass

dim. 25 févr. 2018 by Marmotte

Plusieurs solutions existent pour la gestion des mots de passe, chacune présentant ses avantages et inconvénients.

Je présente ici pass, un script bash permettant de gérer des mots de passe chiffrés avec GPG dans un dépôt git. Je l'ai choisi pour plusieurs raisons :

  • Très simple d'utilisation.
  • Très léger (et sans interface graphique, même s'il en existe).
  • L'utilisation de GPG permet de s'assurer de toujours pouvoir lire les mots de passe, même si pass ne fonctionne pas sur une machine (absence de pass, bug, abandon, etc.).
  • L'utilisation de git permet un versionning et un partage simples, sans devoir mettre en place un nouveau service (puisque j'utilise déjà un serveur git personnel).
  • La possibilité et la souplesse de l'utilisation en équipe.

Installation

Sous Debian, il suffit d'installer le paquet pass. D'autres paquets permettent de bénéficier de fonctionnalités supplémentaires :

  • git : Versionnement et partage simple du dépôt de mots de passe.
  • pwgen : Génération automatique de mots de passe aléatoires.
  • xclip : Copie d'un mot de passe dans le presse-papier de Xorg pendant une durée définie.

Tous ces paquets sont disponibles dans les dépôts Debian :

$ sudo apt install --no-install-recommends pass git pwgen xclip

Initialisation du dépôt

L'utilisation de pass nécessite tout d'abord d'intialiser un dépôt, dans lequel les mots de passe seront conservés, au moyen de la commande pass init.

$ pass init <gpg-id>

Le dépôt de mot de passe est placé par défaut à l'emplacemenbt ~/.password-store, mais il est possible de définir un autre emplacement dans la variable d'environnement PASSWORD_STORE_DIR.

Dans le cas où le dépôt de mots de passe doit être partagé entre plusieurs personnes, il est possible de définir plusieurs identités GPG, soit pour tout le dépôt, soit pour une partie seulement. Cela permet donc l'utilisation d'un unique dépôt de mots de passes partagé, sans pour autant permettre à tous les utilisateurs de lire tous les mots de passe qu'il contient. Par exemple :

$ pass init admin1@example.com admin2@example.com user1@example.com user2@example.com
$ pass init -p Admin admin1@example.com admin2@example.com
$ pass init -p Projects/project1 admin1@example.com user1@example.com
$ pass init -p Projects/project2 admin1@example.com admin2@example.com user2@example.com
$ pass init -p Private/admin1 admin1@example.com
$ pass init -p Private/admin2 admin2@example.com
$ pass init -p Private/user1 user1@example.com
$ pass init -p Private/user2 user2@example.com

Appeler de nouveau la commande pass init permet de modifier la liste des clés GPG utilisées.

Initialisation du dépôt git

Pour permettre le versionnement et le partage des mots de passe avec git, il est nécessaire d'initialiser un dépôt git dans le dépôt de mots de passe :

$ pass git init
$ pass git remote add origin <user@host:git-path/password-store>
$ pass git config branch.master.rebase true
$ pass git push --all -u

Toutes les commandes git sont utilisables en les préfixant par la commande pass git au lieu de simplement git. Lors de la modification du contenu du dépôt, pass fait automatiquement un commit. Les opérations de push/pull restent par contre manuelles.

Note : Définir le paramètre branch.master.rebase à true permet que git effectue un rebase automatiquement lors de chaque opération de pull. De cette manière, il n'y aura pas de commits de merge inutiles dans le dépôt.

Récupération d'un dépôt existant

Lorsque le dépôt de mots de passe existe déjà, il est possible de le récupérer au moyen d'un simple git clone :

$ git clone <user@host:git-path/password-store> ~/.password-store
$ pass git config branch.master.rebase true

Ajout d'un mot de passe

Il est possible d'ajouter un mot de passe dans le dépôt au moyen de la commande pass insert. Le mot de passe sera alors demandé deux fois, de manière interactive.

$ pass insert <Path/password-name>

Le paramètre --multiline (abrégé -m) permet d'ajouter le mot de passe depuis l'entrée standard, ou depuis l'éditeur de texte par défaut, si aucun flux n'est envoyé sur la sortie standard. Cela permet aussi d'ajouter plusieurs lignes de contenu dans le fichier, la première ligne correspondant au mot de passe, et le reste à des métadonnées.

$ pass insert -m <Path/password-name>
$ echo 'bad password' | pass insert -m <Path/password-name>

Lister les mots de passe

Il est possible d'afficher la liste totale ou partielle des mots de passe au moyen de la commande pass ls, qui est la sous-commande par défaut lorsqu'on donne un répertoire comme paramètre :

$ pass
$ pass ls
$ pass <Path>
$ pass ls <Path>

Pour afficher les mots de passe en cherchant un terme précis dans le chemin, il faut utilser la commande pass find :

$ pass find <terme>

Enfin, pour chercher un terme dans les fichiers de mots de passe, on peut utiliser la commande pass grep :

$ pass grep <terme>

Note : Cette dernière commande met beaucoup plus de temps à s'exécuter, puisqu'elle nécessite de déchiffrer tous les fichiers de mots de passe, afin d'y rechercher le terme spécifié.

Lire un mot de passe

Lire le contenu d'un fichier de mots de passe est possible avec la commande pass show, qui est la sous-commande par défaut lorsqu'on donne un fichier de mots de passe comme paramètre. Sans autre parmètre, cette commande affiche le contenu complet du fichier de mots de passe dans le terminal. En ajoutant le paramètre --clip (abrégé -c), le mot de passe (première ligne du fichier) sera automatiquement copié dans le presse-papier de Xorg pendant une durée définie (par défaut 45 secondes), puis le contenu précédent y sera remis automatiquement. Rien n'est alors affiché dans le terminal.

$ pass <Path/password-name>
$ pass --clip <Path/password-name>

La durée de présence du mot de passe dans le presse-papier est modifiable au moyen de la variable d'environnement PASSWORD_STORE_CLIP_TIME.

Modifier un mot de passe

La modification du contenu d'un fichier de mot de passe se fait au moyen de la commande pass edit, qui ouvre l'éditeur de texte par défaut afin d'y faire les modifications voulues.

$ pass edit <Path/password-name>

Génération automatique d'un mot de passe

Pour générer un mot de passe aléatoirement, il faut utiliser la commande pass generate :

$ # Génération simple d'un nouveau mot de passe aléatoire
$ pass generate <Path/password-name> <size>
$ # Génération d'un mot de passe aléatoire et copie du mot de passe généré dans le presse-papier
$ pass generate --clip <Path/password-name> <size>
$ # Génération d'un mot de passe aléatoire en remplacement d'un mot de passe existant
$ pass generate --in-place <Path/password-name> <size>
$ # Génération d'un mot de passe aléatoire sans caractères spéciaux
$ pass generate --no-symbols <Path/password-name> <size>

Déplacer un mot de passe

Il est possible de déplacer un mot de passe en utilisant la commande pass mv :

$ pass mv <Path/password-name>

Supprimer un mot de passe

Lorsqu'un mot de passe ne sera plus utile, utiliser la commande pass rm permet de le supprimer :

$ pass rm <Path/password-name>

Migration depuis d'autres gestionnaires de mots de passe

Il existe différents scripts permettant la migration des données depuis un autre gestionnaire de mots de passe dans pass. Ils sont listés sur le site officiel de pass.