Свой менеджер паролей на Vaultwarden

До этого я держал пароли в большом облачном менеджере по подписке. Работало нормально, но платить за хранилище текстовых строк как-то жаба душила, да и хотелось, чтобы база лежала у меня, а не у дяди. Поднял Vaultwarden.

Что это

Vaultwarden — это лёгкая реализация сервера Bitwarden на Rust. Совместима с официальными клиентами Bitwarden: браузерные расширения, десктоп, мобильные приложения — всё цепляется к твоему серверу, просто указываешь свой адрес вместо облачного. При этом она в разы прожорливее официального сервера, контейнер ест десятки мегабайт памяти и крутится хоть на тостере.

Установка

Стек в /app/vaultwarden/:

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      DOMAIN: "https://vault.example.home"
      SIGNUPS_ALLOWED: "false"
      ADMIN_TOKEN: "${ADMIN_TOKEN}"
    volumes:
      - ./data:/data
    ports:
      - 8080:80

Пара важных моментов. SIGNUPS_ALLOWED: false ставлю сразу после того, как зарегил себе и домашним аккаунты — иначе любой, кто доберётся до адреса, заведёт себе учётку. Доступ снаружи обязательно через HTTPS, реверс-прокси с валидным сертификатом: расширения Bitwarden просто откажутся работать по голому HTTP.

Admin token

ADMIN_TOKEN — это ключ от админ-панели на /admin, где видно пользователей и настройки. Генерю его хешем, а не открытой строкой:

docker run --rm vaultwarden/server /vaultwarden hash

Команда спросит пароль и выдаст argon2-хеш — его и кладу в .env. Если оставить токен пустым, админка будет открыта вообще без пароля, что довольно весело и грустно одновременно.

Клиенты

Тут вообще без сюрпризов. В браузерном расширении Bitwarden перед логином жму на шестерёнку, в поле Server URL вписываю свой адрес — и дальше всё как с обычным Bitwarden. Автозаполнение, генератор паролей, синхронизация между устройствами. Мобильное приложение так же. Домашние даже не заметили переезда.

Самое важное — бэкап

Вся база — это SQLite-файл и пара ключей в папке data. Потеряешь её — потеряешь вообще все пароли разом, и это будет не «неприятно», а «катастрофа». Поэтому бэкап настроил первым делом, ещё до того, как занёс реальные пароли.

Простой ночной дамп с ротацией:

#!/bin/bash
DST=/mnt/backup/vaultwarden/$(date +%F)
mkdir -p "$DST"
sqlite3 /app/vaultwarden/data/db.sqlite3 ".backup '$DST/db.sqlite3'"
cp /app/vaultwarden/data/rsa_key.* "$DST/"
find /mnt/backup/vaultwarden -maxdepth 1 -type d -mtime +30 -exec rm -rf {} +

Плюс эта папка уезжает в офлайн-копию раз в неделю. Менеджер паролей — это ровно тот сервис, где экономить на бэкапах нельзя ни в одном месте.