Aller au contenu principal

Passbolt

Passbolt est un gestionnaire de mot de passe centralisé open-source qui peut se positionner comme alternative à Vault dans un environnement Devops. En effet, il offre même dans sa Communauty Edition une CLI et une API JSON. À souligner, cette application est made in Europe puisque l'éditeur est basé au Luxembourg.

Le code est disponible sur github et a été entièrement audité par Cure53, une société de cybersécurité indépendante basée en Allemagne. Les rapports sont librement accessibles sur cette page.

Présentation de Passbolt Communoty Edition

On retrouve également dans cette version CE :

  • la gestion des utilisateurs et groupes,
  • le partage des mots de passe,
  • un bon générateur de mots de passe offrant un niveau de complexité suffisant,
  • une politique de rotation des mots de passe,
  • la gestion de favoris,
  • une fonction de recherche,
  • des notifications par email,
  • l'import/export keypass,
  • des extensions de navigateur : chrome, firefox, edge,
  • l'application mobile
  • une interface en français

Par contre, pour accéder par exemple à l'authentification multi-facteur, les journaux d'activités ou encore le support LDAP, il faudra se tourner soit vers la version PRO pour 30€ par mois pour 10 utilisateurs, soit vers la version cloud pour 9€ par mois pour 3 utilisateurs (puis 3€ par utilisateurs supplémentaires) mais sans le support LDAP.

Je vous propose de voir comment tester cette solution de gestion de mots de passe dans sa version CE.

Test de Passbolt

Il existe plein de méthodes pour tester Passbolt sans se prendre la tête. Il est par exemple possible d'utiliser une machine Vagrant, le Vagrantfile est fourni, en utilisant un script Bash qui se charge de tout installer. Il est aussi possible d'utiliser une ou des image(s) Docker ou de faire l'installation manuellement via un package disponible pour la majorité des distributions. Il existe aussi des images distroless, bien pratique si vous faites le choix de l'installer dans un cluster Kubernetes

Je vais tester la première solution.

Pour récupérer le Vagrantfile c'est par .

git clone https://gitlab.com/AnatomicJC/passbolt-setup.git

Avant de le lancer un petit coup d'œil au contenu du Vagrantfile :

$script = <<-SCRIPT
curl https://gitlab.com/AnatomicJC/passbolt-setup/-/archive/main/passbolt-setup-main.tar.gz | tar xzf -
cd passbolt-setup-main
mv passbolt.conf.vagrant passbolt.conf.override
./passbolt-setup.bash ce
SCRIPT

Vagrant.configure("2") do |config|
  config.vm.box = "bento/debian-11"
  #config.vm.box = "bento/rockylinux-8"
  config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
  config.vm.network "forwarded_port", guest: 443, host: 4433, host_ip: "127.0.0.1"
  config.vm.provision "shell", inline: $script
end

Difficile de faire plus simple non ? Mais je vais changer de box de base, car les bento ne fournit pas d'images pour libvirt. Donc, ce sera plutôt une generic/debian11.

C'est parti :

vagrant up

...
    default: Importing /etc/passbolt//gpg/serverkey_private.asc
    default: Keyring init OK
    default: Passbolt installation success! Enjoy! ☮
    default:
    default:      ____                  __          ____
    default:     / __ \____  _____ ____/ /_  ____  / / /_
    default:    / /_/ / __ `/ ___/ ___/ __ \/ __ \/ / __/
    default:   / ____/ /_/ (__  |__  ) /_/ / /_/ / / /
    default:  /_/    \__,_/____/____/_.___/\____/_/\__/
    default:
    default:  Open source password manager for teams
    default: -------------------------------------------------------------------------------
    default: User saved successfully.
    default: To start registration follow the link provided in your mailbox or here:
    default: http://127.0.0.1:8080/setup/install/69091134-ad98-4ef4-963b-a0ba5161f4f0/5137978a-0660-4c23-b39c-136db9c68a7a

Efficace. Merci Jean Christophe Vassort

Je clique que le lien et il me propose direct d'installer l'extension Chrome.

Suivant, le mot de passe admin un kit de récupération, un jeton composé de trois lettres + une couleur et hop, c'est prêt. Je crée un premier mot de passe.

Je crée un premier mot de passe en cliquant sur [Créer].

Accès aux mots de passe depuis un playbook Ansible

Tout est bien documenté et en conséquence je m'appuie sur le billet du même auteur du VagrantFile.

On installe le rôle depuis ansible-galaxy et le module python py-passbolt :

ansible-galaxy collection install anatomicjc.passbolt
...

anatomicjc.passbolt:0.0.5 was installed successfully

pip3 install py-passbolt

Récupérons les informations nécessaires à la connexion au serveur passbolt. Il faut dans le profil utilisateur puis dans le menu [Inspecteur de clé] et cliquer sur [Privé].

Nous allons chiffrer les données avec Ansible-Vault. Pour cela, on va aussi créer un fichier de mot de passe nommé vault_pass et une configuration Ansible dont voici le contenu :

[defaults]
inventory=inventory
interpreter_python=auto_silent
vault_identity_list = main@vault_pass

On encode les informations

cat private_passbolt.txt | ansible-vault encrypt
$ANSIBLE_VAULT;1.2;AES256;main
35316631653864386662326366646334633839343863633066616134333839316633396335343461
...
34643535323866353565633237333337366435663162643065386535303535653465343562313232
33396261373935376163
echo -n 'password' | ansible-vault encrypt
$ANSIBLE_VAULT;1.2;AES256;main
38653833313931303530343762306663643431653937616338353264303162376165346663303330
6634626565613534303836623230333161366365316366650a343439636432663966373935366534
63396331393664393165386336333836316537396566333563306665373530353832373637313335
6265313733646439660a383131636235383334326336323565646231643564396432636662306539
6339

On crée l'inventaire :

mkdir -p inventory/

vi hosts.yml

On y met ce contenu :

all:
  vars:
    private_key_vault: !vault |
      $ANSIBLE_VAULT;1.2;AES256;main
      39636534343934636630663262623366653836646264386462663731363366633433323965663139
      ...
      30623237383030356264
    passphrase_vault: !vault |
      $ANSIBLE_VAULT;1.2;AES256;main
      61366163363437623364613637386463333965363130383664393135313263323465303135646231
      3765616236656139663536373233383632623834663633350a666661643731383663316463663835
      34306662363232633930353462326634333061633230306238633831643536316333376261666364
      3839363566396636380a626161353639633431363238353462303737303766316563356230316132
      3461
  hosts:
    localhost:
      ansible_connection: local

Maintenant le playbook qu'on example-playbook.yml:

- hosts: all
  gather_facts: false
  environment:
    PASSBOLT_BASE_URL: "http://127.0.0.1:8080"
    PASSBOLT_PRIVATE_KEY: "{{ private_key_vault }}"
    PASSBOLT_PASSPHRASE: "{{ passphrase_vault }}"

  tasks:
    - name: "Passbolt lookup plugin / fetch one"
      ansible.builtin.debug:
        var: lookup('anatomicjc.passbolt.passbolt', 'Test')

Allez on teste :

TASK [Passbolt lookup plugin / fetch one] **************************************
ok: [localhost] => {
    "lookup('anatomicjc.passbolt.passbolt', 'Test')": {
        "created": "2022-08-20T13:12:03+00:00",
        "deleted": false,
        "description": "",
        "forder_parent_id": "",
        "modified": "2022-08-20T13:12:03+00:00",
        "modified_by": "69091134-ad98-4ef4-963b-a0ba5161f4f0",
        "name": "Test",
        "password": "zX3\"#v)er(^z^=e_DC",
        "personal": "",
        "resource_type_id": "a28a04cd-6f53-518a-967c-9963bf9cec51",
        "uri": "",
        "username": "stephane.robert"
    }
}

PLAY RECAP *********************************************************************
localhost : ok=1    changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

Cool, on a nos infos. Pour récupérer directement un champ, il suffit d'ajouter le nom du champ après le lookup :

        var: lookup('anatomicjc.passbolt.passbolt', 'Test').password

Il y a quelques exemples dans le playbook fourni par JC.

Utilisation de la CLI go-passbolt

Maintenant, on teste la CLI de passbolt. Le code se trouve ici.

Installons le package debian, d'autres sont disponibles, sur ma machine :

wget https://github.com/passbolt/go-passbolt-cli/releases/download/v0.1.9/go-passbolt-cli_0.1.9_linux_amd64.deb
dpkg -i go-passbolt-cli_0.1.9_linux_amd64.deb

Maintenant configurons l'accès :

passbolt configure --serverAddress http://127.0.0.1:8080 --userPassword 'password' --userPrivateKeyFile passbolt_private.txt

Maintenant récupérons notre user/mdp :

passbolt list resource
ID                                   | FolderParentID | Name | Username        | URI
1a1dd36f-9ccf-45c6-822b-55d0d84d4a94 |                | Test | stephane.robert |

passbolt get resource --id 1a1dd36f-9ccf-45c6-822b-55d0d84d4a94
FolderParentID:
Name: Test
Username: stephane.robert
URI:
Password: zX3"#v)er(^z^=e_DC
Description:

Vraiment sympa ce gestionnaire de mots de passe centralisé. Une belle alternative à Vault pour la gestion des mots de passes. Reste plus qu'à créer une stack sur AWS ou GCP avec de la redondance en utilisant Terraform par exemple, ou le monter dans un cluster kubernetes.