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
enstarttls
y si el puerto SMTP de tu servicio es 465, establece el valor de la variableSMTP_SECURITY
enforce_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.
El primer paso es crear una cuenta. Haz clic en el botón Crear cuenta para proceder.
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.
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.
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.
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.
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.
Una vez iniciada la sesión, se te llevará a la página de la aplicación y podrás empezar a utilizar 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.