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
- Un servidor con Docker y Compose. Si aún no los tienes, sigue Docker y Compose: la base para alojar tus servicios.
- Nginx instalado, como en tu servidor web con Nginx.
- Un subdominio para tu bóveda, como
claves.ejemplo.org, con un registro DNS de tipo A que apunte a tu servidor.
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"
DOMAINes la dirección pública de tu bóveda. Vaultwarden la usa para generar enlaces y para que funcionen los adjuntos.SIGNUPS_ALLOWEDdeja abierto el registro de cuentas. Lo necesitas para crear la tuya y lo cerrarás justo después.- Los datos quedan en
./datosy 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.attachmentsysends: 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.
