Installer Vaultwarden sur un cloud Hetzner

hetzner+vaultwarden.png

VaultWarden est le serveur non officiel compatible avec Bitwarden écrit en Rust à héberger soit même. Il est entièrement compatible avec toutes les applications de Bitwarden. Pour installer, vous devez au préalable vous créer un compte Hetzner et posséder un nom de domaine. Ceci fait, allons-y.

Créer un projet

  • Votre compte Hetzner créé, connectez-vous au service cloud.

  • Créer votre projet si ce n'est déjà fait. Un projet regroupe un ensemble de serveurs.

Ajouter une clé SSH

Si vous éprouvez des difficultés avec les clés SSH sur Hetzner, peut-être bien que cet article pourrait vous aider : Se connecter en SSH sur un server cloud Hetzner.

Créer votre Vaultwarden

  • Ajouter un nouveau serveur à votre projet. Préférez un emplacement européen, sélectionner l'image APPS > Docker CE.

  • Sélectionner le type de serveur que vous désirez en fonction de votre budget et de la puissance que vous désirez.

  • La clé SSH que vous avez renseigné précédemment devrait être sélectionné par défaut.

  • Nommer votre nouveau serveur.

Installer Vaultwarden

  • Créer un utilisateur System (nommer le comme vous voulez en place de master) avec son mot de passe :
adduser master
  • Ajouter l'utilisateur au sudo group
usermod -aG sudo master
  • Se connecter avec celui-ci
su - master
  • Créer un dossier vaultwarden
mkdir vaultwarden
  • Ouvrir ce dossier
cd vaultwarden
  • Créer le dossier de vos données persistantes :
mkdir vw-data

En externalisant ce dossier de votre docker, vous pourrez très facilement sauvegarder / migrer les données (par accès SFTP par exemple).

  • Mettre à jour votre serveur :
sudo apt update
sudo apt upgrade
  • Installer Docker Compose
sudo apt install docker-compose
sudo nano docker-compose.yml
  • Copier / coller les paramètres suivants en adaptant avec votre configuration :
version: '3'

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: always
    environment:
      DOMAIN: "https://vault.example.com"  # Your domain; vaultwarden needs to know it's https to work properly with attachments
    volumes:
      - ./vw-data:/data

  caddy:
    image: caddy:2
    container_name: caddy
    restart: always
    ports:
      - 8080:80  # Needed for the ACME HTTP-01 challenge.
      - 443:443
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - ./caddy-config:/config
      - ./caddy-data:/data
    environment:
      DOMAIN: "https://vault.example.com" # votre nom de domaine
      EMAIL: "[email protected]" # L'adresse électronique à utiliser pour l'inscription à l'ACME.
      LOG_FILE: "/data/access.log"
  • Créer le fichier Caddyfile :
sudo nano Caddyfile
  • Copier / coller les paramètres suivants sans toucher à la configuration :
# Uncomment this in addition with the import admin_redir statement allow access to the admin interface only from local networks
# (admin_redir) {
#        @admin {
#                path /admin*
#                not remote_ip private_ranges
#        }
#        redir @admin /
# }

{$DOMAIN}:443 {
  log {
    level INFO
    output file {$LOG_FILE} {
      roll_size 10MB
      roll_keep 10
    }
  }

  # Uncomment this if you want to get a cert via ACME (Let's Encrypt or ZeroSSL).
  tls {$EMAIL}

  # Or uncomment this if you're providing your own cert. You would also use this option
  # if you're running behind Cloudflare.
  # tls {$SSL_CERT_PATH} {$SSL_KEY_PATH}

  # This setting may have compatibility issues with some browsers
  # (e.g., attachment downloading on Firefox). Try disabling this
  # if you encounter issues.
  encode gzip

  # Uncomment to improve security (WARNING: only use if you understand the implications!)
  # If you want to use FIDO2 WebAuthn, set X-Frame-Options to "SAMEORIGIN" or the Browser will block those requests
  # header / {
  #	# Enable HTTP Strict Transport Security (HSTS)
  #	Strict-Transport-Security "max-age=31536000;"
  #	# Disable cross-site filter (XSS)
  #	X-XSS-Protection "0"
  #	# Disallow the site to be rendered within a frame (clickjacking protection)
  #	X-Frame-Options "DENY"
  #	# Prevent search engines from indexing (optional)
  #	X-Robots-Tag "noindex, nofollow"
  #	# Disallow sniffing of X-Content-Type-Options
  #	X-Content-Type-Options "nosniff"
  #	# Server name removing
  #	-Server
  #	# Remove X-Powered-By though this shouldn't be an issue, better opsec to remove
  #	-X-Powered-By
  #	# Remove Last-Modified because etag is the same and is as effective
  #	-Last-Modified
  # }

  # Uncomment to allow access to the admin interface only from local networks
  # import admin_redir

  # Proxy everything to Rocket
  # if located at a sub-path the reverse_proxy line will look like:
  #   reverse_proxy /subpath/* <SERVER>:80
  reverse_proxy vaultwarden:80 {
       # Send the true remote IP to Rocket, so that Vaultwarden can put this in the
       # log, so that fail2ban can ban the correct IP.
       header_up X-Real-IP {remote_host}
       # If you use Cloudflare proxying, replace remote_host with http.request.header.Cf-Connecting-Ip
       # See https://developers.cloudflare.com/support/troubleshooting/restoring-visitor-ips/restoring-original-visitor-ips/
       # and https://caddy.community/t/forward-auth-copy-headers-value-not-replaced/16998/4
  }
}

Source : https://github.com/dani-garcia/vaultwarden/wiki/Proxy-examples

  • Activer votre docker :
sudo docker compose up -d

Votre gestionnaire de mot de passe devrait être actif.

Mettre à jour Vaultwarden

  • Se connecter avec votre utilisateur System
su - master
  • Ouvrir le dossier du docker
cd vaultwarden
  • Désactiver votre docker
sudo docker compose down
  • Mettre à jour le cas échéant votre configuration de Caddy
sudo nano Caddyfile

/!\ A noter, j'ai mis à jour la configuration pour la version 1.3.0 et plus. Le reverse proxy a été simplifié :

https://github.com/dani-garcia/vaultwarden/issues/4024

  • Récupérer la dernière version de Vaultwarden :
sudo docker compose pull
  • Mettre à jour les paquets :
sudo apt update
sudo apt upgrade
  • Activer votre docker :
sudo docker compose up -d

Enjoy ^^