Table des matières

2023/10/16 (atelier) : Gopass

Heure de début : 14h

Présences :

Météo

Moment informel durant lequel on exprime en peu de mots comment on se sent et si on a une attente forte pour la réunion. Ce n'est pas un moment de discussion mais d'expression individuelle et ce n'est pas obligatoire 🙂

Attente(s) forte(s)

Si l'une ou l'autre personne exprime une attente forte, merci de vous en occuper en priorité ou de la noter dans le hub ou dans un point approprié.

Fin: 17h00

Qu'est-ce qu'on souhaite faire ?

On se sent pas d'attaque pour Keycloak aujourd'hui…

Gopass serait nécessaire pour autonomiser Célo.

La version simplifiée des statuts, c'est pas de l'infra, mais il faudrait quand même le faire aussi…

On décide de faire l'atelier sur Gopass et de voir où on arrive et à quelle heure. En fonction de ça, si on a de l'énergie on fera une ébauche de la version simplifiée des statuts.

Gopass

Explication du password manager

Gopass est un outil en ligne de commande, pour lequel certaines interfaces graphiques existent néanmoins. Le site, c'est :

https://www.gopass.pw/

Cela n'a rien à voir avec une carte de train.

Il existe une extension pour Firefox. Il y a aussi une app pour Windows. Il y a une app Android apparemment, mais c'est compliqué de l'utiliser en pratique, on va voir pourquoi.

https://github.com/gopasspw/gopass/blob/master/docs/features.md#integrations

C'est un fork de pass qui est un outil purement en ligne de commande, réécrit en Go, et qui ajoute la gestion de git.

Cela fonctionne sur base des clés GPG.

Gopass permet le multi repo (on peut avoir un repos perso, un repos Neutrinet, etc.). On peut gérer la hiérarchie et les noms des repos de manière individuelle, càd que chacun va nommer les repos sur son ordi, et cela n'aura pas d'impact sur la gestion des repos pour les autres personnes.

Par contre, cela demande un peu de gymnastique mentale, parce qu'il faut se rappeler que le repo Neutrinet ne contient que les mots de passe collectifs, et il faut donc un autre repo (Brocoli ? Neutrinet-Perso ?) pour les repos purement personnels.

Pour utiliser Gopass, on a besoin d'utiliser sa clé GPG personnel. C'est l'inconvénient pour l'utiliser car par exemple, on n'a pas vraiment envie de laisser une clé privée sur un smartphone Android…

À la limite, ce n'est pas trop grave pour Neutrinet en tant que collectif, mais à titre individuel cela ne permet d'avoir son propre gestionnaire de mot de passe sur smartphone.

Installation et configuration

https://www.gopass.pw/#install

L'installation est assez simple, cela vient du fait que c'est un outil purement en ligne de commande, et c'est un binaire Go.

C'est mieux de l'installer via un dépôt linux, car ce genre d'outil est assez critique et il est donc important de le garder à jour.

Un des prérequis c'est d'avoir une clé GPG fonctionnelle. La paire de clés doit avoir un niveau de confiance ultime:

gpg --edit-key <id de la clé>
> trust
> 5

Dans les prérequis, il faut aussi que la personne ait les permissions pour publier des commits sur la branche principale (main ou master) du dépôt Git.

On commence par créer un password store à la racine. Gopasse fonctionne en hiérarchie, donc il a besoin d'une racine pour fonctionner correctement:

gopass init

On va commencer par récupérer le password store de Neutrinet:

gopass clone --storage gitfs ssh://git@gitlab.domainepublic.net:3265/Neutrinet/password.git neutrinet

On se voit demander le mot de passe de la clé SSH utilisée pour Gitlab.

Ensuite, on introduit le pseudo et l'email utilisé par Git.

Si cela échoue, on obtient un password store qui n'est pas correctement initialisé. Le plus simple, c'est de repartir de zéro…

On vérifie si le repo est monté:

gopass mounts list

Si le repo neutrinet est présent, on le supprime:

gopass mounts rm neutrinet

Ensuite on supprime le dossier correspondant (la commande précédente ne supprime pas les données du repo):

rm -rf ~/.local/share/gopass/stores/neutrinet

Comme on n'a pas encore notre clé publique dans le repo, il faut que quelqu'un ayant déjà accès au repo ajoute la clé.

On commence par publier la clé avec la commande suivante:

gopass sync

L'outil nous demande si on souhaite importer les clés des personnes qui ont un accès au password store. Il faut bien entendu accepter, sinon les mots de passe qu'on créera ne seront pas chiffrés pour ces personnes.

Une des personnes ayant accès au password store fait de même:

gopass sync

La clé se trouve dans le dossier du repo local:

ls ~/.local/share/gopass/stores/neutrinet/.public-keys

On donne ensuite accès au password store pour la nouvelle clé:

gopass recipients add --store neutrinet 0x37E2F7A4EB92C365

L'outil va chiffrer à nouveau tous les secrets pour cette nouvelle clé, avec un beau Goooooooooooopass coloré (un o pour chaque secret), ce qui nous fait penser qu'on peut garder cet outil juste pour ça parce que c'est trop mignon et joli.

On fait enfin un sync pour envoyer les modifications sur Gitlab et un autre sync chez la personne qui a reçu les accès:

gopass sync

Note: la plupart des commandes permettent de sélectionner juste un password store. Par exemple, on peut juste synchroniser le password store de Neutrinet si on en a beaucoup:

gopass sync -s neutrinet

On peut vérifier qu'on a bien la liste des mots de passe:

gopass list

Et on peut rechercher un mot de passe au hasard pour vérifier que cela fonctionne:

gopass show hedgedoc

Et effectivement, lorsqu'on sélectionne le premier mot de passe, il nous demande bien la phrase de passe pour utiliser la clé privée (GPG) qui va nous servir à déchiffrer le mot de passe.

Comment récupérer un mot de passe

On l'a vu, la commande gopass show permet de récupérer un mot de passe.

L'option -c permet de copier le mot de passe directement dans le presse-papier pendant 45s par défaut (il sera effacé après ce laps de temps). Le mot de passe ne sera pas affiché à l'écran.

Il faut cependant installer un paquet pour que ça fonctionne:

Mais quand Célo fait ça, elle a warning 🙀 😿

❌ WARNING: No clipboard available. Install xsel or xclip, provide $GOPASS_CLIPBOARD_COPY_CMD and $GOPASS_CLIPBOARD_CLEAR_CMD or use -f to print to console

Il suffit de faire comme il dit, et installer xclip.

Si on compare ce qui a été copié avec le résultat de gopass show, on voit qu'il n'a copié que le mot de passe !

Pour n'afficher que le mot de passe, on fait:

gopass show -o hedgedoc

Certains secrets contiennent des infos sur le contexte du mot de passe (site web, login, commentaires, etc.), donc c'est parfois utile d'y avoir accès.

Comment rajouter un nouveau mot de passe

On va créer un repo vide pour ne pas casser celui de Neutrinet.

On commence par créer le password store:

gopass init --store test <clé gpg>

Une adresse mail est demandée, on utilise celle qui sera utilisé pour git.

Si on ne spécifie pas la clé GPG et qu'on en a plusieurs, gopass demande quelle clé utiliser.

On peut vérifier que le repo est bien créé avec:

gopass mounts list

Si on fait un sync, on remarque qu'il n'y a pas de remote:

gopass sync -s test
[test] 
   gitfs pull and push ... Skipped (no remote)
✅ All done

C'est normal, il faut aller créer le repo sur Gitlab et indiquer à Gopass où se trouve ce repo. On peut utiliser la commande cachée suivante:

gopass git -s test remote add origin <url du repo.git>

Ici on ne va pas tester, car cela sort un peu du cadre de l'atelier. Exercice pour la lectrice. Mais la lectrice peut aussi plus simplement créer le repo git depuis gitlab et le cloner comme on a fait précédemment 😛

Et à partir là, on peut créer notre premier mot de passe.

Il y a plusieurs façons de faire, on va commencer avec un petit assistant qui est fourni par Gopass. C'est un assistant qui va crééer les mots de passes dans un dossier website, donc pensé pour les mots de passes des sites (l'essentiel des mots de passes que nous utilisons).

gopass create -s test
🌟 Welcome to the secret creation wizard (gopass create)!
🧪 Hint: Use 'gopass edit -c' for more control!
[ 0] Website login
[ 1] PIN Code (numerical)

Please select the type of secret you would like to create (q to abort) [0]: 
0
🧪 Creating Website login
  [1] Website URL                            []: https://example.com
  [2] Username                               []: admin
  [3] Generate Password?                     [Y/n/q]: 
    [a] Human-pronounceable passphrase?      [y/N/q]: 
    [b] How long?                            (q to abort) [24]: 32
    [c] Include symbols?                     [y/N/q]: y
    [d] Strict rules?                        [y/N/q]: 
✅ Credentials saved to "test/websites/example.com/admin"
✔ Copied test/websites/example.com/admin to clipboard. Will clear in 45 seconds.

C'est super pratique pour créer un mot de passe pour un site web en quelques secondes.

Par contre, comment on fait pour créer un mot de passe pour un serveur par exemple ?

On peut créer des mots de passe manuellement avec soit la commande gopass insert soit gopass generate.

Par exemple, pour gopass insert:

gopass insert test/servers/brocoli.corp/root
Enter password for test/servers/brocoli.corp/root: 
Retype password for test/servers/brocoli.corp/root: 

Le rangement des mots de passe est complètement arbitraire, et du coup on peut vite avoir le bordel. C'est un peu comme les dossiers sur son ordinateur…

Une bonne pratique, c'est au moins avoir une structure comme ceci:

<store>/<categorie>/<domaine|machine|etc>/utilisateur

Dans notre cas, on a comme catégorie servers et comme nom de machine brocoli.corp. On pourrait avoir des sous-catégories, du style:

test/servers/cluster-patata/patate.corp/raoul

Ici, on a rajouté un dossier cluster-patata pour ranger tous les serveurs dans le même dossier.

On va en profiter pour utiliser l'autre commande:

gopass generate test/servers/cluster-patata/patate.corp/raoul
How long should the password be? (q to abort) [24]: 32
✅ Password for entry "test/servers/cluster-patata/patate.corp/raoul" generated
Not printing secrets by default. Use 'gopass show test/servers/cluster-patata/patate.corp/raoul' to display the password.

Cette commande permet de générer un mot de passe assez facilement.

Encore mieux, on peut lui dire de copier le mot de passe dans notre presse-papier:

gopass generate -c test/servers/cluster-patata/patate.corp/raoul

On peut aller assez loin, par exemple il y a moins de générer un mot de passe mémorisable (si on est anglais en tout cas) avec des symboles:

gopass generate --generator memorable -s -p test/memorisable

L'option -p permet d'afficher le mot de passe à l'écran.

Bon en vrai, avec les symboles c'est compliqué à mémoriser 😅

Par exemple, on peut obtenir quelque chose comme : roof0!type4-art4}alien5/say0|lawsuit7\

Il y a aussi un petit outil qui existe pour générer des mots de passe (sans les sauvre):

gopass pwgen

Il y a plein d'options possibles, on peut même créer des phrases de passe:

gopass pwgen --xkcd --lang en --sep " " 

On peut voir notre chef-d'œuvre avec la commande:

gopass list -s test
test/
├── memorisable
├── servers/
│   ├── brocoli.corp/
│   │   └── root
│   └── cluster-patata/
│       └── patate.corp/
│           └── raoul
└── websites/
    └── example.com/
        └── admin

Attention: si on a créé un password store avec une clé GPG dont on ne possède PAS la clé privée, on ne pourra déchiffrer les mots de passe… Il est donc important de vérifier qu'on puisse bien déchiffrer le mot de passe qu'on a créé, par exemple avec gopass show qu'on a vu tout à l'heure.

Comment modifier un mot de passe

Pour modifier un mot de passe, c'est:

gopass edit test/memorisable

Cela va ouvrir un éditeur de texte, en général nano ou vim. À voir comment on a configuré la variable globale EDITOR (exercice pour la lectrice).

Après, si on utilise une des commandes pour créer un mot de passe sur le même chemin qu'un mot de passe existant, il va nous demander si on veut l'écraser.

On peut aussi déplacer un mot de passe ou un ensemble de mots de passe avec la commande:

gopass mv test/servers/brocoli.corp test/servers/brocolis.corp

Comment supprimer un mot de passe

C'est très compliqué:

gopass rm test/memorisable

Attention: le mot de passe est supprimé, mais comme on utilise git en arrière-plan, il reste accessible dans l'historique. Donc, toute personne qui avaient accès à ce mot de passe avant la suppression peuvent potentiellement toujours y accéder.

Ajouter et supprimer des personnes

Pour l'ajout, on peut voir ce qui a été fait plus haut.

Mais on va quand même rajouter une personne à test pour pouvoir la supprimer 😛

gopass recipients add --store test Célo

Et on peut enfin la supprimer:

gopass recipients rm --store test

Attention: Comme dit précédemment, les personnes ont encore potentiellement accès aux mots de passe avant leur suppression ! Il faut donc considérer que tous les mots de passe sont corrompus jusqu'à la suppression de la clé GPG.

Garder à jour ses clés GPG

Les clés GPG ont généralement une date d'expiration. Il arrive parfois que gopass n'a plus les clés à jour… Quand c'est le cas, il affiche l'erreur suivante:

Not using invalid key HgO for encryption. (Check its expiration date or its encryption capabilities.)

Dans ce cas, il faut faire:

gpg --refresh-keys

et/ou demander à la personne de mettre à jour sa clé GPG…

Il faut ensuite chiffrer à nouveau tous les mots de passe pour cette nouvelle clé (comme si on donnait accès à une nouvelle clé):

gopass fsck --store test --decrypt

Autocomplétion

On peut activer l'autocomplétion en rajoutant cette ligne dans son fichier .bashrc:

source <(gopass completion bash)

Extension pour Firefox

Pour utiliser l'extension dans le navigateur: https://addons.mozilla.org/en-US/firefox/addon/gopass-bridge/

Il faut installer le paquet gopass-jsonapi, et configurer le navigateur:

gopass-jsonapi configure

Et il suffit de suivre les instructions.

Voir la doc pour plus d'infos: https://github.com/gopasspw/gopass-jsonapi/blob/master/README.md

Triche

Il y a un petit copion pour les commandes moins courantes mais toutefois utiles:

https://woile.github.io/gopass-cheat-sheet/

Prochaine réunion

Prochain atelier Keycloak: 06/11

Lieu : Chez Célo

Météo de fin

Moment informel durant lequel on exprime en peu de mots comment, à titre personnel, la réunion a été vécue que ce soit positif ou négatif. Si une ou plusieurs tension est née durant la réunion, il est peut-être nécessaire d'envisager l'une ou l'autre réunion pour y remédier.