Vaultwarden pour sécuriser et partager une collection de mots de passe🔗

Posted by Médéric Ribreux 🗓 In blog/ Debian/

#debian #security #computers

Introduction

J'utilise password-store (pass pour les intimes) comme solution de stockage de mot de passe. C'est une application assez basique qui repose sur du shell POSIX et GPG pour stocker des données d'identifiants et de mots de passe dans une arborescence de fichiers.

C'est très geek, mais ça fait facilement le travail et c'est très sécurisé tout en s'appuyant sur des standards. Avec le temps, j'ai porté le dépot personnel de password-store dans un dépôt git sécurisé, ce qui m'a permis d'avoir accès à mes mots de passe depuis plusieurs ordinateurs. Et pour finir, je l'ai également déployé sur mon smartphone Android.

Ca marchait plutôt bien, mais je me suis aperçu qu'il manquait quelque-chose: le partage de comptes/mots de passe. En effet, password-store, c'est bien comme solution personnelle. Mais dès qu'on veut donner accès à une partie de l'arborescence, il n'y a rien de prévu de simple à utiliser, pour un utilisateur non geek.

Je me suis mis à chercher des solutions et j'ai finalement trouvé Bitwarden qui est une solution de gestion de mots de passe synchronisée et partagée et qui à peu près sécurisée, notamment tout ce qui est hébergé sur le serveur est chiffré de bout en bout. Qui plus est, j'ai trouvé que les clients Bitwarden étaient corrects et disponibles sur à peu près toutes les plate-formes (ce qui est important quand vous voulez partager des mots de passe avec des gens dont vous ne maîtrisez pas le matériel).

Encore mieux, Bitwarden est un logiciel libre (ou au moins Open Source) peut être hébergé sur un serveur dédié.

Muni de ces précieux constats, je me suis dit que ça valait le coup d'explorer cette solution de gestion de mots de passe.

De Bitwarden à Vaultwarden

Pour commencer, je me suis mis à inspecter le dépôt du code du serveur BitWarden. Et là, c'est le drame: c'est du C# avec ASP.Net et ça utilise SQL Server. Du 100% MS Windows pas compatible avec rien sous GNU/Linux. Ca commence mal, je suis prêt à laisser tomber.

Pourtant, je tombe sur vaulwarden et en stockant les données dans plusieurs SGBD libres: SQLite3/MariaDB et PostgreSQL.

C'est pour cela que dans la suite de cet article, je vais me focaliser sur vaultwarden qui reste finalement la seule implémentation serveur de bitwarden que je peux déployer.

Mes contraintes, c'est de le déployer sur un serveur qui tourne sous Debian stable (Bookworm) avec peu de moyens (20GB de data max et 2GB de RAM).

Compilation de vaultwarden

Vaultwarden, c'est du Rust et Rust, ça se compile. J'aurais pu passer par Docker, mais je n'aime pas cette techno. Je préfère faire à l'ancienne: utiliser un binaire déployé dans un environnement maîtrisé. C'est d'ailleurs très bien documenté dans le wiki du dépôt de vaultwarden.

J'aurais pu utiliser un paquet deb trouvé sur Internet, mais en analysant les sources du paquet, je me suis rendu compte qu'il ne faisait qu'utiliser une version téléchargée de Rust sur Debian. Autant le faire à la main, ce sera plus simple.

Sur ma bécane limitée, j'ai également une autre contrainte: je n'ai pas beaucoup de RAM: seulement 2GB. Ça paraît important comme ça, mais pour la phase de link de Cargo qui fabrique un gros binaire statique pour vaultwarden, ça se termine en OOM violent. Surtout que je n'ai pas de swap sur cette machine. On va donc remédier à ça avec quelques outils:

# Sous root
## On commence par installer les dépendances de vaultwarden sous Debian Bookworm.
apt install build-essential git pkg-config libsqlite3-dev libssl-dev
## Ensuite, on alloue rapidement 2GB dans un fichier
fallocate --length 2GiB /mnt/swapfile
## On peut ensuite utiliser le fichier /mnt/swapfile comme swap
chmod 600 /mnt/swapfile
mkswap /mnt/swapfile
swapon /mnt/swapfile

A ce stade, vous avez de quoi compiler et builder vaultwarden. La suite est assez classique, sauf pour l'installation de Rust. En effet, rustc et cargo sont disponibles sous forme de paquets Debian. Ils sont assez anciens, mais dans la plupart des cas, ça fait l'affaire (pour mes développements et tests de Rust, c'est la configuration que j'utilise). Par contre, Vaultwarden implique d'utiliser la version N-2 de Rust. Au moment de la rédaction de cet article, Rust est en version stable 1.78, donc vaultwarden doit être compilé avec Rust 1.76 minimum. Sous Debian Bookworm, Rust est en version 1.63, donc on en est loin.

Donc, on va installer rustc et cargo "à la main". C'est un peu crade de balancer un script shell téléchargé en direct sur internet, mais c'est comme ça que c'est indiqué…

# Sous l'utilisateur qui va faire la compilation
# On installe Rust et Cargo via le script qui va bien
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# On définit l'environnement de base de Cargo
source ~/.cargo/env
# Ensuite, on peut télécharger les sources
git clone https://github.com/dani-garcia/vaultwarden.git
cd vaultwarden
git checkout v1.30.5
# Et on peut compiler le programme (ici avec l'option sqlite)
cargo build --features sqlite --release

Sur une machine avec des moyens limités, ça peut prendre facilement 20 minutes. Concrètement la phase la plus longue où il y a besoin de beaucoup de mémoire, c'est l'assemblage (le link). Elle peut prendre facilement 10 minutes. La première fois que j'y ai été confronté, j'ai cramé la machine méchamment, d'où l'ajout de swap.

Bien entendu, à la fin, une fois que c'est compilé et préparé, on n'oublie pas de supprimer le swap.

swapoff /mnt/swapfile
rm /mnt/swapfile

Déploiement de vaultwarden

Voilà, à ce stade de l'aventure, on dispose d'un binaire vaultwarden disponible dans target/releases/vaultwarden (chez moi, ça fait 29Mo quand même). Maintenant, il faut le déployer correctement.

Pour ma part, ça veut dire:

  1. Copier le binaire dans un endroit dédié et Créer un utilisateur dédié système (sans répertoire home) qui se nomme vaultwarden. Ça permet de limiter les droits d'accès au reste du système. On va également ajouter un répertoire pour les données de vaultwarden accessible par l'utilisateur concerné (c'est le répertoire des données de vaultwarden).
  2. Configuration de vaultwarden.
  3. Récupérer vault-web et l'installer.
  4. Créer un fichier de service systemd pour démarrer le service vaultwarden.
  5. Gérer la configuration du reverse-proxy du serveur HTTP (Apache2 dans mon cas). Notamment, je veux gérer l'accès au service via un VirtualHostName dédié.
  6. Ne pas oublier de faire les déclarations DNS et les modifications de certificats HTTPS.

Gestion du binaire

Allons-y pour la première partie qui reste assez simple:

# sous root
cp /home/user/vaultwarden/target/releases/vaultwarden /usr/local/bin
adduser --system --group vaultwarden
mkdir -p /var/local/vaultwarden
chown vaultwarden:vaultwarden /var/local/vaultwarden

Configuration de vaultwarden

Ça se fait de manière assez simple: la configuration tient dans un seul fichier de type .ini. Pour ma part, j'ai utilisé le nom par défaut, à savoir /etc/vaultwarden.conf et dont le contenu est ci-dessous. Vous pouvez vous documenter sur le fichier de conf qui contient toutes les variables en lisant le fichier d'exemple.

# shellcheck disable=SC2034,SC2148
# Vaultwarden Configuration File
####################
### Data folders ###
####################

## Main data folder
DATA_FOLDER=/var/local/vaultwarden

## Web vault settings
WEB_VAULT_FOLDER=web/
WEB_VAULT_ENABLED=true

#########################
### Database settings ###
#########################

## Database URL
## When using SQLite, this is the path to the DB file, default to %DATA_FOLDER%/db.sqlite3
DATABASE_URL=db.sqlite3

## Database connection retries (with 1 second delay)
DB_CONNECTION_RETRIES=15

## Database timeout
DATABASE_TIMEOUT=30

## Database max connections (size of the pool)
DATABASE_MAX_CONNS=10

#################
### WebSocket ###
#################

## Enable websocket notifications
ENABLE_WEBSOCKET=false

##########################
### Push notifications ###
##########################

## Disable Push, I don't need that for this installation
PUSH_ENABLED=false

########################
### General settings ###
########################

## Domain settings
DOMAIN=https://vaultwarden.mydomain.org

## Controls whether users are allowed to create Bitwarden Sends.
SENDS_ALLOWED=true

## Per-user attachment storage limit (KB)
## Max kilobytes of attachment storage allowed per user.
## When this limit is reached, the user will not be allowed to upload further attachments.
USER_ATTACHMENT_LIMIT=4096

## Per-user send storage limit (KB)
## Max kilobytes of send storage allowed per user.
## When this limit is reached, the user will not be allowed to upload further sends.
USER_SEND_LIMIT=4096

## Number of days to wait before auto-deleting a trashed item.
## If unset (the default), trashed items are not auto-deleted.
## This setting applies globally, so make sure to inform all users of any changes to this setting.
TRASH_AUTO_DELETE_DAYS=120

## Enable icon downloading

## Controls if new users can register
SIGNUPS_ALLOWED=false

## Controls if new users need to verify their email address upon registration
## Note that setting this option to true prevents logins until the email address has been verified!
## The welcome email will include a verification link, and login attempts will periodically
## trigger another verification email to be sent.
SIGNUPS_VERIFY=false

## Controls which users can create new orgs.
## Blank or 'all' means all users can create orgs (this is the default):
ORG_CREATION_USERS=admin@mydomain.org

## Invitations org admins to invite users, even when signups are disabled
INVITATIONS_ALLOWED=true

## Name shown in the invitation emails that don't come from a specific organization
INVITATION_ORG_NAME=Vaultwarden on mydomain.org

## Controls whether users can change their email.
EMAIL_CHANGE_ALLOWED=true

## Controls whether users can set password hint.
PASSWORD_HINTS_ALLOWED=false

## Require new device emails. When a user logs in an email is required to be sent.
## If sending the email fails the login attempt will fail!!
REQUIRE_DEVICE_EMAIL=false

## Log level
LOG_LEVEL=info

## Enable this to bypass the admin panel security. This option is only
## meant to be used with the use of a separate auth layer in front
DISABLE_ADMIN_TOKEN=false

###########################
### SMTP Email settings ###
###########################

SMTP_HOST=mydomain.org (ou n'importe quel serveur SMTP sur lequel vous avez un compte)
SMTP_FROM=vaultwarden@mydomain.org
SMTP_FROM_NAME=MyDomain Vaultwarden 
SMTP_USERNAME=username
SMTP_PASSWORD=user_password

## Choose the type of secure connection for SMTP. The default is "starttls".
SMTP_SECURITY=force_tls
SMTP_PORT=465

# Whether to send mail via the `sendmail` command
USE_SENDMAIL=false

# Which sendmail command to use. On Debian with Exim4, sendmail is not
# in the PATH of the common user.
SENDMAIL_COMMAND="/usr/sbin/sendmail"

## Embed images as email attachments
SMTP_EMBED_IMAGES=true

## SMTP debugging
SMTP_DEBUG=false

##########################
### Rocket settings ###
##########################

## Rocket is the Rust web framework for the front end. This is where
## the address:port of vaultwarden is configured.
## See https://rocket.rs/v0.5/guide/configuration/ for more details.
ROCKET_ADDRESS=127.0.0.1
## The default port is 8000, unless running in a Docker container, in
## which case it is 80.
ROCKET_PORT=8088
# ROCKET_TLS={certs="/path/to/certs.pem",key="/path/to/key.pem"}

# vim: syntax=ini

Récupérer web-vault et l'installer

Web-vault c'est l'interface Web de vaultwarden. Je pensais m'en passer, mais ça s'est révélé indispensable, notamment pour faciliter la création de comptes. Ça a aussi l'intérêt d'offrir directement un client Bitwarden aux utilisateurs qui n'auraient plus rien à disposition.

On peut retrouver des builds de web-vault sur le dépôt. L'intérêt des builds, c'est que vous n'avez pas à générer le Javascript/HTML/CSS depuis le dépôt, ce qui vous obligerait à utiliser NodeJS et NPM (qui ferait du mal à votre système, n'est-ce-pas).

Pour ma part, et relativement à ce que j'ai indiqué dans le fichier de configuration de vaultwarden, j'ai tout simplement téléchargé l'archive du build qui correspond à la version déployée de vaultwarden.

wget 'https://github.com/dani-garcia/bw_web_builds/releases/download/v2024.3.1/bw_web_v2024.3.1.tar.gz'
tar -xaf bw_web_v2024.3.1.tar.gz 
sudo su -
mkdir -p /var/local/vaultwarden/web
cp -r /home/user/web-vault/* /var/local/vaultwarden/web/
chown -R vaultwarden:vaultwarden /var/local/vaultwarden/web

Le répertoire /var/local/vaultwarden/web correspond à la configuration du service sur le paramètres WEB_VAULT_FOLDER=web/.

Systemd

Ensuite, pour le fichier de configuration de systemd, j'ai mis les trucs qui suivent:

[Unit]
Description=Bitwarden Server (Rust Edition)
Documentation=https://github.com/dani-garcia/vaultwarden

# Only sqlite
After=network.target

[Service]
User=vaultwarden
Group=vaultwarden

# Use an environment file for configuration.
EnvironmentFile=/etc/vaultwarden.conf

# The location of the compiled binary
ExecStart=/usr/local/bin/vaultwarden

# Set reasonable connection and process limits
LimitNOFILE=1048576
LimitNPROC=64

# Isolate vaultwarden from the rest of the system
PrivateTmp=false
PrivateDevices=false
ProtectHome=false
ProtectSystem=strict
DeviceAllow=/dev/stdout w
DeviceAllow=/dev/stdin r
DeviceAllow=/dev/stderr w
DeviceAllow=/dev/null rw

# Only allow writes to the following directories
WorkingDirectory=/var/local/vaultwarden
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 AF_LOCAL AF_NETLINK
ReadWritePaths=/var/local/vaultwarden /var/spool/exim4 /var/spool/exim4/input

[Install]
WantedBy=multi-user.target

Globalement, les restrictions et les autorisations sont pour la partie de courriel.

# Sous root
systemctl daemon-reload
systemctl start vaultwarden.service

Normalement, à ce stade, ça devrait lancer le service et créer une DB SQLite3 qui contient les comptes et les contenus sécurisés.

Configuration du reverse-proxy Apache2

Pour le reverse proxy et l'accès au service via un serveur HTTP frontal, je vais utiliser deux fichiers de configuration (qui sous Debian se trouvent dans /etc/apache2/sites-available/. Le premier qui se nomme vaultwarden.mydomain.org.conf permet la redirection de tout le traffic HTTP vers HTTPS par défaut.

# Configuration par défaut pour vaultwarden.mydomain.org
<VirtualHost *:80>
  ServerName vaultwarden.mydomain.org
  ServerAdmin admin@mydomain.org

  Redirect permanent "/" "https://vaultwarden.mydomain.org/"
  ServerSignature On

  RewriteEngine on
  RewriteCond %{SERVER_NAME} =vaultwarden.mydomain.org
  RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

Le second qui se nomme vaultwarden.mydomain.org.tls.conf contient la configuration pour l'accès via HTTPS au service:

# Configuration du reverse-proxy Vaultwarden
<VirtualHost *:443>
  ServerName vaultwarden.mydomain.org
  ServerAdmin admin@mydomain.org

  # Proxy vers l'instance vaultwarden
  ProxyPass / http://127.0.0.1:8088/
  ProxyPreserveHost On
  ProxyRequests Off
  RequestHeader set X-Real-IP %{REMOTE_ADDR}s

  # Configuration des logs
  ErrorLog /var/log/apache2/vaultwarden.mydomain.org.fr.tls_error.log
  #ErrorLogFormat "[%t] [%l] [pid %P] %F: %E: [client: %{X-Forwarded-For}i forwarded by: %a] %M"
  LogLevel warn
  CustomLog /var/log/apache2/vaultwarden.mydomain.org.tls_access.log vhost_combined

  # Configuration de HSTS
  Header always set Strict-Transport-Security "max-age=6912000"

  # Configuration TLS
  SSLEngine on
  SSLProxyEngine on
  SSLOptions  +FakeBasicAuth +ExportCertData +StrictRequire

  # Configuration du certificat letsencrypt
  Include /etc/letsencrypt/options-ssl-apache.conf

  SSLCertificateFile /etc/letsencrypt/live/mydomain.org/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/mydomain.org/privkey.pem
</VirtualHost>
</IfModule>

Vous prendrez bien soin de faire correspondre le ProxyPass et ce que vous avez défini dans la configuration du service vaultwarden, sur les paramètres ROCKET_ADDRESS et ROCKET_PORT.

Pour faire prendre tout ça en compte, il suffit de redémarrer apache2 en ayant pris soin d'activer les sites:

# sous root
a2ensite vaultwarden.mydomain.org.conf vaultwarden.mydomain.org.tls.conf
systemctl restart apache2

Déclarations DNS et modifications des certificats HTTPS

Suite à la création de l'alias vaultwarden.mydomain.org, il faut ajouter un CNAME pour ce nom DNS, afin qu'il pointe vers le véritable serveur HTTP. La procédure est variable suivant votre fournisseur de noms DNS.

Ensuite, il reste à mettre à jour vos certificats. Dans mon cas, c'était des certificats Let's Encrypt et j'ai utilisé certbot pour ajouter un altname (Subject Alternative Name) dans le certificat. L'astuce consiste à modifier le fichier /etc/letsencrypt/cli.ini et à décommenter la ligne qui indique les domaines à valider: domains = mydomain.org,www.mydomain.org,vaultwarden.mydomain.org, puis de lancer certbot --expand. Cette action va demander l'emission d'un nouveau certificat qui prend en compte le nouveau nom DNS comme altname. Il est nécessaire d'avoir fait la configuration Apache2 avant de demander un nouveau certificat, car certbot va l'utiliser pour confirmer les éléments.

Attention, une fois le certificat récupéré correctement, vous devez recommenter la ligne domains dans le fichier de configuration.

Après l'installation: ajouter un nouvel utilisateur

Maintenant que vous avez installé et configuré Apache2 correctement, vous n'êtes pas sortis d'affaire. En effet vous devez ajouter des comptes. Suivant comment vous avez configuré votre service vaultwarden, via son fichier de configuration, vous pouvez vous retrouver un peu coincé, notamment si vous voulez ajouter votre premier utilisateur.

Si, comme moi, vous avez interdit l'enregistrement de nouveaux utilisateurs, ce que je vous conseille de faire d'ailleurs, sinon n'importe qui peut s'enregistrer sur votre serveur et stocker ses comptes dessus, la procédure pour créer de nouveaux utilisateurs est un peu complexe, dans tous les cas, pas immédiate.

L'astuce consiste à passer par la page d'administration de vaultwarden. C'est une page qui est générée par le serveur en direct, sans passer par web-vault. On y accède via l'URL /admin. Pour l'activer, vous aurez besoin de la configurer au niveau de voter fichier de configuration. Notamment, vous aurez besoin de générer un jeton (token) avec la commande qui suit:

# sous root probablement
/usr/local/bin/vaultwarden hash
Generate an Argon2id PHC string using the 'bitwarden' preset:

Password: 
Confirm Password: 

ADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=4$SHbduBpOv/uFGF/BYJlcGjDdfOAzoBSdA4/o4CPfQjE$PBms/KMc7aMhXONY7T2lOY8oSuG1CpMoj0wDG2tA5A4'

Generation of the Argon2id PHC string took: 192.077766ms

Ensuite, il suffit de modifier le fichier de configuration en ajoutant la variable ADMIN_TOKEN au bon format:

## Token for the admin interface, preferably an Argon2 PCH string
## For details see: https://github.com/dani-garcia/vaultwarden/wiki/Enabling-admin-page#secure-the-admin_token
ADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=the_stuff_returned_by_vaultwarden_hash_command'

Une fois connecté sur la page d'admin, en ayant renseigné votre mot de passe admin, vous pouvez aller sur la page des utilisateurs. Pour créer un utilisateur, vous n'aurez pas d'autre choix que de l'inviter. C'est ça l'astuce. L'invitation se situe au niveau du bas de la page d'admin dans l'onglet users.

Ensuite, l'utilisateur reçoit un courriel avec un lien de confirmation. Pour effectuer la confirmation, il faut avoir installé web-vault, sinon ça renvoie une erreur 404 et le processus échoue (disons que la confirmation utilisateur n'est pas reçue). Une fois l'invitation activée, l'utilisateur peut créer un compte. Ça redirige vers l'URL interne: https://vaultwarden.mydomain.org/#/register?email=email@mydomain.org

A partir de là, l'utilisateur a son compte activé et il peut ajouter des mots de passe.

Ce système un peu compliqué me semble lié au fait que rien n'est réellement fait au niveau serveur, à part la gestion du compte. En effet, le mot de passe principal n'est pas utilisé par le serveur, c'est le client qui gère les éléments et qui chiffre. D'où l'impossibilité de créer des comptes à l'avance.

La gestion des organisations

Mon but premier avec vaultwarden, c'est de partager des mots de passe avec d'autres utilisateurs. Ce processus dans Bitwarden/Vaultwarden se nomme les organisations. Le principe simple, c'est de créer une organisation, d'y affecter des utilisateurs et des mots de passe et le tour est joué.

La fonctionnalité de créer une organisation peut être limitée à une liste d'utilisateurs. C'est mon cas et ça se joue sur le paramètre ORG_CREATION_USERS.

Si vous avez un utilisateur de cette liste, il pourra créer une organisation en utilisant son compte.

Attention à ne pas confondre le terme organisation et le terme collection. Les deux sont liés. De ce que j'ai compris, une organisation c'est ce qui gère le partage à des mots de passe. C'est une sorte de groupe. Une collection, c'est un regroupement de mots de passe au sein d'une organisation. on peut avoir plusieurs collections au sein d'une organisation et d'ailleurs chaqur organisation a forcément une collection par défaut.

Pour créer une nouvelle organisation, il suffit d'utiliser web-vault et son interface de base.

Pour ajouter un mot de passe à une organisation, il faut le déplacer dans l'organisation et choisir dans quelle collection de cette organisation le placer.

Vous trouverez plus d'informations sur ce sujet sur la documentation officielle.

Les trucs un peu pénibles de vaultwarden/bitwarden

Vaultwarden n'est pas exempt de petits problèmes qu'il faut que je mentionne pour que cette revue soit complète.

Les rappels de mail secure

Globalement, chaque fois que vous allez vous authentifier et procéder à une synchronisation, vous allez recevoir un mail de sécurité pour vous indiquer que quelqu'un s'est authentifié au niveau du serveur. Ça semble plutôt être une sage mesure, mais ça pose un vrai soucis pour les personnes qui comme moi, vident le cache de leur navigateur web à chaque fermeture du logiciel.

Globalement, chaque fois que je ferme mon navigateur et que j'utilise web-vault, j'ai droit à un courriel de rappel. Rien de bloquant, juste du bruit. En revanche, pour les applications, ça ne semble pas être le cas.

L'interface web des organisations

Alors j'ai eu pas mal de difficultés sur l'accès à l'interface d'administration des organisations. Quand on créé une organisation, on est basculé vers l'interface de gestion de l'organisation sur cette URL: /organizations/d964a391-28fa-4e06-8524-19f81de5ea1f/vault

A partir de cette URL, on peut administrer l'organisation, y ajouter des membres (les inviter) et ajouter des mots de passe.

Mais, il n'est pas possible d'aller depuis l'interface du compte utilisateur sur cette interface, il faut la saisir manuellement en récupérant l'UUID de l'organisation.

Par ailleurs, pour supprimer une organisation, on ne peut le faire que de l'interface administrateur.

Voilà, c'est un peu pénible, mais ça se contourne en connaissant l'URL.

Bug sur sendmail.

Je n'ai pas encore trouvé, mais apparemment, même si le fichier de configuration semble l'autoriser, je ne peux pas utiliser le binaire sendmail pour envoyer des courriels depuis le serveur vaultwarden.

Sendmail est une commande qui permet à un utilisateur Unix d'envoyer du courriel en utilisant le MTA installé sur la machine en cours d'utilisation. Globalement, comme mon serveur vaultwarden et mon serveur de courriel sont sur la même machine, je me suis dit que j'allais utiliser sendmail en lieu et place de passer par une socket TCP (depuis une machine locale vers la même machine, c'est ballot). Mais j'ai des problèmes de droits d'accès qui sont difficiles à tracer. Ce qui est certain c'est que ça peut être lié à la configuration de systemd, de apparmor et d'exim4, voire du code interne de vaultwarden.

Pour l'instant j'ai contourné avec un compte SMTP valide, mais ça serait bien que je trouve ce qui ne va pas.

L'import depuis password-store.

Il n'y avait rien pour faire l'import password-store, alors j'ai fait un script awk un peu bourrin qui fait le job (au moins partiellement, ça dépend comment vous avez rangé votre arborescence).

#!/usr/bin/gawk -f
# Convert password-store passwords to a Bitwarden CSV file
# Usage:
# for f in $(find ~/.password-store -type f -name '*.gpg'); do gpg -qd $f | ./pass_to_bitwarden.awk -v login_uri=$f; done
# folder,favorite,type,name,notes,fields,reprompt,login_uri,login_username,login_password,login_totp
# Awk functions for path manipulation.

# Remove the base/first directory of the path
function remove_basedir(path) {
    result = path;
    gsub(/^[^/]*\//, "/", result);

    return result;
}

# Remove the file extension from a path
function remove_ext(path) {
    result = path;
    gsub(/\.[[:alnum:]]+$/, "", result);

    return result;
}

# Return the directory name of a path
function dirname(path) {
    result = path;
    gsub(/\/$/, "", result);
    # get rid of basename
    gsub(/\/[^\/]+$/, "", result);
    return result;
}

# Return the basename of a path
function basename(path) {
    result = path;
    gsub(/.*\//, "", result);
    return result;
}

BEGIN {
    FS = ":";
    RS = "\n";
    folder = "";
    if (basename(dirname(login_uri)) != ".password-store") {
	folder = basename(dirname(login_uri));
	}
    favorite = "";
    type = "login";
    notes = "";
    fields = "";
    reprompt = "";
    # Handle login URI from filename
    login_uri = basename(remove_ext(login_uri));
    name = login_uri;
    login_username = "";
    login_password = "";
    login_totp = "";
}

NR==1 { login_password = "\"" $1 "\"" }
/login:/ { login_username = $2; sub(/ /, "", login_username); }

END { print folder "," favorite "," type "," name "," notes "," fields "," reprompt "," login_uri "," login_username "," login_password "," login_totp }

Ça vous donne un CSV auquel il faut rajouter une en-tête et vous pouvez l'importer via le client web-vault.

À propos des clients Bitwarden

Voici la liste des propositions de clients Bitwarden. Ce qui est intéressant, c'est qu'on peut utiliser les clients Bitwarden officiels et les brancher sur le serveur vaultwarden directement, en utilisant la configuration de type "auto-hébergée".

Pour ma part, à l'usage, je pense que les applications de bureau ne valent pas la peine: dans 99% des cas, je fais de l'authentification sur des applications web. Donc utiliser l'extension Firefox fait tout à fait le job. Je peux même passer par elle pour copier les identifiants/mots de passe en mémoire.

J'ai trouvé que l'application Android est simple d'accès mais qu'elle est assez lourde: quand je débloque un coffre, ça met plusieurs secondes à s'ouvrir et ça renvoie de temps en temps un plantage.

web-vault se révèle au final vraiment bien: on retrouve toutes les fonctionnalités de l'extension Firefox et aussi des choses qu'on ne retrouve pas ailleurs, comme l'administration des organisations.

Et bien sur, les clients Firefox extension et Android et de bureau fonctionnent sans accès au serveur. C'est important de le préciser parce que ça peut être utile quand même, non ?

Conclusions

Voilà, vaultwarden ça a l'air de bien fonctionner. Globalement, je pensais rester minimaliste et ne pas avoir besoin de la partie web. Mais, à l'usage, ça se révèle indispensable pour créer des comptes via le système d'invitation, surtout pour que les utilisateurs puissent s'activer.

A part ça, ça à l'air de répondre à mes besoins. Ca fait un peu moins geek comme solution que password-store et c'est très bien intégré aux différents clients (ce qui est moins le cas pour password-store qui n'a pas d'application iOS par exemple).