Para seguir el proceso de migración de mi Home Lab desde una pequeña Raspberry Pi 4 a un OptiPlex 7050 ejecutando Proxmox ahora le toca el turno a Vaultwarden, una implementación no oficial y mucho más ligera del servidor Bitwarden que se puede instalar localmente y es compatible con los clientes oficiales.

En esta ocasion, la instalación de Vaultwarden en Docker se realizará en un contenedor ligero LXC de Proxmox con TurnKey Core. El procedimiento para crear este LXC es el mismo que usé para ejecutar Docker en Proxmox LXC.

Características del LXC

Este gestor de contraseñas con Vaultwarden se ejecutará sobre un LXC con las siguientes características:

  • LXC no privilegiado, con nesting y keyctl
  • CT ID: 306
  • Hostname: vaultwarden
  • Password + SSH key file
  • Disco: 4GB en local_lvm
  • CPU: 1 core
  • Memoria: 512MB
  • IP estática: 192.168.1.84/24
  • Gateway: 192.168.1.1
  • Dominio: home
  • DNS: 192.168.1.81 192.168.1.82

Configuración del LXC

A continuación se pone en marcha el LXC desde la CLI de Proxmox y se procede a configurarlo de la misma manera que ya expliqué en el artículo sobre LXC y Docker:

pct start 306

Se puede acceder al LXC utilizando la opción Console de la GUI o, mucho mejor, mediante SSH gracias a la configuración de las claves públicas que se hizo en el mismo:

ssh root@192.168.1.84

La configuración inicial es la habitual en una plantilla LXC de TurnKey Core:

  • First Boot Configuration: Skip / Skip / Install
  • Advanced Menu: Quit
  • Zona horaria Europe/Madrid con dpkg-reconfigure tzdata
  • Actualizar con apt update && apt upgrade -y
  • Reiniciar con reboot

Instalación de Docker

La instalación de Docker es idéntica a la que expliqué en el artículo “Docker en Proxmox LXC con TurnKey Core”:

  • Añadir la clave oficial GPG de Docker
  • Añadir el repositorio a las fuentes de apt
  • Instalar los paquetes de Docker: docker-ce, docker-ce-cli, etc.

Instalación de Nginx Proxy Manager

Una vez se ha instalado Docker, y dado que Vaultwarden requiere un acceso HTTPS, se puede instalar Nginx Proxy Manager de la misma forma que lo hice en la Raspberry Pi 4 (ver artículo “Instalación de Nginx Proxy Manager en Docker”):

  • Crear el fichero docker-compose.yml
  • Ponerlo en marcha usando docker compose up -d
  • Realizar la configuración inicial
  • Crear un registro de tipo A en Cloudflare
  • Configurar la petición de certificados SSL en Let’s Encrypt para ese dominio
  • Configurar un proxy host para ese dominio dirigido al docker de Vaultwarden

Instalación de Vaultwarden

La instalación de Vaultwarden también se puede realizar igual que en la Raspberry Pi 4 (ver artículo “Instalación de Vaultwarden en Docker”):

  • Crear el fichero docker-compose.yml
  • Ponerlo en marcha usando docker compose up -d
  • Realizar la configuración inicial
  • Habilitar el Admin Panel
  • Configurar los parámetros de seguridad

Nota: En mi caso, al estar realizando una migración, he copiado el volúmen data desde la Raspberry Pi 4 antes de poner en marcha el Docker. De esta manera recupero la misma configuración, la base de datos, la caché de iconos, etc.

drwxr-xr-x 2 root root    4096 Dec 18  2022 attachments
-rw-r--r-- 1 root root    1432 Dec 18  2022 config.json
-rw-r--r-- 1 root root  651264 Nov 12 13:10 db.sqlite3
-rw-r--r-- 1 root root   32768 Nov 23 19:25 db.sqlite3-shm
-rw-r--r-- 1 root root 4128272 Nov 23 19:25 db.sqlite3-wal
drwxr-xr-x 2 root root   16384 Nov 23 19:24 icon_cache
-rw-r--r-- 1 root root    1679 Dec 18  2022 rsa_key.pem
-rw-r--r-- 1 root root     451 Dec 18  2022 rsa_key.pub.pem
drwxr-xr-x 2 root root    4096 Dec 18  2022 sends
drwxr-xr-x 2 root root    4096 Dec 18  2022 tmp

Al iniciar sesión por primera vez, se muestra un mensaje indicando que se requiere incrementar el número de iteraciones KDF:

KDF Settings

La interfaz web recomienda un valor de 600000 para ser compatible con FIPS-140, pero la documentación indica que es recomendable realizar incrementos de 100000 y comprobar si todos los dispositivos que usemos son capaces de abrir y desbloquear el vault de forma fluída.

Nota: En mi caso, la configuración recuperada de una versión 1.27.0 tenía un valor por defecto de 100000, bastante diferente del valor por defecto de 600000 de la versión 1.30.0 que se acaba de instalar.

Al acceder al Panel de Administración se muestra un mensaje indicando que es más seguro utilizar un string seguro Argon 2 PHC (disponible desde la versión 1.28.0+) en lugar de un texto plano para el ADMIN_TOKEN:

Secure Argon2 PHC string

Para generarlo se utiliza el comando vaultwarden hash --preset owasp desde el propio Docker:

root@vaultwarden ~# docker exec -it vaultwarden /vaultwarden hash --preset owasp
Generate an Argon2id PHC string using the 'owasp' preset:

Password: 
Confirm Password: 

ADMIN_TOKEN='$argon2id$v=19$m=19456,t=2,p=1$7LDGBu/bVVcKsiRvYT1F4ikMPNGrJnR+43GfS/5w4BI$QydzrtxEcvqc4g2v6gXpAQKacRmlYdxFARzT90ScUfI'

Generation of the Argon2id PHC string took: 36.537429ms

Una vez generado, se cambia en los General Settings y se graba la configuración. Si todo funciona correctamente, se podrá iniciar sesión utilizando el password usado para generar el string seguro.