Cómo instalar Vaultwarden con Docker en Ubuntu 22.04

Vaultwarden es un puerto no oficial del servidor Bitwarden escrito en lenguaje Rust. Es compatible con los clientes oficiales de Bitwarden y consume menos recursos que éste. Implementa casi todas las características de Bitwarden, excepto algunas. Utiliza la API de Bitwarden para proporcionar características como el soporte de la organización, los archivos adjuntos, el autentificador, U2F, Yubikey, el soporte de Duo y el soporte de los servicios de alias de correo electrónico.

En este tutorial, aprenderás a configurar tu copia de Vaultwarden en un servidor Ubuntu 22.04.

Requisitos previos

  • Un servidor con Ubuntu 22.04.

  • Un usuario no root con privilegios sudo.

  • El cortafuegos sin complicaciones (UFW) está activado y en funcionamiento.

  • Un nombre de dominio totalmente cualificado (FQDN) que apunte al servidor como, por ejemplo, vaultwarden.example.com.

  • Todo está actualizado.

    $ sudo apt update && sudo apt upgrade
    

Paso 1 – Configurar el cortafuegos

Antes de instalar cualquier paquete, el primer paso es configurar el cortafuegos para que permita las conexiones HTTP y HTTPS.

Comprueba el estado del cortafuegos.

$ sudo ufw status

Deberías ver algo como lo siguiente

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Permitir puertos HTTP y HTTPs.

$ sudo ufw allow http
$ sudo ufw allow https

Vuelve a comprobar el estado para confirmarlo.

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

Paso 2 – Instala Docker y Docker Compose

Añade la clave GPG oficial de Docker.

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg

Ejecuta el siguiente comando para añadir el repositorio de Docker.

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Actualiza el sistema para incluir el repositorio de Docker.

$ sudo apt update

Instala Docker.

$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Este tutorial utilizará el plugin Docker Compose v2 en lugar del antiguo binario heredado. Por lo tanto, el comando para ejecutarlo ha cambiado de docker-compose a docker compose y esto se refleja aquí.

Docker se ejecuta con privilegios elevados, por lo que tendrás que utilizar frecuentemente sudo para ejecutar los comandos. La mejor opción es añadir tu cuenta de usuario de Linux al grupo de usuarios docker.

$ sudo usermod -aG docker ${USER}

La variable ${USER} recoge la cuenta del sistema con la que se ha iniciado la sesión. Si no estás conectado con el usuario al que quieres dar privilegios, sustituye ${USER} por el nombre de usuario.

Para solicitar la pertenencia al nuevo grupo, sal del servidor y vuelve a entrar, o utiliza el siguiente comando. Se te pedirá la contraseña del usuario.

$ su - ${USER}

Paso 3 – Crear un archivo Docker Compose para Vaultwarden

Crea un nuevo directorio para Vaultwarden.

$ mkdir vaultwarden

Cambia al directorio.

$ cd vaultwarden

Crea el archivo Docker Compose y ábrelo para editarlo.

$ nano docker-compose.yml

Pega el siguiente código en él. Sustituye las variables DOMINIO y EMAIL por los valores adecuados.

version: '3'

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: always
    environment:
      WEBSOCKET_ENABLED: "true"  # Enable WebSocket notifications.
      DOMAIN: "https://vaultwarden.example.com"
      SMTP_HOST: "<smtp.domain.tld>"
      SMTP_FROM: "<[email protected]>"
      SMTP_PORT: "587"
      SMTP_SECURITY: "starttls"
      SMTP_USERNAME: "<username>"
      SMTP_PASSWORD: "<password>"
    volumes:
      - ./vw-data:/data

  caddy:
    image: caddy:2
    container_name: caddy
    restart: always
    ports:
      - 80: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://vaultwarden.example.com"  # Your domain.
      EMAIL: "[email protected]"                 # The email address to use for ACME registration.
      LOG_FILE: "/data/access.log"

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Estamos configurando Vaultwarden y el servidor web Caddy en un único archivo Docker de composición. Echemos un vistazo a todas las opciones definidas en el archivo.

  • image se refiere a la ubicación de las imágenes Docker de Vaultwarden y Caddy en Dockerhub.
  • nombre_del_contenedor te permite aplicar una etiqueta a tu contenedor Docker, para usarla al referenciar el contenedor dentro de una red Docker.
  • reinicio especifica una política de reinicio para el contenedor. Establecerla como siempre significa que el contenedor, si se sale, se reiniciará automáticamente.
  • La secciónenvironment establece las variables requeridas por Vaultwarden y Caddy. Si el puerto SMTP de tu servicio es 587, establece el valor de la variable SMTP_SECURITY en starttls y si el puerto SMTP de tu servicio es 465, establece el valor de la variable SMTP_SECURITY en force_tls. La variable de dominio es necesaria para que funcione la verificación del correo electrónico. Hemos habilitado los sockets web para que funcionen las notificaciones.
  • Elvolumen define los directorios presentes en el servidor para almacenar datos persistentes. El directorio /vw-data en el servidor está mapeado al directorio /data en el contenedor que almacena todos los datos que Vaultwarden requiere. Del mismo modo, la ubicación del archivo Caddy, la configuración de Caddy y los datos de Caddy se asignan a los respectivos directorios en el contenedor. Docker creará automáticamente los respectivos directorios en el servidor configurado en la sección Volumen.
  • Los puertos indican al contenedor que publique los puertos o un rango de puertos en el host.

Paso 4 – Configuración adicional de Vaultwarden

Desactivar el registro

Si no quieres que tu instalación de Vaultwarden esté abierta a los registros de los usuarios, puedes deshabilitarla añadiendo la siguiente variable en la sección environment del archivo Docker compose.

environment:
     WEBSOCKET_ENABLED: "true"  # Enable WebSocket notifications.
	 SIGNUPS_ALLOWED: "false"
	 ....

Desactivar las invitaciones

Incluso después de desactivar las inscripciones de usuarios, un usuario existente que forme parte de una organización puede seguir invitando a nuevos usuarios. Para impedirlo, utiliza la siguiente variable.

INVITATIONS_ALLOWED: "false"

Desactivar las sugerencias de contraseña

Vaultwarden envía pistas de contraseña por correo electrónico y también las muestra en la página de pistas de contraseña. Para desactivar esta función, establece el valor de la variable SHOW_PASSWORD_HINT.

SHOW_PASSWORD_HINT: "false"

Desactivar el panel de administración

Vaultwarden aloja archivos estáticos para su interfaz web. Puedes desactivar esto estableciendo la siguiente variable en false.

WEB_VAULT_ENABLED: "false"

Puedes anular los archivos de Vaultwarden proporcionando tus archivos estáticos para alojarlos utilizando la configuración en la sección volumes en el archivo Compose.

volumes:
      - ./vw-data:/data
	  - /path/to/static/files_directory:/web-vault

Registro de Vaultwarden

Vaultwarden sólo registra en la salida estándar. Puedes configurarlo para que registre en un archivo.

LOG_FILE: "/data/vaultwarden.log"

Para reducir el número de mensajes de registro, puedes establecer el nivel de registro en warn y al mismo tiempo establecer la variable EXTENDED_LOGGING como verdadera.

LOG_LEVEL: "warn"
EXTENDED_LOGGING: "true"

Paso 5 – Crear el archivo Caddy para Vaultwarden

Ahora que hemos configurado Vaultwarden, vamos a crear un archivo caddy para Vaultwarden y abrirlo para editarlo.

$ nano Caddyfile

Pega el siguiente código en él.

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

  # Use the ACME HTTP-01 challenge to get a cert for the configured domain.
  tls {$EMAIL}

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

  # The file size is set to 500MB to support the Vaultwarden (Bitwarden) Send feature.
  request_body {
       max_size 500MB
  }
  
  header {
       # Enable cross-site filter (XSS) and tell browser to block detected attacks
       X-XSS-Protection "1; mode=block"
       # Disallow the site to be rendered within a frame (clickjacking protection)
       X-Frame-Options "DENY"
       # Prevent search engines from indexing (optional)
       X-Robots-Tag "none"
       # Server name removing
       -Server
  }

  # Notifications redirected to the WebSocket server
  reverse_proxy /notifications/hub vaultwarden:3012

  # Proxy everything else to Rocket
  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}
  }
}

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Paso 6 – Ejecutar Vaultwarden

Inicia el contenedor Docker de Vaultwarden.

$ docker compose up -d

Puedes comprobar el estado del contenedor con el siguiente comando.

$ docker ps

Obtendrás una salida similar.

CONTAINER ID   IMAGE                       COMMAND                  CREATED              STATUS                        PORTS                                                                                NAMES
4ad23954f1d5   caddy:2                     "caddy run --config …"   About a minute ago   Up About a minute             0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp, 2019/tcp   caddy
d55a037850bc   vaultwarden/server:latest   "/usr/bin/dumb-init …"   About a minute ago   Up About a minute (healthy)   80/tcp, 3012/tcp                                                                     vaultwarden

Paso 7 – Utiliza Vaultwarden con los clientes de Bitwarden

Abre la URL https://vaultwarden.example.com en tu navegador.

Página de inicio de sesión de Vaultwarden

El primer paso es crear una cuenta. Haz clic en el botón Crear cuenta para proceder.

Página de creación de cuenta de Vaultwarden

Introduce los datos de tu cuenta y haz clic en el botón Enviar para continuar. Se te redirigirá a la página de inicio de sesión. Introduce los datos de tu cuenta para iniciar la sesión.

Panel de control de Vaultwarden

Tienes que desbloquear todas las funciones de tu cuenta verificando tu correo electrónico. Haz clic en el botón Enviar correo electrónico para enviar el correo de verificación.

Recibirás el siguiente correo. Haz clic en el enlace para verificar tu dirección de correo electrónico.

Correo electrónico de verificación del guardián de la bóveda

Ahora que tenemos nuestra cuenta de Vaultwarden lista, es el momento de utilizarla con un cliente de Bitwarden. Para nuestro tutorial, vamos a utilizar la extensión de Chrome. Instálala cogiéndola del sitio web de Bitwarden.

Haz clic en el icono de la extensión para que aparezca la pantalla de inicio de sesión de Vaultwarden.

Página de inicio de sesión de la extensión de Chrome de Bitwarden

Haz clic en el icono del engranaje en la parte superior izquierda de la ventana emergente para acceder a la página de configuración avanzada. Introduce https://vaultwarden.example.com como URL del servidor.

Pantalla de configuración de inicio de sesión de Bitwarden

Haz clic en el botón Guardar para aplicar la configuración. Inicia sesión con tus credenciales de Vaultwarden para acceder a la aplicación.

Página de inicio de sesión de Bitwarden

Una vez iniciada la sesión, se te llevará a la página de la aplicación y podrás empezar a utilizar Bitwarden.

Pantalla de la aplicación Bitwarden

Paso 8 – Copia de seguridad de Vaultwarden

Vaultwarden almacena sus datos en una base de datos SQLite. Una forma es simplemente copiar el archivo .sqlite3 de la carpeta /vw-data. Pero no es la solución recomendada ya que la base de datos no estará en un estado consistente debido a la ejecución de Vaultwarden. Para hacer una copia de seguridad de forma fiable, utilizaremos el comando de copia de seguridad de SQLite.

Instala el paquete sqlite3.

$ sudo apt install sqlite3

Crea un directorio para las copias de seguridad.

$ mkdir ~/vw-backups

Elimina los permisos de lectura, escritura y ejecución del grupo y de otros usuarios.

$ chmod go-rwx ~/vw-backups

Crea el archivo de servicio de copias de seguridad Vaultwarden y ábrelo para editarlo.

$ sudo nano /etc/systemd/system/vaultwarden-backup.service

Pega en él el siguiente código.

[Unit]
Description=backup the vaultwarden sqlite database

[Service]
Type=oneshot
WorkingDirectory=/home/<username>/vw-backups
ExecStart=/usr/bin/env bash -c 'sqlite3 /home/<username>/vaultwarden/vw-data/db.sqlite3 ".backup backup-$(date -Is | tr : _).sqlite3"'
ExecStart=/usr/bin/find . -type f -mtime +30 -name 'backup*' -delete

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida.

Inicia el servicio para probarlo y hacer una copia de seguridad.

$  sudo systemctl start vaultwarden-backup.service

Comprueba si el archivo de copia de seguridad está presente.

$ ls -l ~/vw-backups

Deberías ver el listado del archivo de copia de seguridad.

total 192
-rw-r--r-- 1 root root 196608 Jul 31 17:25 backup-2022-07-31T17_25_04+00_00.sqlite3

Para crear una programación regular de las copias de seguridad, crea y abre el archivo de la unidad de temporización systemd. Debes asegurarte de que el nombre del archivo coincide con el del servicio.

$ sudo nano /etc/systemd/system/vaultwarden-backup.timer

Pega en él el siguiente código.

[Unit]
Description=schedule vaultwarden backups

[Timer]
OnCalendar=04:00
Persistent=true

[Install]
WantedBy=multi-user.target

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida. Esto programará la copia de seguridad para que se produzca a las 4 de la mañana diariamente.

Inicia y activa el servicio de la unidad de temporización.

$ sudo systemctl enable vaultwarden-backup.timer
$ sudo systemctl start vaultwarden-backup.timer

Comprueba el estado del servicio del temporizador.

$  systemctl status vaultwarden-backup.timer
? vaultwarden-backup.timer - schedule vaultwarden backups
     Loaded: loaded (/etc/systemd/system/vaultwarden-backup.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Sun 2022-07-31 17:27:03 UTC; 7s ago
    Trigger: Mon 2022-08-01 04:00:00 UTC; 10h left
   Triggers: ? vaultwarden-backup.service

Jul 31 17:27:03 vaultwarden systemd[1]: Started schedule vaultwarden backups.

Esto sólo hace una copia de seguridad de los datos. Deberías asegurarte de que el archivo de la base de datos tiene una copia de seguridad periódica fuera del sitio o en tu sistema local. Para hacer una copia de seguridad del resto de cosas, puedes hacerlo copiando todo lo que hay en la carpeta ~/vaultwarden/vw-data. De las cosas restantes, hay que hacer una copia de seguridad del directorio attachments, del archivo config.json y de los archivos rsa_key*. Los directorios sends y icon_cache son opcionales y se debe hacer una copia de seguridad de ellos si son lo suficientemente grandes y los necesitas. Son estrictamente opcionales.

Paso 9 – Restaurar Vaultwarden

Para restaurar los datos de Vaultwarden, asegúrate de que el contenedor está parado. Puedes sustituir todo lo que hay en el directorio de datos por su versión de copia de seguridad. Al restaurar la copia de seguridad de SQLite, asegúrate de eliminar el archivo db.sqlite3-wal existente para evitar que se corrompa.

Paso 10 – Actualizar Vaultwarden

Actualizar Vaultwarden es un paso sencillo. Cambia al directorio de composición Docker de Vaultwarden.

$ cd ~/vaultwarden

A continuación, detén y elimina el contenedor existente. Sin embargo, tus datos se conservarán.

$ docker compose down --remove-orphans

Saca la última versión de la imagen Docker de Gitlab.

$ docker compose pull

Inicia los contenedores de nuevo.

$ docker compose up -d

Tu instalación de Vaultwarden se actualiza y se inicia de nuevo.

Conclusión

Con esto concluye nuestro tutorial sobre la instalación y configuración de Vaultwarden en un servidor Ubuntu 22.04. Si tienes alguna pregunta, publícala en los comentarios de abajo.

También te podría gustar...