Comment installer Bitwarden en Rust avec Docker

Jusqu’à il a trois semaines je n’utilisais pas de gestionnaire de mot de passe (ou du moins presque). En effet j’avais un Enpass qui faisait l’affaire sur mon PC mais il était très limité. Pour synchroniser Enpass avec ses différents terminaux c’est gratuit, mais pour afficher plus de 20 comptes il faut payer. En open source il existe Bitwarden en version auto-hébergé, or c’est développé en C# et ça utilise une base de données Microsoft SQL Server. Un truc bien lourd pour quelque chose qui n’est censé que stocker des mots de passe. Heureusement Internet est grand et il y a quelqu’un qui s’est décidé à développeur un moteur Bitwarden en Rust.

Bitwarden en deux mots

Bitwarden est connu pour être libre et gratuit tout en disposant d’une version _cloud_et d’offres d’abonnement pour financer son développement. Rien de bien méchant jusqu’ici. Pour 1 dollar/mois on débloque toutes les fonctions premium et pour 3.33 dollars/mois les fonctions de l’offre famille. Pour l’entreprise c’est la même chose avec une offre gratuite, une d’équipe à 3 dollars/mois/utilisateur et une offre entreprise à 5 dollars/mois/utilisateur. C’est simple c’est efficace et c’est audité en plus d’être disponible sur GitHub.

Bitwarden s’installe sur son smartphone ou sur sa tablette (Android ou iOS) ainsi que sur PC, Mac et Linux. S’ajoute à cela les extensions pour navigateur web disponibles sur Chrome, Edge, Firefox et même Safari.

Bitwarden chiffre toutes vos données derrière un mot de passe maître (« master password » en anglais) que vous devez retenir à tout prix. Dans le cas contraire vous risquez de perdre tous vos mots de passe et identifiants.

Sur chaque site ou application où vous possédez un compte, Bitwarden vous l’indique avec une pastille dans votre navigateur.

Héberger une instance Bitwarden

Bitwarden a en ligne un tutoriel complet pour installer une instance sur une VM ou un serveur dédié. Malheureusement cela passe par un obscur script Bash à télécharger et à executer. En outre le service écoute par défaut sur les ports 80 et 443. Or quand on a déjà un serveur web avec des services derrière il est impensable de le remplacer par Bitwarden. On peut très bien envisager de changer les ports, mais la manoeuvre est assez sombre et oblige à aller modifier des fichiers de configurations. Pour tout vous avouer, je n’ai pas non plus réussi à mettre en container le soft.

Rust à la rescousse

À la place d’installer la version officielle de Bitwarden, j’en ai trouvée une autre. Celle-ci est entièrement écrite en Rust et utilise une simple base de données SQLite. En plus, le tout est déjà fourni dans un container Docker. Que demander de plus ?

Le projet

Dans ce tutoriel on va installer et configurer Bitwarden_rs dans un container qu’on place derrière un serveur web avec TLS pour la sécurité.

Notre stack technique est donc :

  • Docker : pour faire tourner les applications avec une isolation de processus
  • Traefik : serveur web qui tourne en reverse-proxy vers le container Bitwarden
  • Bitwarden_rs : applicatif gestionnaire de mot de passe

Installer Docker

Je ne vais pas réécrire ici la documentation de Docker. Selon votre système, il y a ce qu’il faut sur le site officiel. Dans mon cas j’utilise Debian avec un processeur à architecture x64. Ici on utilise sudo pour avoir les droit root. Ces commandes peuvent s’exécuter en tant que super-utilisateur.

Installer les paquets prérequis pour l’installation.

sudo apt-get install \    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

Ajouter la clé GPGP du dépôt Docker

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

Ajouter le dépôt Docker aux sources d’APT.

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"

Mettre à jour l’index des paquets et installer Docker CE.

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

Pour vérifier que l’installation s’est bien passé, vérifier la version du logiciel.

docker -v

Il se peut que Docker n’installe pas de lui même Compose, qui est un outil qui permet de gérer les containers en utilisant un fichier YAML. En somme cela permet d’avoir des configurations qui peuvent se répliquer entre plusieurs serveurs.

Installer Docker-Compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Appliquer les droits d’éxecution sur le binaire.

sudo chmod +x /usr/local/bin/docker-compose

Installer Traefik

![Installer Docker](https://mistergeek.net/content/images/wordpress/2020/09/installer-docker.png)

Traefik tout comme NGINX ou Apache est un serveur web mais développé en langage Go. Orienté cloud, Traefik permet de servir du contenu principalement en HTTP vers des containers qui font tourner des microservices. Ici on utilise Traefik comme serveur web principal sur les ports 80 et 443 pour HTTP et HTTPS respectivement. Traefik est en charge de récuperer les certificats avec Let’s Encrypt et de nous sécuriser se qui passe sur le port 443.

Créer un réseau sur lequel sera exposé les containers et vers lequel traefik redirigera les requêtes. Ici on nomme ce réseau « web ».

sudo docker network create web

Créer un dossier dans lequel est stocké les configurations et données du container Traefik. Se déplacer dans ce dossier.

mkdir traefik && cd traefik

Docker-Compose utilise un fichier nommé docker-compose.yml pour créer et configurer les containers nécessaires. Ce fichier contient les services qui tournent, les ports ouverts, les volumes (qui permettent de sauvegarder les données) et les réseaux utilisés.Ici on utilise Traefik v1.7 qui fonctionne. La version 2 existe, mais casse littéralement cette configuration. Traefik dispose d’un tableau de bord qui écoute par défaut sur le port 8080. Ici on demande à Traefik de se proxifier lui même en permettant l’accès du tableau de bord depuis le nom d’hôte mavm.mondomaine.fr. Traefik utilise deux réseaux : web et default. Le premier est externe à la configuration et le second est le réseau par défaut de Docker.

Editer le fichier docker-compose.yml comme suit :

version: '3'
networks:
  web:
    external:
      name: web
  default:
    driver: bridge
services:
  traefik:
    container_name: 'traefik'
    image: traefik:v1.7
    restart: always
    volumes:
      - ./data/traefik.toml:/etc/traefik/traefik.toml
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./data/acme:/etc/traefik/acme
      - ./data/ssl:/etc/traefik/ssl
      - ./data/rules.toml:/etc/traefik/rules.toml
    environment:
      - "affinity:container!=traefik*"
    ports:
      - "80:80"
      - "443:443"
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=web"
      - "traefik.port=8080"
      - "traefik.entryPoint=https"
      - "traefik.backend=traefik"
      - "traefik.frontend.rule=Host:mavm.mondomaine.fr"
    networks:
      - web
      - default

On configure maintenant Traefik en tant que serveur web et pour que la redirection vers du HTTP soit automatique. Ici Traefik va écouter les containers Docker et verifier les labels afin de l’utiliser comme service.

Editer le fichier traefik.toml du dossier data.

nano data/traefik.toml
defaultEntryPoints = ["http", "https"]
# WEB interface of Traefik - it will show web page with overview of frontend and backend configurations

[web]
address = ":8080" #  
[web.auth.basic] #  
usersFile = "/shared/.htpasswd" # Force HTTPS 
[entryPoints]   
[entryPoints.http]   
address = ":80"     
[entryPoints.http.redirect]     
entryPoint = "https"   
[entryPoints.https]   
address = ":443"     
[entryPoints.https.tls] 

[file]
watch = true   filename = "/etc/traefik/rules.toml" # Let's encrypt configuration 

[acme]
email = "[email protected]" #any email id will work storage="/etc/traefik/acme/acme.json" 
entryPoint = "https" 
acmeLogging=true 
onDemand = false #create certificate when container is created 
onHostRule = true   # Use a HTTP-01 acme challenge rather than TLS-SNI-01 challenge   

[acme.httpChallenge]
entryPoint = "http" # Connection to docker host system (docker.sock) 

[docker]
endpoint = "unix:///var/run/docker.sock" 
domain = "mavm.mondomaine.fr" 
watch = true # This will hide all docker containers that don't have explicitly # set label to "enable" 
exposedbydefault = false 

On va maintenant gérer les domaines qu’on va mettre en ligne. À chaque domaine il faut ajouter les lignes qui vont bien dans un fichier rules.toml. On pense à y ajouter directement Bitwardan dans les domaines à valider.

Editer le fichiers des règles (rules.toml).

nano data/rules.toml
[[acme.domains]]
  main = "mondomaine.fr"
  sans = ["www.mondomaine.fr", "mavm.mondomaine.fr", "bitwarden.mondomaine.fr"]
[[acme.domains]]
  main = "monseconddomaine.fr"
  sans = ["www.monseconddomaine.fr", "srv-2.monseconddomaine.fr"]

Maintenant que tout est prêt on peut lancer Traefik et verifier que tout tourne avant même de lancer en allant sur l’hote qui héberge Traefik.

Installer Bitwarden

On crée un service nommé « bitwarden » vers lequel on fait pointer les requêtes depuis bitwarden.mondomaine.fr grâce aux labels vers le port 80 du container en HTTP. Traefik lui se charger de sécuriser les données externes au réseau Docker. Ici un seul réseau est utilisé : web. C’est celui qu’on a crée plus haut dans ce tutoriel.

Editer le docker-compose.yml

version: '3'
networks:
  web:
    external: true
services:
  bitwarden:
    image: bitwardenrs/server:1.16.3
    volumes:
      - ./data:/data
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=web"
      - "traefik.port=80"
      - "traefik.entryPoint=http"
      - "traefik.backend=bitwarden"
      - "traefik.frontend.rule=Host:bitwarden.mondomaine.fr"
    networks:
      - web

Voilà ! On a maintenant Bitwarden sur notre VM avec un certificat TLS de Let’s Encrypt gratuit.

Conclusion

On a vu ici comment mettre en oeuvre Traefik pour servir des requêtes web. Cela permet de faire d’héberger sa propre instance sur une VM ou sur un serveur avec peu de ressources.

1 commentaire
Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Articles qui pourraient vous intéresser