---
title: "Comment installer Bitwarden en Rust avec Docker"
date: "2020-09-30T11:27:41"
draft: false
slug: "bitwarden-rust"
wordpress_id: 603
excerpt: "Jusqu’à il a trois semaines je n’utilisais pas de gestionnaire de mot de passe (ou du moins presque).&hellip;\n"
featured_image: "https://www.mistergeek.net/wp-content/uploads/2020/12/bitwarden.jpg"
author: {"id":1,"name":"Kevin"}
categories: [{"id":14,"name":"Informatique","slug":"informatique"}]
tags: []
---

</p>
<p>Jusqu’à il a trois semaines je n’utilisais pas de gestionnaire de mot de passe (ou du moins presque). En effet j’avais un <strong>Enpass </strong>qui faisait l’affaire sur mon PC mais il était très limité. Pour synchroniser <strong>Enpass </strong>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 <strong>C# et ça utilise une base de données Microsoft SQL Server</strong>. 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 <strong>Bitwarden en Rust</strong>.</p>
</p>
<h2 class="wp-block-heading" id="bitwarden-en-deux-mots">Bitwarden en deux mots</h2>
</p>
<p>Bitwarden est connu pour être libre et gratuit tout en disposant d’une version _cloud_et d’offres d’abonnement pour financer <a href="https://www.mistergeek.net/informatique/format-flac/">son</a> développement. Rien de bien méchant jusqu’ici. Pour <strong>1 dollar/mois on débloque toutes les fonctions <a href="https://www.mistergeek.net/informatique/spotify-premium-android/">premium</a> </strong>et pour <strong>3.33 dollars/mois les fonctions de l’offre famille</strong>. 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.</p>
</p>
<figure class="wp-block-image"><img loading="lazy" decoding="async" width="936" height="593" src="https://mistergeek.net/wp-content/uploads/2020/09/bitwarden-gestionnaire-mot-de-passe-gratuit.png" alt="" class="wp-image-2430" srcset="https://www.mistergeek.net/wp-content/uploads/2020/09/bitwarden-gestionnaire-mot-de-passe-gratuit.png 936w, https://www.mistergeek.net/wp-content/uploads/2020/09/bitwarden-gestionnaire-mot-de-passe-gratuit-300x190.png 300w, https://www.mistergeek.net/wp-content/uploads/2020/09/bitwarden-gestionnaire-mot-de-passe-gratuit-768x487.png 768w, https://www.mistergeek.net/wp-content/uploads/2020/09/bitwarden-gestionnaire-mot-de-passe-gratuit-480x304.png 480w" sizes="auto, (max-width: 936px) 100vw, 936px" /></figure>
</p>
<p>Bitwarden s’installe sur son <a href="https://www.mistergeek.net/informatique/snapchat-screenshot-capture/">smartphone</a> ou sur sa <a href="https://www.mistergeek.net/informatique/installer-ios-beta-developpeur/">tablette</a> (<a href="https://mistergeek.net/application/spotify-premium-android/"><strong>Android </strong></a>ou <a href="https://www.mistergeek.net/informatique"><strong>iOS</strong></a>) ainsi que sur <strong>PC, <a href="https://www.mistergeek.net/informatique/tuto-comment-afficher-les-dossiers-caches-sur-mac/">Mac</a> et <a href="https://www.mistergeek.net/informatique/etcher-creer-une-cle-usb-bootable-windows-ou-linux/">Linux</a></strong>. S’ajoute à cela les extensions pour navigateur web disponibles sur Chrome, Edge, Firefox et même Safari.</p>
</p>
<p>Bitwarden chiffre toutes vos données derrière un mot de passe maître (« <em>master password</em> » en anglais) que vous devez retenir à tout prix. Dans le cas contraire vous risquez de perdre tous vos mots de passe et identifiants.</p>
</p>
<p>Sur chaque site ou <a href="https://www.mistergeek.net/informatique/dns66-bloquer-la-publicite-sur-android/">application</a> où vous possédez un compte, <strong>Bitwarden </strong>vous l’indique avec une pastille dans votre navigateur.</p>
</p>
<h2 class="wp-block-heading" id="h-berger-une-instance-bitwarden">Héberger une instance Bitwarden</h2>
</p>
<p>Bitwarden a en ligne un tutoriel complet pour installer une instance sur une <strong>VM </strong>ou un <a href="https://www.mistergeek.net/informatique/ipv6-serveur-scaleway-dedibox/">serveur</a> dédié. Malheureusement cela passe par un obscur script Bash à télécharger et à executer. En outre le <a href="https://www.mistergeek.net/streaming/amazon-prime-video/">service</a> écoute par défaut sur les <strong>ports 80 et 443</strong>. 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.</p>
</p>
<h3 class="wp-block-heading" id="rust-la-rescousse">Rust à la rescousse</h3>
</p>
<p>À 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 <em>container</em><strong> Docker</strong>. Que demander de plus ?</p>
</p>
<h3 class="wp-block-heading" id="le-projet">Le projet</h3>
</p>
<p>Dans ce tutoriel on va installer et configurer <strong>Bitwarden_rs</strong> dans un container qu’on place derrière un serveur web avec TLS pour la <a href="https://www.mistergeek.net/vpn/nordvpn/">sécurité</a>.</p>
</p>
<p>Notre stack technique est donc :</p>
</p>
<ul class="wp-block-list">
<li>Docker : pour faire tourner les applications avec une isolation de processus</li>
<li>Traefik : serveur web qui tourne en reverse-proxy vers le container Bitwarden</li>
<li>Bitwarden_rs : applicatif gestionnaire de mot de passe</li>
</ul>
</p>
<h4 class="wp-block-heading" id="installer-docker">Installer Docker</h4>
</p>
<p>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 <code>sudo</code> pour avoir les droit <code>root</code>. Ces commandes peuvent s’exécuter en tant que super-utilisateur.</p>
</p>
<p>Installer les paquets prérequis pour l’installation.</p>
</p>
<pre class="wp-block-code"><code>sudo apt-get install \    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
</code></pre>
</p>
<p>Ajouter la clé GPGP du dépôt Docker</p>
</p>
<pre class="wp-block-code"><code>curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
</code></pre>
</p>
<p>Ajouter le dépôt Docker aux sources d’APT.</p>
</p>
<pre class="wp-block-code"><code>sudo add-apt-repository \
   "deb &#91;arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"
</code></pre>
</p>
<p>Mettre à jour l’index des paquets et installer Docker CE.</p>
</p>
<pre class="wp-block-code"><code>sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
</code></pre>
</p>
<p>Pour vérifier que l’installation s’est bien passé, vérifier la version du logiciel.</p>
</p>
<pre class="wp-block-code"><code>docker -v
</code></pre>
</p>
<p>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.</p>
</p>
<p>Installer Docker-Compose</p>
</p>
<pre class="wp-block-code"><code>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
</code></pre>
</p>
<p>Appliquer les droits d’éxecution sur le binaire.</p>
</p>
<pre class="wp-block-code"><code>sudo chmod +x /usr/local/bin/docker-compose
</code></pre>
</p>
<h4 class="wp-block-heading" id="installer-traefik">Installer Traefik</h4>
</p>
<p>![Installer Docker](https://mistergeek.net/content/images/wordpress/2020/09/installer-docker.png)</p>
</p>
<p>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.</p>
</p>
<p>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 ».</p>
</p>
<pre class="wp-block-code"><code>sudo docker network create web
</code></pre>
</p>
<p>Créer un dossier dans lequel est stocké les configurations et données du container Traefik. Se déplacer dans ce dossier.</p>
</p>
<pre class="wp-block-code"><code>mkdir traefik &amp;&amp; cd traefik
</code></pre>
</p>
<p>Docker-Compose utilise un fichier nommé <code>docker-compose.yml</code> 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 <code>mavm.mondomaine.fr</code>. Traefik utilise deux réseaux : <code>web</code> et  <code>default</code>. Le premier est externe à la configuration et le second est le réseau par défaut de Docker.</p>
</p>
<p>Editer le fichier <code>docker-compose.yml</code> comme suit :</p>
</p>
<pre class="wp-block-code"><code>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
</code></pre>
</p>
<p>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.</p>
</p>
<p>Editer le fichier traefik.toml du dossier data.</p>
</p>
<pre class="wp-block-code"><code>nano data/traefik.toml</code></pre>
</p>
<pre class="wp-block-code"><code>defaultEntryPoints = &#91;"http", "https"]
# WEB <a href="https://www.mistergeek.net/informatique/comparatif-carte-son-xlr/">interface</a> of Traefik - it will show web page with overview of frontend and backend configurations

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

&#91;file]
<a href="https://www.mistergeek.net/informatique/apple-event-2020/">watch</a> = true   filename = "/etc/traefik/rules.toml" # Let's encrypt configuration 

&#91;acme]
<a href="https://www.mistergeek.net/informatique/protonmail-et-tutanota-sur-windows-linux-ou-mac/">email</a> = "monadresseemail@mondomaine.fr" #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   

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

&#91;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 </code></pre>
</p>
</p>
</p>
<p>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 <code>rules.toml</code>. On pense à y ajouter directement Bitwardan dans les domaines à valider.</p>
</p>
<p>Editer le fichiers des règles (rules.toml).</p>
</p>
<pre class="wp-block-code"><code>nano data/rules.toml
&#91;&#91;acme.domains]]
  main = "mondomaine.fr"
  sans = &#91;"www.mondomaine.fr", "mavm.mondomaine.fr", "bitwarden.mondomaine.fr"]
&#91;&#91;acme.domains]]
  main = "monseconddomaine.fr"
  sans = &#91;"www.monseconddomaine.fr", "srv-2.monseconddomaine.fr"]
</code></pre>
</p>
<p>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.</p>
</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="774" src="https://mistergeek.net/wp-content/uploads/2021/02/traefik-docker-v1-7-1024x774.png" alt="" class="wp-image-2434" srcset="https://www.mistergeek.net/wp-content/uploads/2021/02/traefik-docker-v1-7-1024x774.png 1024w, https://www.mistergeek.net/wp-content/uploads/2021/02/traefik-docker-v1-7-79x60.png 79w, https://www.mistergeek.net/wp-content/uploads/2021/02/traefik-docker-v1-7-300x227.png 300w, https://www.mistergeek.net/wp-content/uploads/2021/02/traefik-docker-v1-7-768x580.png 768w, https://www.mistergeek.net/wp-content/uploads/2021/02/traefik-docker-v1-7-1080x816.png 1080w, https://www.mistergeek.net/wp-content/uploads/2021/02/traefik-docker-v1-7-1280x967.png 1280w, https://www.mistergeek.net/wp-content/uploads/2021/02/traefik-docker-v1-7-980x741.png 980w, https://www.mistergeek.net/wp-content/uploads/2021/02/traefik-docker-v1-7-480x363.png 480w, https://www.mistergeek.net/wp-content/uploads/2021/02/traefik-docker-v1-7.png 1302w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</p>
<p>Installer Bitwarden</p>
</p>
<p>On crée un service nommé « bitwarden » vers lequel on fait pointer les requêtes depuis <code>bitwarden.mondomaine.fr</code> grâce aux <em>labels</em> vers le port 80 du container en HTTP. <strong>Traefik lui se charger de sécuriser les données externes au réseau Docker.</strong> Ici un seul réseau est utilisé : <code>web</code>. C’est celui qu’on a crée plus haut dans ce tutoriel.</p>
</p>
<p>Editer le <code>docker-compose.yml</code></p>
</p>
<pre class="wp-block-code"><code>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
</code></pre>
</p>
<p>Voilà ! On a maintenant Bitwarden sur notre VM avec un certificat TLS de Let’s Encrypt gratuit.</p>
</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="774" src="https://mistergeek.net/wp-content/uploads/2021/02/bitwarden-traefik-tls-ssl-reverse-proxy-1024x774.png" alt="" class="wp-image-2436" srcset="https://www.mistergeek.net/wp-content/uploads/2021/02/bitwarden-traefik-tls-ssl-reverse-proxy-1024x774.png 1024w, https://www.mistergeek.net/wp-content/uploads/2021/02/bitwarden-traefik-tls-ssl-reverse-proxy-79x60.png 79w, https://www.mistergeek.net/wp-content/uploads/2021/02/bitwarden-traefik-tls-ssl-reverse-proxy-300x227.png 300w, https://www.mistergeek.net/wp-content/uploads/2021/02/bitwarden-traefik-tls-ssl-reverse-proxy-768x580.png 768w, https://www.mistergeek.net/wp-content/uploads/2021/02/bitwarden-traefik-tls-ssl-reverse-proxy-1080x816.png 1080w, https://www.mistergeek.net/wp-content/uploads/2021/02/bitwarden-traefik-tls-ssl-reverse-proxy-1280x967.png 1280w, https://www.mistergeek.net/wp-content/uploads/2021/02/bitwarden-traefik-tls-ssl-reverse-proxy-980x741.png 980w, https://www.mistergeek.net/wp-content/uploads/2021/02/bitwarden-traefik-tls-ssl-reverse-proxy-480x363.png 480w, https://www.mistergeek.net/wp-content/uploads/2021/02/bitwarden-traefik-tls-ssl-reverse-proxy.png 1302w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</p>
<h2 class="wp-block-heading" id="conclusion">Conclusion</h2>
</p>
<p>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.</p></p>
