Свой менеджер паролей на 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 {} +
Плюс эта папка уезжает в офлайн-копию раз в неделю. Менеджер паролей — это ровно тот сервис, где экономить на бэкапах нельзя ни в одном месте.