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

Чем облачный менеджер паролей не устраивает бизнес

  • Оплата за каждого сотрудника. Стоимость растёт вместе с командой, а переход на другой сервис потом обходится дорого и неудобно.
  • Хранилище у третьей стороны. Данные шифруются на устройстве, и провайдер не видит пароли в открытом виде. Но крупное хранилище чужих зашифрованных данных остаётся привлекательной целью, а защита этой инфраструктуры вам неподвластна.
  • Зависимость от сервиса. Сбой, смена тарифа или блокировка учётной записи организации оставляют команду без рабочих паролей.
  • Альтернатива хуже. Если менеджера нет, пароли оказываются в браузерах, таблицах и мессенджерах, то есть без всякого контроля.

Что такое Vaultwarden

Это неофициальный сервер на Rust, совместимый с API Bitwarden. С компанией Bitwarden Inc. проект не связан, но работает с официальными клиентами: расширениями для браузеров, мобильными приложениями и программой для компьютера. В окне входа достаточно выбрать «Self-hosted» и указать адрес своего сервера.

  • Шифрование выполняют клиенты на устройстве, а сервер хранит только зашифрованное хранилище.
  • Организации и общие коллекции для команды, разграничение прав.
  • Двухфакторная аутентификация: коды TOTP, ключи WebAuthn, YubiKey.
  • Вложения, одноразовая передача данных (Send), импорт из KeePass.
  • Скромные требования: хватит самого небольшого сервера.

Установка на сервер

Схема та же, что в статье про Nextcloud: rootless-контейнер Podman, описанный через Quadlet, и Nginx снаружи. Понадобятся Podman 4.4 или новее, Nginx и поддомен vault.вашдомен.ру.

1. Отдельный пользователь

Для хранилища паролей лучше завести отдельного пользователя, а не использовать пользователя другого сервиса:

sudo useradd -r -m -s /usr/bin/bash vaultwarden
sudo loginctl enable-linger vaultwarden
sudo -u vaultwarden -i
mkdir -p ~/.config/containers/systemd

enable-linger обязателен: без него systemd остановит контейнер, как только закончится последняя сессия пользователя.

2. Токен админ-панели

Админ-панель нужна для управления пользователями и настройками. Пароль к ней не хранят открытым текстом: генерируют хэш argon2 встроенной командой и кладут его в секрет Podman.

podman run --rm -it docker.io/vaultwarden/server /vaultwarden hash

Команда дважды спросит пароль и выведет строку вида $argon2id$v=19$.... Именно этот пароль потом вводится в /admin, а строку с хэшем сохраняем как секрет (одинарные кавычки обязательны, иначе оболочка съест символы $):

printf '%s' '$argon2id$v=19$m=65540,t=3,p=4$...' | podman secret create vw_admin_token -

Панель не обязательна. Если секрет не задавать и убрать строку Secret= из юнита, панель будет отключена полностью, и для небольшой команды это самый безопасный вариант.

3. Quadlet-юниты

Том для данных — ~/.config/containers/systemd/vaultwarden.volume:

[Volume]

Сам сервис — ~/.config/containers/systemd/vaultwarden.container:

[Unit]
Description=Vaultwarden

[Container]
Image=docker.io/vaultwarden/server:latest
ContainerName=vaultwarden
Volume=vaultwarden.volume:/data:Z
PublishPort=127.0.0.1:8081:80
Environment=DOMAIN=https://vault.вашдомен.ру
# true только на время создания аккаунтов, потом false
Environment=SIGNUPS_ALLOWED=true
Secret=vw_admin_token,type=env,target=ADMIN_TOKEN

[Service]
Restart=always
TimeoutStartSec=300

[Install]
WantedBy=default.target

DOMAIN обязателен за reverse proxy и должен начинаться с https://: Vaultwarden должен знать, что работает по HTTPS. Порт, как и в статье про Nextcloud, привязан к 127.0.0.1, поэтому снаружи сервис виден только через Nginx.

systemctl --user daemon-reload
systemctl --user start vaultwarden.service

4. Nginx и HTTPS

Блок map размещается в контексте http, например в файле /etc/nginx/conf.d/websocket.conf:

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

Сайт:

server {
    listen 80;
    server_name vault.вашдомен.ру;

    location / {
        proxy_pass http://127.0.0.1:8081;
        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;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}
sudo certbot --nginx -d vault.вашдомен.ру

Заголовки Upgrade и Connection нужны для WebSocket: через них клиенты мгновенно получают изменения хранилища. Без них всё работает, но синхронизация приходит с задержкой.

5. Аккаунты и клиенты

Откройте https://vault.вашдомен.ру, создайте аккаунты сотрудников и сразу же закройте регистрацию: в юните замените SIGNUPS_ALLOWED=true на false и перезапустите сервис (systemctl --user restart vaultwarden.service). Новых сотрудников потом можно добавлять через приглашения в админ-панели (если она включена) или на время снова открывать регистрацию.

В приложениях Bitwarden выберите вход на собственном сервере, укажите адрес и войдите. Сразу включите двухфакторную аутентификацию. Мастер-пароль сервер не знает, поэтому восстановить его невозможно: потерянный мастер-пароль означает потерянное хранилище.

Резервные копии

Это самая важная часть. По документации Vaultwarden, обязательно копируются база данных и каталог attachments, а rsa_key* и config.json (если использовалась админ-панель) копировать рекомендуется.

Базу нельзя просто скопировать, пока сервис работает. В образе нет sqlite3, поэтому используется встроенная команда, которая создаёт согласованную копию. Выполняется она от имени пользователя vaultwarden (sudo -u vaultwarden crontab -e), без ключа -it, иначе в cron команда не запустится:

15 3 * * * podman exec vaultwarden /vaultwarden backup

Копия появится в каталоге данных под именем вида db_20261015_031500.sqlite3. Старые копии стоит периодически чистить, а каталог данных включить в общую схему резервного копирования (Borg Backup). Путь к нему показывает команда podman volume inspect systemd-vaultwarden. Копии содержат адреса почты и зашифрованные хранилища, поэтому хранить их нужно тоже в зашифрованном виде: Borg шифрует репозиторий при инициализации, как описано в статье про бэкапы.

Восстановление: остановите сервис, положите нужную копию вместо db.sqlite3 и удалите файл db.sqlite3-wal, иначе устаревший журнал может повредить базу. Проверяйте восстановление на тестовом сервере раньше, чем оно понадобится.

Безопасность

  • Регистрация закрыта, админ-панель либо отключена, либо защищена хэшем. По умолчанию сессия панели живёт 20 минут, не увеличивайте её без необходимости.
  • Двухфакторная аутентификация у всех сотрудников и длинные мастер-пароли.
  • Fail2ban. Vaultwarden фиксирует неудачные попытки входа, а в вики проекта есть готовая инструкция по подключению (понадобится параметр LOG_FILE).
  • Обновления. В 2024 году немецкое ведомство BSI проверило код Vaultwarden, а независимый пентест нашёл три уязвимости, включая обход аутентификации, и передал их разработчикам. Для сервера паролей это аргумент в пользу того, чтобы версия всегда оставалась свежей: проверяйте выход релизов, обновляйте образ (podman pull, затем перезапуск юнита) и делайте копию перед обновлением.
  • Доступ только из VPN. Если вся команда уже пользуется WireGuard, хранилище можно закрыть в Nginx для всех, кроме адресов VPN. Клиенты хранят локальную копию, но синхронизация и изменения потребуют подключения.

Чего Vaultwarden не даёт

  • Поддержки и гарантий. Это проект сообщества: ни коммерческой поддержки, ни SLA нет. За работу сервера и копии отвечаете вы или ваш администратор.
  • Постоянного аудита. Проверки были разовыми, и это не то же самое, что регулярная сертификация коммерческого сервиса.
  • Полного паритета с Bitwarden. Реализация неофициальная, часть новых функций оригинала появляется с задержкой или отличается. Различия описаны в вики проекта.
  • Доступности из коробки. Облачный сервис сам отвечает за аптайм и репликацию, здесь это ваша задача. Если важны корпоративная поддержка, сертификаты и юридические гарантии, разумнее платный тариф Bitwarden.

Типичные ошибки

  • Нет HTTPS или неверный DOMAIN. Без адреса с https:// веб-хранилище и клиенты работают некорректно.
  • Регистрация осталась открытой. Любой, кто найдёт адрес, сможет создать аккаунт на вашем сервере.
  • ADMIN_TOKEN в открытом виде. Vaultwarden выдаёт об этом предупреждение. Заодно помните: после первого сохранения настроек в админ-панели создаётся config.json, и его значения важнее переменных окружения.
  • Копирование db.sqlite3 обычным cp. Копия работающей базы может не открыться. Нужна встроенная команда backup.
  • Забытые attachments и rsa_key*. Без вложений часть данных потеряется, а без ключей всех пользователей придётся авторизовать заново.
  • -it в cron. Команда podman exec -it без терминала завершается ошибкой, и резервные копии молча перестают создаваться. Проверяйте, что новые файлы db_*.sqlite3 действительно появляются.
  • Заголовки WebSocket не проброшены. Всё работает, но изменения приходят не сразу, а только при ручной синхронизации.
  • Ни разу не проверено восстановление. Копия, которую не разворачивали, остаётся предположением.

Сколько это стоит

Сам Vaultwarden бесплатен, а ресурсов ему нужно немного, поэтому его можно поселить на том же сервере, где уже работают почта или Nextcloud. Вместо абонентской платы за каждого сотрудника вы платите временем администратора: обновления, проверка копий, поддержка пользователей. Для команды в десяток человек это обычно разумный обмен, для большой организации с жёсткими требованиями к поддержке и аудиту стоит сравнить его с платным вариантом.

Итог

Vaultwarden позволяет держать пароли команды под своим контролем без подписки на каждого сотрудника и при этом пользоваться привычными приложениями Bitwarden. Условие простое: хранилище паролей нельзя разворачивать «на потом». Закрытая регистрация, HTTPS, двухфакторная аутентификация, свежая версия и проверенные резервные копии — это не опции, а минимум, без которого такой сервис хуже облачного.

Похожие материалы

Если нужно развернуть собственный менеджер паролей для команды или перенести пароли из облачного сервиса — напишите, настрою сервер, перенесу данные и подготовлю инструкцию для сотрудников.