Tu propio gestor de contraseñas en casa, con HTTPS y sin abrir puertos (Vaultwarden + Tailscale)

Cómo monté Vaultwarden en una Raspberry Pi para usarlo con las apps de Bitwarden, con certificado HTTPS real gracias a Tailscale Serve y sin exponer nada a Internet.

Iván· Publicado el · 3 minRead in English →

Llevaba tiempo queriendo dejar de depender de un gestor de contraseñas en la nube de otro. Vaultwarden es una versión ligera y libre del servidor de Bitwarden: funciona con las apps oficiales de Bitwarden (móvil, navegador, escritorio) y cabe de sobra en una Raspberry Pi.

El reto no es instalarlo, que son cinco líneas. El reto es hacerlo seguro: tus contraseñas no pueden quedar expuestas a Internet, y a la vez tienes que poder usarlas desde el móvil fuera de casa.

El problema del HTTPS

Vaultwarden necesita HTTPS. No es por capricho: tus contraseñas se cifran y descifran en tu dispositivo, y los navegadores solo permiten esas funciones criptográficas en páginas seguras. Por HTTP, la web directamente no funciona.

Las opciones típicas para tener HTTPS en casa son:

  • Comprar un dominio, abrir el puerto 443 y montar un proxy inverso con Let’s Encrypt. Funciona, pero expones tu gestor de contraseñas a Internet.
  • Un certificado autofirmado. Las apps se quejan y es incómodo.
  • Tailscale Serve. Es la que elegí.

Qué es Tailscale y por qué encaja aquí

Tailscale crea una red privada entre tus dispositivos (el móvil, el PC, la Pi) usando WireGuard por debajo. Cada máquina recibe un nombre dentro de tu red privada, del tipo mi-pi.tu-red.ts.net.

Y lo importante: con Tailscale Serve, Tailscale le consigue a ese nombre un certificado HTTPS real (de Let’s Encrypt) y lo renueva solo. El servicio solo es accesible desde tus dispositivos conectados a Tailscale. Desde Internet, no existe.

Paso 1: Vaultwarden en Docker, escuchando solo en local

En mi docker-compose.yml:

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      DOMAIN: "https://mi-pi.tu-red.ts.net:8443"
      SIGNUPS_ALLOWED: "true"      # solo mientras creas tu cuenta
      SHOW_PASSWORD_HINT: "false"
      TZ: Europe/Madrid
    ports: ["127.0.0.1:8222:80"]
    volumes: [./vaultwarden:/data]

La clave es 127.0.0.1:8222:80. El contenedor solo es accesible desde la propia Pi, ni siquiera desde el resto de la red de casa. La única puerta de entrada será Tailscale.

docker compose up -d vaultwarden

Paso 2: publicarlo con Tailscale Serve

Con Tailscale ya instalado en la Pi y con HTTPS activado en el panel de Tailscale (en la sección DNS):

sudo tailscale serve --bg --https=8443 http://127.0.0.1:8222

Esto dice: «en el puerto 8443, con HTTPS, reenvía a Vaultwarden». Compruébalo con:

tailscale serve status

Uso el 8443 porque el 443 ya lo tengo ocupado con otra app. Si lo tienes libre, puedes usar el normal.

Paso 3: crea tu cuenta y cierra la puerta

Desde un dispositivo con Tailscale, abre https://mi-pi.tu-red.ts.net:8443, crea tu cuenta con una contraseña maestra larga y apúntala en papel en un sitio seguro. Si la pierdes, nadie puede recuperar tus contraseñas, ni tú.

Después, desactiva el registro:

      SIGNUPS_ALLOWED: "false"
docker compose up -d vaultwarden

Ahora nadie más puede crearse una cuenta en tu servidor.

Paso 4: conecta las apps de Bitwarden

En la app de Bitwarden del móvil o la extensión del navegador, antes de iniciar sesión elige servidor autoalojado y pon tu dirección https://mi-pi.tu-red.ts.net:8443. El dispositivo tiene que tener Tailscale activado.

Un detalle práctico: las apps guardan una copia cifrada de tu caja fuerte. Si un día estás sin Tailscale, puedes consultar tus contraseñas igualmente; solo no se sincronizan los cambios hasta que vuelvas a conectar.

Paso 5: copias de seguridad (no te lo saltes)

Un gestor de contraseñas sin copias es una bomba de relojería. Vaultwarden trae un comando para hacer una copia consistente de su base de datos:

docker exec vaultwarden /vaultwarden backup

Deja un archivo db_FECHA.sqlite3 en su carpeta de datos. Lo lanzo cada noche antes de mi copia al NAS, y borro los de más de 7 días. Además, de vez en cuando exporto la caja fuerte cifrada desde la web.

Resumen

  • Vaultwarden solo escucha en 127.0.0.1.
  • Tailscale Serve le pone HTTPS real y lo hace accesible solo a mis dispositivos.
  • Registro cerrado después de crear la cuenta.
  • Copia de la base de datos cada noche.

Cero puertos abiertos en el router. Es la configuración con la que duermo tranquilo.

Mini-quiz

¿Te has quedado con la idea?

Tres preguntas rápidas. Cada acierto suma 10 XP.

  1. ¿Por qué Vaultwarden necesita HTTPS para funcionar bien?
  2. ¿Qué hace el puerto publicado como 127.0.0.1:8222:80?
  3. ¿Qué hay que hacer después de crear tu cuenta?
  • #vaultwarden
  • #bitwarden
  • #tailscale
  • #https
  • #seguridad
  • #docker
Esc