Laboratorio
Intermedio
cableando
Tu gestor de contraseñas con Vaultwarden

Tu gestor de contraseñas con Vaultwarden

Intermedio

Los pasos marcados en azul cambian según tu sistema.

Una contraseña distinta y larga para cada sitio es la medida de seguridad que más protege y la que menos gente sigue, porque nadie puede recordar doscientas. Para eso existen los gestores de contraseñas. El problema es que los más conocidos guardan tu bóveda en sus servidores, y que cada cierto tiempo uno de ellos sale en las noticias por una brecha.

Vaultwarden te deja tener el tuyo. Es una reimplementación libre del servidor de Bitwarden, escrita en Rust por la comunidad: compatible con todas las apps oficiales de Bitwarden (móvil, ordenador, extensión del navegador) y tan ligera que funciona con unos pocos megas de memoria. Las contraseñas se cifran en tus dispositivos con tu contraseña maestra antes de salir hacia el servidor, así que en él solo hay datos cifrados que nadie puede leer sin ella. Ni siquiera tú, desde el servidor.

Vaultwarden no es un producto de Bitwarden, Inc. Es un proyecto independiente que habla el mismo idioma que sus apps.

Lo que necesitas

HTTPS no es opcional: la web de la bóveda usa funciones criptográficas del navegador que solo funcionan en páginas cifradas, y las apps no se conectan a un servidor sin certificado. Lo pondrás en el paso 2.

Paso 1: el servicio

Crea una carpeta para Vaultwarden y su compose.yaml:

mkdir -p ~/servicios/vaultwarden
cd ~/servicios/vaultwarden
nano compose.yaml

~/servicios/vaultwarden/compose.yaml

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      DOMAIN: "https://claves.ejemplo.org"
      SIGNUPS_ALLOWED: "true"
    volumes:
      - ./datos:/data
    ports:
      - "127.0.0.1:8080:80"
  • DOMAIN es la dirección pública de tu bóveda. Vaultwarden la usa para generar enlaces y para que funcionen los adjuntos.
  • SIGNUPS_ALLOWED deja abierto el registro de cuentas. Lo necesitas para crear la tuya y lo cerrarás justo después.
  • Los datos quedan en ./datos y el puerto solo se publica para el propio servidor: la única puerta de entrada será Nginx.

Arráncalo y comprueba que no da errores:

docker compose up -d
docker compose logs
vaultwarden  | [INFO] Rocket has launched from http://0.0.0.0:80

Paso 2: Nginx y HTTPS

Crea el bloque de Nginx que recibe las visitas de claves.ejemplo.org y se las pasa a Vaultwarden.

Ubuntu

sudo nano /etc/nginx/sites-available/claves.ejemplo.org

/etc/nginx/sites-available/claves.ejemplo.org

server {
    listen 80;
    listen [::]:80;
    server_name claves.ejemplo.org;

    # Para poder subir adjuntos grandes
    client_max_body_size 128M;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Actívalo:

sudo ln -s /etc/nginx/sites-available/claves.ejemplo.org /etc/nginx/sites-enabled/

Debian

sudo nano /etc/nginx/sites-available/claves.ejemplo.org

/etc/nginx/sites-available/claves.ejemplo.org

server {
    listen 80;
    listen [::]:80;
    server_name claves.ejemplo.org;

    # Para poder subir adjuntos grandes
    client_max_body_size 128M;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Actívalo:

sudo ln -s /etc/nginx/sites-available/claves.ejemplo.org /etc/nginx/sites-enabled/

AlmaLinux / Rocky

sudo nano /etc/nginx/conf.d/claves.ejemplo.org.conf

/etc/nginx/conf.d/claves.ejemplo.org.conf

server {
    listen 80;
    listen [::]:80;
    server_name claves.ejemplo.org;

    # Para poder subir adjuntos grandes
    client_max_body_size 128M;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

SELinux no deja a Nginx conectarse a otros puertos hasta que se lo permites:

sudo setsebool -P httpd_can_network_connect 1

Las líneas Upgrade y Connection dejan pasar los websockets, con los que Vaultwarden avisa a tus apps al instante cuando cambias algo en otro dispositivo. Comprueba la configuración, recarga y pide el certificado:

sudo nginx -t
sudo systemctl reload nginx
sudo certbot --nginx -d claves.ejemplo.org

Si aún no tienes Certbot, en HTTPS gratis con Let’s Encrypt lo tienes en cinco minutos.

Paso 3: tu cuenta

Abre https://claves.ejemplo.org, pulsa en Crear cuenta y rellena tus datos.

La contraseña maestra es lo único que tendrás que recordar a partir de ahora, y no se puede recuperar. Si la olvidas, nadie podrá abrir tu bóveda: ni tú, ni quien administre el servidor, porque nunca sale de tus dispositivos. Usa una frase de cinco o seis palabras al azar, fácil de recordar y difícil de adivinar, y apúntala en papel en un lugar seguro hasta que te la sepas.

Después, en los ajustes de tu cuenta (Seguridad > Inicio de sesión en dos pasos), activa un segundo factor con una app de códigos.

Paso 4: cerrar el registro

Con tu cuenta creada, que nadie más pueda abrir una en tu servidor. Cambia SIGNUPS_ALLOWED a "false" en el compose.yaml:

~/servicios/vaultwarden/compose.yaml

    environment:
      DOMAIN: "https://claves.ejemplo.org"
      SIGNUPS_ALLOWED: "false"

Y recrea el contenedor para que lea el cambio:

docker compose up -d

Si un día quieres dar cuenta a tu familia o tu equipo, vuelve a abrir el registro unos minutos, o invítalos desde el panel de administración del paso siguiente.

Paso 5 (opcional): el panel de administración

Vaultwarden tiene un panel en /admin para gestionar usuarios, invitar a gente y ver el estado del servidor. Viene apagado, y si no lo necesitas, mejor así. Para encenderlo hace falta un token: una contraseña que guardarás cifrada, no en claro. Genera su versión cifrada:

docker exec -it vaultwarden /vaultwarden hash

Te pedirá la contraseña dos veces y devolverá una línea larga que empieza por $argon2id$. Guárdala en un archivo .env junto al compose.yaml, entre comillas simples para que los símbolos $ no se interpreten:

~/servicios/vaultwarden/.env

VAULTWARDEN_ADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=4$...'
chmod 600 .env

Añade la variable al servicio, en el bloque environment:

~/servicios/vaultwarden/compose.yaml

      ADMIN_TOKEN: ${VAULTWARDEN_ADMIN_TOKEN}

Recrea el contenedor con docker compose up -d y entra en https://claves.ejemplo.org/admin con la contraseña que escribiste, no con la línea cifrada.

Paso 6: las apps

Usa las apps oficiales de Bitwarden: la extensión para Firefox o Chrome, las de escritorio para Windows, macOS y Linux, y las de Android e iPhone. En la pantalla de inicio de sesión, donde pone que vas a entrar en bitwarden.com, despliega el selector y elige autoalojado. Escribe la dirección de tu servidor, https://claves.ejemplo.org, y entra con tu correo y tu contraseña maestra.

Para traerte las contraseñas que tenía guardadas el navegador, expórtalas desde sus ajustes en un archivo CSV e impórtalas en la web de tu bóveda, en Herramientas > Importar datos. Después borra ese archivo, que lleva todas tus contraseñas en claro, y bórralas también del navegador.

Paso 7: las copias de seguridad

Toda tu bóveda vive en la carpeta datos:

  • db.sqlite3: la base de datos, con todas las entradas cifradas.
  • attachments y sends: los archivos adjuntos y los envíos.
  • rsa_key.pem: la clave que firma las sesiones. Si se pierde, solo tendrás que volver a iniciar sesión en tus apps.

No copies la base de datos tal cual mientras Vaultwarden está escribiendo en ella. SQLite sabe hacer una copia coherente en caliente:

sudo apt install sqlite3
mkdir -p ~/copias
sudo sqlite3 ~/servicios/vaultwarden/datos/db.sqlite3 ".backup '$HOME/copias/vaultwarden-$(date +%F).sqlite3'"

(En AlmaLinux y Rocky, el paquete se instala con sudo dnf install sqlite.) Guarda esa copia junto con el resto de la carpeta datos fuera del servidor, con tus copias de seguridad cifradas con restic. Y de vez en cuando, exporta además tu bóveda desde la web (Herramientas > Exportar bóveda) en formato JSON cifrado: es tu plan B si algún día el servidor desaparece.

Mantenerlo al día

Un gestor de contraseñas es lo último que quieres desactualizado. Vaultwarden publica versiones a menudo, con correcciones de seguridad. Para actualizar:

cd ~/servicios/vaultwarden
docker compose pull
docker compose up -d

Para enterarte de cada versión nueva, suscríbete en tu lector de noticias a https://github.com/dani-garcia/vaultwarden/releases.atom.

Listo

Tus contraseñas viven ahora en tu servidor, cifradas con una llave que solo tienes tú, y se sincronizan en todos tus aparatos. A partir de aquí, cada vez que te registres en un sitio, deja que el gestor invente la contraseña.

Aprovecha para cambiar primero las más importantes: el correo (con él se recupera todo lo demás), el banco y la cuenta principal de tu móvil. Y si guardas en la bóveda la llave de recuperación de tus discos, como propone cifra el disco de tu ordenador, tendrás todas las llaves en un solo sitio bien cerrado.

X LinkedIn
¿Te ha resultado útil?

Sigue leyendo

Que tu servidor se parchee solo

Tutorial / Sistemas

Que tu servidor se parchee solo

Las vulnerabilidades graves se aprovechan en horas. Activa las actualizaciones de seguridad automáticas, con reinicio de madrugada solo cuando haga falta.

/8 min

Cifra el disco de tu ordenador

Tutorial / Sistemas

Cifra el disco de tu ordenador

Si te roban el portátil, que solo se lleven el aparato: cifrado completo con LUKS, FileVault o BitLocker, y dónde guardar la llave de recuperación.

/12 min

Copias de seguridad cifradas con restic

Tutorial / Sistemas

Copias de seguridad cifradas con restic

Copias diarias, cifradas antes de salir de tu equipo y sin duplicados, a otro servidor, un disco o la nube. Y una restauración que hayas probado.

/16 min