Менеджеры паролей действительно полезны и важны как для отдельных пользователей, так и для организаций, и они пригодятся, когда у вас много разных учетных записей и паролей. Обычно люди не любят пользоваться сторонними менеджерами паролей с сервисной архитектурой — неизвестно, что происходит с данными на чужом сервере, и не будет ли он скомпрометирован. Самое безопасное решение это разместить менеджер на своём собственном (как следует защищенном) сервере. Разумеется, к такому self-hosted варианту возникает много требований, и большой список решений с открытым исходным кодом довольно быстро сужается до нескольких известных, проверенных продуктов. Среди них мне больше всего нравится Bitwarden, и сейчас я объясню почему.
Каким должен быть идеальный менеджер паролей?
- Разумеется, безопасным. Нельзя даже рассматривать не-опенсорсные варианты, ведь предназначение любого закрытого кода это сливать ваши данные или внедрять всякие неприятные штуки в систему. И пароли — лучшее место, чтобы дать волю паранойе, поэтому отметаем непопулярные продукты и форки, если нет желания читать все исходники целиком и собирать проект из исходников.
- Второй очевидный и обязательный аспект безопасности — шифрование. Было бы глупо настроить супер-секьюрную систему на сервере и потерять пароли из-за MITMа злоумышленника или провайдера.
- Бывает, что нужно хранить не только пароли. Важная и чувствительная информация может быть представлена в виде текста (например, токены), и этот текст должно быть удобно хранить в менеджере.
- Любые данные могут использоваться несколькими людьми. Например, любые чувствительные данные, относящиеся к IT-инфраструктуре бизнеса, не могут быть доступны одному конкретному админу. Отсюда вытекает необходимость делиться защищёнными данными с несколькими аккаунтами в организации.
- Особенно важный пункт для лично использования: кроссплатформенность. Мы используем одни и те же аккаунты с разных устройств, и в идеале менеджер паролей должен работать на всех возможных платформах и в как можно большем количестве браузеров и приложений.
- Также для self-hosted хранилища нужно делать регулярные бекапы. И вообще было бы неплохо, чтобы вся система устанавливалась без лишнего геморроя. В конце концов, не все мы красноглазые героические админы и девопсы.
Обычно у айтишников (особенно, у повёрнутых на безопасности) возникают и более детальные, личные требования. Я привёл лишь те, которые кажутся мне самыми распространёнными и важными. И, конечно, Bitwarden удовлетворяет им всем, иначе я бы нашёл вариант получше. Вообще у него есть и сервисная часть, и даже платные планы, но базового функционала бесплатного плана нам вполне хватит. При этом self-hosted версия вообще никак не связана с серверами bitwarden.com (исходный код которых также открыт и проходит регулярные аудиты безопасности).
Разворачиваем свой инстанс
Bitwarden распространяется в виде пачки Docker-контейнеров и многофункционального скрипта для установки, настройки и управления инстансом. Всё работает из коробки, кроме одного — для подтверждения регистрации аккаунта сервер должен отправить email на указанный адрес. Кроме того, для доступа к админ-панели на электропочту админа отправляется временная ссылка для входа, поэтому помимо основной установки нам потребуется настроенный email-сервер. Почтовых серверов очень много, как и мануалов по их установке, останавливаться на их выборе я не буду — подойдёт любой send-only или полноценный вариант. Мне понравилось пользоваться docker-mailserver, в котором всё работает практически из коробки, поэтому для меня итоговая схема выглядит так:
Подготовка
В первую очередь нам понадобится docker и docker-compose:
#Docker engine
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
#Docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Затем, чтобы не работать из-под рута, создадим пользователя bitwarden и продолжим работу под ним:
sudo adduser bitwarden
sudo passwd bitwarden
Создадим группу docker, если она ещё не существует, и добавим в неё пользователя:
sudo groupadd docker
sudo usermod -aG docker bitwarden
Создадим рабочую директорию для bitwarden:
sudo mkdir /opt/bitwarden
sudo chmod -R 700 /opt/bitwarden
sudo chown -R bitwarden:bitwarden /opt/bitwarden
Установка
Скачаем и запустим установочный скрипт:
curl -Lso bitwarden.sh https://go.btwrdn.co/bw-sh && chmod 700 bitwarden.sh
./bitwarden.sh install
Заполняем поля в установщике:
- В качестве доменного имени можно указать любой адрес или домен, но в качестве стандарта принято использовать bitwarden.yourdomain.tld.
- Можно использовать как существующий SSL-сертификат, так и сгенерировать новый, самоподписанный. На втором шаге будет предложено использовать Let's Encrypt.
- Дальше установщик запросит id и ключ установки. Их нужно получить на bitwarden.com/host, указав контактный email (подтверждение не требуется).
Вскоре на указанном домене будет создан и запущен работающий инстанс Bitwarden, но нам ещё нужно настроить почту. Устанавливаем и конфигурируем почтовый сервер, затем отправляемся редактировать файл
/opt/bitwarden/bwdata/env/global.override.env
(с заменой всех плейсхолдеров, разумеется): globalSettings__mail__replyToEmail=no-reply@bitwarden.yourdomain.tld
globalSettings__mail__smtp__host=smtp.example.com
globalSettings__mail__smtp__username=root_email_username
globalSettings__mail__smtp__password=p@ssword
globalSettings__mail__smtp__ssl=true
globalSettings__mail__smtp__port=587
globalSettings__mail__smtp__useDefaultCredentials=false
adminSettings__admins=admin_email_username@example.com
После любых изменений в конфигах нужно пересобрать сервис:
./bitwarden.sh rebuild
Использование
Теперь всё готово к работе с менеджером и можно отправляться в веб-интерфейс регистрироваться. После регистрации нас сразу пустит в рабочую панель, но для синхронизации данных между устройствами нужно будет подтвердить email:
После подтверждения аккаунт становится доступен для входа с других устройств. Во всех клиентах Bitwarden (десктопные и мобильные приложения, веб-интерфейсы, расширения) есть кнопка настроек в углу, где мы указываем адрес нашего инстанса:
Бэкапы
Вариантов настройки бэкапов много, но как минимум нам надо сохранять всё содержимое папки
/opt/bitwarden/bwdata
. При этом Bitwarden сам ежедневно бэкапит содержимое ./bwdata/mssql/data
, где хранится база данных. Для восстановления данных нужно вытащить пароль к бд из global.override.env
(значение в строке globalSettings__sqlServer__connectionString=...Password=
), подключиться к контейнеру bitwarden-mssql
и найти нужный файл для бэкапа (по дате в названии): docker exec -it bitwarden-mssql /bin/bash
Запускаем sqlcmd:
/opt/mssql-tools/bin/sqlcmd -S localhost -U user -P password
Вместо user и password подставляем значения User= и Password= из
global.override.env
В открывшейся оболчке выполняем следующие команды:
1> use master
2> GO
1> alter database vault set offline with rollback immediate
2> GO
1> restore database vault from disk='/etc/bitwarden/mssql/backups/vault_FULL_{Backup File Name}.BAK' with replace
2> GO
?1> alter database vault set online
2> GO
1> exit
Обязательно перезапускаем инстанс:
./bitwarden.sh restart
Заключение
Для self-hosted версии доступен полноценный функционал кроссплатформенного менеджера паролей. Все изменения синхронизируются между клиентами, а данные можно раздавать пользователям в своей организации. Вся установка занимает минут 10-15, и сервис почти никогда не требует администрирования — настроил и забыл. Я считаю, это очень круто. Приятного пользования!
На правах рекламы
Для размещения Bitwarden, а также для множества других целей и задач, вы можете использовать наши легендарные эпичные серверы. Большое количество преимуществ: современное железо с процессорами AMD Epyc, защита от DDoS-атак из коробки, возможность автоматически или вручную создать резервные копии в виде снимков сервера, удобная панель управления серверами собственной разработки. Эпичненько.
l0rda
Использую в проде bitwarden_rs уже пару лет, реализация сервера bitwarden на rust, нереально быстр, много не кушает и не тянет за собой монстра mssql.
github.com/dani-garcia/bitwarden_rs
mkpankov
Я считаю, для менеджера паролей критично прохождение независимоого аудита безопасности. Для официального сервера его делали дважды, а тут нет
estet
С другой стороны тащить на сервер .Net не очень хочется. Помимо реализации на Rust, есть еще реализации на Go и на Ruby on Rails. И согласен с Михаилом по сравнению с официальными у них общий недостаток — отсутствие аудита. Реализации можно чуть больше доверять, ее делал для личного использования разработчик OpenBSD.
mkpankov
Про какую ты реализацию в итоге?
estet
Которая на RoR
vandreykiv
github.com/jcs/rubywarden/issues/122
А он рекомендует использовать ту что rust :)
estet
есть пруфы?
vandreykiv
Так ссылка выше или чукча не читатель?
VelocidadAbsurda
С end-to-end шифрованием по идее критичен только аудит клиента. К серверу же требования смягчаются до обеспечения целостности, предотвращения стороннего вандализма и не быть дырой для атаки на другой софт на той же машине. Понятно, что безопасности много не бывает, но всё-таки критичное — клиент.