bitwarden – coffre fort numérique auto hébergé

bitwarden

Bitwarden est un gestionnaire de mots de passe freemium et open source sous licence AGPL. Il permet de générer et de conserver des mots de passe de manière sécurisée. Ces éléments sont protégés par un seul et unique mot de passe appelé « mot de passe maître ». Il existe une alternative auto hébergeable c’est vaultwarden, une instance non officielle de Bitwarden. Ce tutoriel vous présente l’installation complète sur Debian 10.

Pré-requis

apt update
apt upgrade
apt install git nano curl wget htop pkg-config openssl libssl1.1 libssl-dev
apt install build-essential

Installer Rust

Executer

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Choisir

1) Proceed with installation (default)

Activer l’environnement cargo sur votre compte utilisateur

source $HOME/.cargo/env

Installer Node

Choisir votre méthode d’installation

Manuelle :

# mkdir /opt/node
# cd /opt/node
# wget https://nodejs.org/dist/latest-v11.x/node-v11.15.0-linux-x64.tar.xz
# tar xJvf node-v11.15.0-linux-x64.tar.xz
# ln -s /opt/node/node-v11.15.0-linux-x64 /opt/node/current
# echo 'export PATH=/opt/node/bin:$PATH' >> ~/.bashrc
# export PATH=/opt/node/bin:$PATH
# which npm
/opt/node/current/bin/npm
# npm i npm@latest -g

Automatique via package debian (https://github.com/nodesource/distributions#debinstall)

curl -fsSL https://deb.nodesource.com/setup_12.x | bash -
apt-get install -y nodejs

Compiler bitwarden

Pré-requis si vous voulez utiliser un serveur mysql à la place du fichier nosql

# apt install mariadb-server mariadb-client default-libmysqlclient-dev
# systemctl start mariadb
# mysql_secure_installation

# mysql -u root -p

use mysql;
update user set plugin='' where User='root';
flush privileges;
quit
# mariadb -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

Depuis le passage en Debian 10, le fichier /etc/mysql/debian.cnf a basculé sur le compte root sans MDP. Des erreurs vont apparaitront durant les scripts de maintenance de MariaDB (/var/log/syslog)

# more /etc/mysql/debian.cnf
...
user     = root
password =
...
[mysql_upgrade]
...
user     = root
password =
...

Remplacement du compte root par debian-sys-maint et ajout d’un mot de passe dans le fichier /etc/mysql/debian.cnf

sed -i 's/root/debian-sys-maint/g' /etc/mysql/debian.cnf
sed -i 's/password =/password = cBHWZQ8D9twjFwkHjcoVFC9cG/g' /etc/mysql/debian.cnf

Le compte et le mdp précédemment renseigné dans le fichier /etc/mysql/debian.cnf vont vous permettre de créer le compte dans MariaDB.

# mariadb -u root -p
CREATE USER 'debian-sys-maint'@'localhost' IDENTIFIED BY 'cBHWZQ8D9twjFwkHjcoVFC9cG';
GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost'  WITH GRANT OPTION;
flush privileges;
quit

Vous pouvez profiter du paramétrage de mysql pour créer la base et les identifiants nécessaire à Bitwarden

mariadb -u root -p
CREATE DATABASE vaultwarden CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'vaultwarden'@'localhost' IDENTIFIED BY 'Bb8yDAvyKSCJ3CvdZAYAp9ZKp';
GRANT ALL ON `vaultwarden`.* TO 'vaultwarden'@'localhost';
FLUSH PRIVILEGES;

Afin de procéder à l’installation, il est judicieux de vérifier les dernières versions disponible à cette adresse : https://github.com/dani-garcia/vaultwarden/releases

Débuter l’installation de Bitwarden

# mkdir /opt/bitwarden

# cd /opt/bitwarden

# wget https://github.com/dani-garcia/vaultwarden/archive/refs/tags/1.22.2.tar.gz

# tar xvf 1.22.2.tar.gz

# cd vaultwarden-1.22.2

# echo "Si vous souhaitez compiler pour SQLITE, MYSQL, POSTGRESQL
# cargo build --features sqlite,mysql,postgresql --release

# echo "Si vous souhaitez compiler pour SQLITE et MYSQL
# cargo build --features sqlite,mysql --release

# file target/release/vaultwarden
target/release/vaultwarden: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=ef7d7d94c7f0d950e8da317bf4f0c81762f7aaaa, with debug_info, not stripped

# echo "Le binaire est stocké dans le dossier target/release/vaultwarden"
# cp target/release/vaultwarden /usr/local/bin/bitwarden

# useradd -m -d /var/lib/bitwarden bitwarden
# chmod 750 /usr/local/bin/bitwarden
# chown root:bitwarden /usr/local/bin/bitwarden
# mkdir -p /var/lib/bitwarden/{data,log}
# chown -R bitwarden:bitwarden /var/lib/bitwarden/
# chmod -R 750 /var/lib/bitwarden/
# chown -R root:bitwarden /etc/bitwarden/
# chmod 770 /etc/bitwarden/

Interface web vault

Afin de procéder à l’installation, il est judicieux de vérifier les dernières versions disponible à cette adresse : https://github.com/dani-garcia/bw_web_builds/releases

apt install apache2 apache2-bin
a2enmod ssl http2 proxy proxy_http2 proxy_http rewrite headers

Exemple de virtualhost

<VirtualHost *:443>
DocumentRoot /var/www/vault
ServerAdmin postmaster@mondomaine.fr
ServerName vault.mondomaine.fr
Protocols h2 h2c http/1.1

<If "%{HTTP_HOST} != 'vault.mondomaine.fr'">
    Redirect "/" "https://vault.mondomaine.fr"
</If>

SSLEngine on

 <Directory />
    Options FollowSymLinks
    AllowOverride None
 </Directory>

ProxyRequests     Off
ProxyPreserveHost On
RequestHeader set X-Real-IP %{REMOTE_ADDR}s

RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /notifications/hub(.*) ws://127.0.0.1:3012/ [P,L]
ProxyPass / http://127.0.0.1:8000/

LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error-vault.mondomaine.fr.log
CustomLog ${APACHE_LOG_DIR}/access-vault.mondomaine.fr.log combined
</VirtualHost>
cd /var/www/
mv vault vault.old
wget https://github.com/dani-garcia/bw_web_builds/releases/download/v2.21.1/bw_web_v2.21.1.tar.gz
tar xvfz bw_web_v2.21.1.tar.gz
mv web-vault vault
rm bw_web_v2.21.1.tar.gz
chown -R www-data:www-data /var/www/vault/

Configuration

La compilation maintenant terminé, il faut passer à la configuration :

mkdir /etc/bitwarden/

cp /opt/bitwarden/vaultwarden-1.22.2/.env.template /etc/bitwarden/bitwarden.conf

sed -i 's/'"# ADMIN_TOKEN=.*"'/'"ADMIN_TOKEN=$(tr -cd '[:alnum:]' < /dev/urandom | fold -w 49 | head -n 1)"'/' /etc/bitwarden/bitwarden.conf

grep ^ADMIN_TOKEN /etc/bitwarden/bitwarden.conf
ADMIN_TOKEN=X3yWhAMJhPJu5ISijayKUNBHyNoWW7ZjISXTILtwjdIsVrXmI

sed -i "s/# WEB_VAULT_FOLDER=web-vault/WEB_VAULT_FOLDER=\/var\/www\/vault/" /etc/bitwarden/bitwarden.conf

sed -i "s/# ROCKET_ADDRESS=0\.0\.0\.0.*/ROCKET_ADDRESS=127.0.0.1/" /etc/bitwarden/bitwarden.conf

sed -i "s/# WEBSOCKET_ENABLED=false/WEBSOCKET_ENABLED=true/" /etc/bitwarden/bitwarden.conf

sed -i "s/# WEBSOCKET_ADDRESS=0.0.0.0/WEBSOCKET_ADDRESS=127.0.0.1/" /etc/bitwarden/bitwarden.conf

sed -i "s/# DOMAIN=.*/DOMAIN=https:\/\/vault.mondomain.fr/" /etc/bitwarden/bitwarden.conf

sed -i "s/# LOG_FILE=.*/LOG_FILE=\/var\/lib\/bitwarden\/log\/bitwarden.log/" /etc/bitwarden/bitwarden.conf

sed -i "s/# LOG_LEVEL=.*/LOG_LEVEL=warn/" /etc/bitwarden/bitwarden.conf

sed -i "s/# DATA_FOLDER=data/DATA_FOLDER=\/var\/lib\/bitwarden\/data/" /etc/bitwarden/bitwarden.conf

Pour SQLITE

sed -i "s/# DATABASE_URL=data\/db.sqlite3/DATABASE_URL=\/var\/lib\/bitwarden\/data\/db.sqlite3/" /etc/bitwarden/bitwarden.conf

POUR MYSQL

sed -i "s/# DATABASE_URL=mysql:\/\/user:password@host[:port]\/database_name\/DATABASE_URL=mysql:\/\/vaultwarden:Bb8yDAvyKSCJ3CvdZAYAp9ZKp@localhost\/vaultwarden" /etc/bitwarden/bitwarden.conf

Créer le service bitwarden via systemd

vi /etc/systemd/system/bitwarden.service
[Unit]
Description=Bitwarden RS server (Rust Edition)
Documentation=https://github.com/dani-garcia/vaultwarden

# Only sqlite
After=network.target

# MariaDB
# After=network.target mariadb.service
# Requires=mariadb.service

# Mysql
# After=network.target mysqld.service
# Requires=mysqld.service

# PostgreSQL
# After=network.target postgresql.service
# Requires=postgresql.service

[Service]
# The user/group bitwarden_rs is run under. 
User=bitwarden
Group=bitwarden
# The location of the .env file for configuration
EnvironmentFile=/etc/bitwarden/bitwarden.conf
# The location of the compiled binary
ExecStart=/usr/local/bin/bitwarden
# Set reasonable connection and process limits
LimitNOFILE=65535
LimitNPROC=64
# Isolate bitwarden from the rest of the system
PrivateTmp=true
PrivateDevices=true
ProtectHome=true
ProtectSystem=strict
# Only allow writes to the following directory and set it to the working directory (user and password data are stored here)
WorkingDirectory=/var/lib/bitwarden
ReadWriteDirectories=/var/lib/bitwarden
# Allow bitwarden to bind ports in the range of 0-1024
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

Valider, vérifier et lancer le daemon

systemctl daemon-reload
systemctl start bitwarden.service
systemctl enable bitwarden.service
systemctl status bitwarden.service

Exemple pour connecter votre bitwarden en cli

Sur macOC installer le client bitwarden cli

brew install bitwarden-cli

Configurer votre site perso

$ bw config server https://vault.mondomaine.fr
Saved setting `config`.

Il ne vous reste qu’a vous logger

$ bw login
? Email address: moi@mondomaine.fr
? Master password: [hidden]
You are logged in!

To unlock your vault, set your session key to the `BW_SESSION` environment variable. ex:
$ export BW_SESSION="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
> $env:BW_SESSION="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

You can also pass the session key to any command with the `--session` option. ex:
$ bw list items --session xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Peupler la base utilisateur Bitwarden via un Active Directory

J’ai privilégié de bloquer le domaine pour mon instance de Bitwarden, ainsi les utilisateurs créent leur compte avec leur passphrase. Je n’utilise donc pas cet exécutable mais j’ai validé son fonctionnement.

# cd /opt/bitwarden
# git clone https://github.com/ViViDboarder/vaultwarden_ldap.git
# cd vaultwarden_ldap
# cp example.config.toml config.toml
# cargo clean && cargo build --release

Références