Пароли давно превратились в неотъемлемую часть цифровой жизни. Десятки сервисов, сотни учётных записей, сложные требования к длине и составу символов - помнить всё это в голове бесполезно, а записывать на бумажке опасно. Решение известно давным-давно - менеджеры паролей. На рынке их полно, от LastPass с его регулярными скандалами вокруг безопасности до 1Password с подпиской по сорок долларов в год за семейный план. Среди этого зоопарка особняком стоит Bitwarden - открытый продукт, который можно поднять на собственном сервере и не зависеть от чужих облаков.

Bitwarden появился в 2016 году и быстро завоевал репутацию одного из самых надёжных решений в своей нише. Исходники открыты, проходят регулярные независимые аудиты, реализация криптографии стандартная и проверенная - AES-256 для симметричного шифрования, PBKDF2 для производных ключей, Argon2 в свежих версиях. Клиенты доступны для всех мыслимых платформ - Windows, macOS, Linux, iOS, Android, плагины для всех популярных браузеров. Серверная часть тоже открытая и устанавливается своими силами на собственное железо. Получается полный контроль над своими секретами без необходимости доверять их кому бы то ни было.

В материале разбирается полный сценарий установки самохостящегося Bitwarden на сервер с Ubuntu 22.04. Подготовка системы, развёртывание Docker-окружения, создание выделенного пользователя для запуска сервиса, получение установочного ключа на официальном портале хостинга, прогон установочного скрипта с генерацией конфигурации и старт всего стека контейнеров. К концу прочтения читатель получает рабочий менеджер паролей, готовый принимать клиентские подключения с любых устройств.

Подготовка системы и установка вспомогательных пакетов перед развёртыванием Docker-инфраструктуры

Любая серьёзная установка начинается с приведения системы в актуальное состояние. Свежие патчи безопасности, последние версии библиотек, обновлённые ядра - всё это снимает половину будущих проблем. Команды стандартные, знакомые любому администратору Linux.

apt update -y
apt upgrade -y

Первая команда обновляет индексы пакетов из всех подключённых репозиториев. Вторая обновляет уже установленные пакеты до актуальных версий. Флаг -y автоматически отвечает положительно на все запросы подтверждения - удобно, когда установка проходит в скрипте или когда заранее ясно, что обновлять можно всё.

После обновления нужно поставить набор вспомогательных пакетов, которые понадобятся для подключения сторонних репозиториев и работы с ними.

apt install apt-transport-https ca-certificates curl software-properties-common -y

Каждый пакет тут на своём месте. Apt-transport-https добавляет в APT поддержку HTTPS-репозиториев. Сейчас он по большей части декоративный, потому что современный APT умеет HTTPS из коробки, но для совместимости со старыми руководствами и скриптами лучше его поставить. Ca-certificates содержит набор корневых сертификатов центров сертификации - без них любые TLS-соединения будут спотыкаться о невозможность проверить подлинность серверов. Curl используется буквально везде, где нужно скачать что-нибудь по HTTP. Software-properties-common даёт команду add-apt-repository, через которую удобно подключать сторонние репозитории.

Подключение официального репозитория Docker CE и установка контейнеризации в актуальной версии

Bitwarden на сервере живёт исключительно в Docker-контейнерах. Это решение разработчиков продукта, и менять его смысла нет. Поэтому сначала нужно поставить Docker, причём желательно свежую версию из официального репозитория, а не урезанную из дистрибутивных репозиториев Ubuntu.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

Команда скачивает GPG-ключ репозитория Docker и добавляет его в системную базу доверенных ключей через apt-key. Метод apt-key формально считается устаревшим, и в современных гайдах его уже заменяют на signed-by с явным указанием файла ключа, но в туториале использован классический подход. Для рабочей системы оба варианта дают идентичный результат - ключ оказывается в системе, и APT может проверять подписи пакетов из репозитория Docker.

Флаги curl стоят пояснения. Параметр -f заставляет утилиту молча падать при ошибках HTTP вместо вывода тела ошибки в stdout. Это важно, чтобы случайно не записать в базу ключей какую-нибудь страницу 404. Флаг -s включает silent-режим без прогресс-бара, -S при этом сохраняет вывод реальных ошибок. Флаг -L разрешает следовать за редиректами - если URL изменился, curl корректно перейдёт по новому адресу.

После добавления ключа подключается сам репозиторий.

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable"

Параметр arch=amd64 ограничивает работу с этим репозиторием для 64-битной архитектуры x86. Кодовое имя jammy соответствует Ubuntu 22.04 - на других версиях оно будет другим (focal для 20.04, bionic для 18.04). Канал stable означает использование стабильных релизов, а не testing или nightly.

Установка самого Docker выполняется обычной командой apt.

apt install docker-ce -y

Пакет docker-ce содержит сам движок контейнеризации. Помимо него подтянется ряд зависимостей - containerd для низкоуровневого управления контейнерами, docker-cli для работы с Docker из командной строки, libraries и утилиты. После завершения установки Docker автоматически стартует и прописывается в автозагрузку.

Проверка статуса службы подтверждает успешный запуск.

systemctl status docker

В нормальной ситуации вывод выглядит примерно так.

? docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2022-08-28 05:52:18 UTC; 47s ago
TriggeredBy: ? docker.socket
       Docs: https://docs.docker.com
   Main PID: 2719 (dockerd)
      Tasks: 7
     Memory: 30.3M
        CPU: 312ms
     CGroup: /system.slice/docker.service
             ??2719 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Aug 28 05:52:18 ubuntu2204 dockerd[2719]: time="2022-08-28T05:52:18.379341986Z" level=info msg="scheme \"unix\" not registered, fallback to d>
Aug 28 05:52:18 ubuntu2204 dockerd[2719]: time="2022-08-28T05:52:18.379467088Z" level=info msg="ccResolverWrapper: sending update to cc: {[{u>
Aug 28 05:52:18 ubuntu2204 dockerd[2719]: time="2022-08-28T05:52:18.379593467Z" level=info msg="ClientConn switching balancer to \"pick_first>
Aug 28 05:52:18 ubuntu2204 dockerd[2719]: time="2022-08-28T05:52:18.427861369Z" level=info msg="Loading containers: start."
Aug 28 05:52:18 ubuntu2204 dockerd[2719]: time="2022-08-28T05:52:18.620267088Z" level=info msg="Default bridge (docker0) is assigned with an >
Aug 28 05:52:18 ubuntu2204 dockerd[2719]: time="2022-08-28T05:52:18.713742709Z" level=info msg="Loading containers: done."
Aug 28 05:52:18 ubuntu2204 dockerd[2719]: time="2022-08-28T05:52:18.744925054Z" level=info msg="Docker daemon" commit=a89b842 graphdriver(s)=>
Aug 28 05:52:18 ubuntu2204 dockerd[2719]: time="2022-08-28T05:52:18.745338168Z" level=info msg="Daemon has completed initialization"
Aug 28 05:52:18 ubuntu2204 systemd[1]: Started Docker Application Container Engine.
Aug 28 05:52:18 ubuntu2204 dockerd[2719]: time="2022-08-28T05:52:18.805663866Z" level=info msg="API listen on /run/docker.sock"

Зелёный active (running), низкое потребление памяти около 30 мегабайт и сообщение о готовности API через unix-сокет - всё, как и должно быть на здоровой системе.

Установка инструмента docker-compose для оркестрации многоконтейнерных приложений

Bitwarden состоит из дюжины компонентов, каждый в своём контейнере - база данных, веб-интерфейс, API-сервер, сервисы аутентификации, иконки, нотификации, прокси и так далее. Управлять таким зоопарком вручную через docker run было бы безумием. Тут на сцену выходит docker-compose - инструмент, описывающий многокомпонентные приложения через YAML-файл и поднимающий весь стек одной командой.

В Ubuntu 22.04 нет docker-compose в стандартных репозиториях, поэтому скачивание идёт напрямую с GitHub проекта.

curl -sL "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Внутри URL используются подстановки команд $(uname -s) и $(uname -m). Первая возвращает имя операционной системы (Linux), вторая - архитектуру процессора (x86_64). В итоге получается полный путь к нужной сборке для конкретной системы. Флаг -o указывает, куда сохранить скачанный файл - в /usr/local/bin/docker-compose, что делает его доступным из любого места без указания полного пути.

Версия 1.29.2 в туториале немного устарела - текущие релизы Docker Compose уже на ветке v2 с заметными изменениями в поведении и синтаксисе. Для совместимости с установочным скриптом Bitwarden именно эта версия лучше всего подходит, потому что новые версии Compose иногда ломают старые скрипты тонкими отличиями в обработке команд.

После скачивания файлу нужно дать права на выполнение.

chmod +x /usr/local/bin/docker-compose

Без этого Linux откажется запускать его как программу, даже если файл лежит в правильном месте. Атрибут executable в Unix - это не формальность, а реальный механизм безопасности, не позволяющий случайно выполнить файл данных как код.

Проверка успешной установки.

docker-compose --version
docker-compose version 1.29.2, build 5becea4c

Версия совпадает со скачанной, инструмент готов к работе.

Создание выделенного пользователя для работы Bitwarden и настройка прав на каталог установки

Запускать сетевой сервис от root - дурной тон и прямой риск безопасности. При нахождении уязвимости в приложении атакующий получает права суперпользователя на всю систему. Куда правильнее создать отдельного пользователя со своим домашним каталогом и минимально необходимыми правами.

useradd -G docker,sudo -s /bin/bash -m -d /opt/bitwarden bitwarden

Команда useradd с насыщенным набором флагов делает несколько вещей разом. Параметр -G docker,sudo добавляет нового пользователя в две дополнительные группы. Группа docker даёт право работать с Docker без постоянного sudo - без неё каждая команда требовала бы повышения привилегий. Группа sudo позволяет повышать привилегии при необходимости, что нужно для запуска установочного скрипта Bitwarden.

Флаг -s /bin/bash указывает оболочку для интерактивного входа. Параметр -m создаёт домашний каталог пользователя, -d /opt/bitwarden задаёт нестандартный путь к этому каталогу. Размещение в /opt вместо привычного /home не случайно - там традиционно живут сторонние приложения, и Bitwarden как раз попадает в эту категорию.

Дальше задаётся пароль для свежесозданной учётной записи.

passwd bitwarden

Утилита запросит новый пароль дважды и подтвердит успешную установку.

New password: 
Retype new password: 
passwd: password updated successfully

На боевой системе этот пароль должен быть длинным и случайным. Учётка имеет права sudo и доступ к управлению Docker - её компрометация фактически равна получению root-доступа.

Финальный штрих - назначение правильного владельца на каталог установки.

chown -R bitwarden: /opt/bitwarden

Флаг -R делает операцию рекурсивной - меняет владельца не только у самого каталога, но и у всего его содержимого. Двоеточие после имени пользователя без указания группы означает использование основной группы пользователя bitwarden, которая у новых учёток обычно совпадает по имени с самой учёткой.

Получение установочного ключа на портале Bitwarden и прохождение интерактивной инсталляции через официальный скрипт

Перед запуском установки нужен один важный артефакт - установочный ключ от Bitwarden. Это уникальная пара значений ID и Key, которые сервер использует для связи с облачной инфраструктурой проекта при синхронизации некоторых функций. Получить их можно бесплатно на официальной странице хостинга, заполнив минимальную форму с email-адресом.

После получения ключа происходит переключение в контекст пользователя bitwarden и скачивание установочного скрипта.

su - bitwarden
curl -Lso bitwarden.sh https://go.btwrdn.co/bw-sh

Команда curl с флагами -L (следовать редиректам), -s (silent) и -o (output to file) скачивает официальный скрипт установки в файл bitwarden.sh в текущем каталоге. URL начинается с короткого домена go.btwrdn.co, который редиректит на актуальную версию скрипта в репозитории Bitwarden.

Файлу нужно дать права на выполнение.

chmod +x bitwarden.sh

И затем запустить процесс установки с привилегиями sudo, потому что скрипт будет создавать каталоги, генерировать конфиги и обращаться к Docker.

sudo ./bitwarden.sh install

Скрипт встретит пользователя классическим ASCII-арт-логотипом Bitwarden и пройдётся по серии вопросов.

 _     _ _                         _            
| |__ (_) |___      ____ _ _ __ __| | ___ _ __  
| '_ \| | __\ \ /\ / / _` | '__/ _` |/ _ \ '_ \ 
| |_) | | |_ \ V  V / (_| | | | (_| |  __/ | | |
|_.__/|_|\__| \_/\_/ \__,_|_|  \__,_|\___|_| |_|

Open source password management solutions
Copyright 2015-2022, 8bit Solutions LLC
https://bitwarden.com, https://github.com/bitwarden

===================================================

bitwarden.sh version 2022.8.4
Docker version 20.10.17, build 100c701
docker-compose version 1.29.2, build 5becea4c

(!) Enter the domain name for your Bitwarden instance (ex. bitwarden.example.com): 208.117.81.243

(!) Do you want to use Let's Encrypt to generate a free SSL certificate? (y/n): n

(!) Enter the database name for your Bitwarden instance (ex. vault): bitwarden

Первый вопрос - доменное имя или IP-адрес инстанса. Лучше всегда указывать настоящий домен с правильно настроенной DNS-записью, потому что без него не работает автоматическая выписка SSL-сертификата от Let's Encrypt и часть функций будет недоступна. В туториале для примера указан IP, но это компромиссное решение.

Второй вопрос про Let's Encrypt - при использовании реального домена тут нужно ответить yes, и Bitwarden сам выпишет и настроит SSL-сертификат. С IP-адресом такая опция невозможна, поэтому ответ no и далее придётся либо генерировать самоподписанный сертификат, либо ставить свой собственный.

Имя базы данных vault или bitwarden - решение чисто косметическое. На функциональность не влияет, но в логах и конфигах будет фигурировать именно это имя. Для самохостящихся инсталляций bitwarden обычно понятнее.

После ответов скрипт начинает скачивать setup-образ и продолжает диалог.

2022.8.4: Pulling from bitwarden/setup
1efc276f4ff9: Pull complete 
e5aeae5c9ad4: Pull complete 
9d8b4edc672a: Pull complete 
67bb3a123350: Pull complete 
4b31f33ff8ee: Pull complete 
8302c6d93c2f: Pull complete 
64c1ff0e03a3: Pull complete 
289e8b648bb1: Pull complete 
c706fe453135: Pull complete 
6b18bfe90415: Pull complete 
Digest: sha256:257317606bad7b6c06755c81e4f61099b4af8b89829d7a9a2688545b92daa45f
Status: Downloaded newer image for bitwarden/setup:2022.8.4
docker.io/bitwarden/setup:2022.8.4

(!) Enter your installation id (get at https://bitwarden.com/host): c1908405-5beb-497f-9f09-aefe00f87c3f

(!) Enter your installation key: yQVH9PTcUIPftio0ZM8L

(!) Do you have a SSL certificate to use? (y/n): n

(!) Do you want to generate a self-signed SSL certificate? (y/n): y

Установочный ID и Key - те самые значения, полученные на портале хостинга. Без них установка не пойдёт, потому что скрипт не сможет подтвердить легитимность инсталляции.

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

После всех ответов начинается собственно установка - генерация ключей, создание конфигов, подготовка docker-compose.yml.

Generating key for IdentityServer.
Generating a RSA private key
.........................++++
.++++
writing new private key to 'identity.key'
-----

!!!!!!!!!! WARNING !!!!!!!!!!
You are not using a SSL certificate. Bitwarden requires HTTPS to operate. 
You must front your installation with a HTTPS proxy or the web vault (and 
other Bitwarden apps) will not work properly.

Building nginx config.
Building docker environment files.
Building docker environment override files.
Building FIDO U2F app id.
Building docker-compose.yml.

Installation complete

If you need to make additional configuration changes, you can modify
the settings in `./bwdata/config.yml` and then run:
`./bitwarden.sh rebuild` or `./bitwarden.sh update`

Next steps, run:
`./bitwarden.sh start`

Предупреждение про SSL появляется потому, что Bitwarden принципиально требует HTTPS для работы клиентов. Без шифрования веб-трафика мобильные приложения и плагины браузеров просто откажутся подключаться к серверу. Для экспериментов и тестов самоподписанный сертификат сойдёт, но для боевой эксплуатации обязательно нужен сертификат от доверенного CA.

Запуск всего стека контейнеров и проверка работоспособности компонентов через Docker

Установка только подготовила инфраструктуру, но контейнеры пока не работают. Их запуск выполняется отдельной командой того же скрипта.

sudo ./bitwarden.sh start

Вывод показывает скачивание оставшихся образов и создание контейнеров.

bitwarden.sh version 2022.8.4
Docker version 20.10.17, build 100c701
docker-compose version 1.29.2, build 5becea4c

Pulling mssql         ... done
Pulling web           ... done
Pulling attachments   ... done
Pulling api           ... done
Pulling identity      ... done
Pulling sso           ... done
Pulling admin         ... done
Pulling icons         ... done
Pulling notifications ... done
Pulling events        ... done
Pulling nginx         ... done
Creating directory /opt/bitwarden/bwdata/core
Creating directory /opt/bitwarden/bwdata/core/attachments
Creating directory /opt/bitwarden/bwdata/logs
Creating directory /opt/bitwarden/bwdata/logs/admin
Creating directory /opt/bitwarden/bwdata/logs/api
Creating directory /opt/bitwarden/bwdata/logs/events
Creating directory /opt/bitwarden/bwdata/logs/icons
Creating directory /opt/bitwarden/bwdata/logs/identity
Creating directory /opt/bitwarden/bwdata/logs/mssql
Creating directory /opt/bitwarden/bwdata/logs/nginx
Creating directory /opt/bitwarden/bwdata/logs/notifications
Creating directory /opt/bitwarden/bwdata/logs/sso
Creating directory /opt/bitwarden/bwdata/logs/portal
Creating directory /opt/bitwarden/bwdata/mssql/backups
Creating directory /opt/bitwarden/bwdata/mssql/data
Creating network "docker_default" with the default driver
Creating network "docker_public" with the default driver
Creating bitwarden-notifications ... done
Creating bitwarden-events        ... done
Creating bitwarden-icons         ... done
Creating bitwarden-mssql         ... done
Creating bitwarden-attachments   ... done
Creating bitwarden-web           ... done
Creating bitwarden-sso           ... done
Creating bitwarden-identity      ... done
Creating bitwarden-api           ... done
Creating bitwarden-admin         ... done
Creating bitwarden-nginx         ... done
2022.8.4: Pulling from bitwarden/setup
Digest: sha256:257317606bad7b6c06755c81e4f61099b4af8b89829d7a9a2688545b92daa45f
Status: Image is up to date for bitwarden/setup:2022.8.4
docker.io/bitwarden/setup:2022.8.4


Bitwarden is up and running!
===================================================

visit http://bitwarden.example.com
to update, run `./bitwarden.sh updateself` and then `./bitwarden.sh update`

Картина впечатляющая. Скрипт создаёт целую файловую структуру для логов, бэкапов базы данных и кеша, поднимает две Docker-сети для изоляции трафика и стартует одиннадцать контейнеров. Каждый контейнер отвечает за свой кусочек функциональности - Microsoft SQL Server в роли базы данных (исторически Bitwarden был написан под .NET и использует MSSQL), nginx для проксирования веб-запросов, identity для управления токенами аутентификации, sso для интеграции с внешними провайдерами, admin для административной панели, API-сервер, attachments для хранения вложений, icons для подгрузки фавиконок сайтов, notifications для realtime-уведомлений, events для аудит-логов и web для веб-интерфейса хранилища.

Проверка скачанных образов через docker images подтверждает картину.

sudo docker images
REPOSITORY                TAG        IMAGE ID       CREATED       SIZE
bitwarden/mssql           2022.8.4   0fde97fd6c2b   11 days ago   1.4GB
bitwarden/setup           2022.8.4   c3f86466c311   11 days ago   271MB
bitwarden/notifications   2022.8.4   ad800e29d1bf   11 days ago   286MB
bitwarden/identity        2022.8.4   39342ec67118   11 days ago   284MB
bitwarden/nginx           2022.8.4   a9e4cdb98e3d   11 days ago   144MB
bitwarden/icons           2022.8.4   e52e97fcc4c1   11 days ago   285MB
bitwarden/admin           2022.8.4   25fe354a8fa2   11 days ago   346MB
bitwarden/sso             2022.8.4   345ee4d3d544   11 days ago   289MB
bitwarden/events          2022.8.4   012f3c8dc079   11 days ago   284MB
bitwarden/api             2022.8.4   f780a0e0bfbf   11 days ago   289MB
bitwarden/attachments     2022.8.4   8b08874c96fc   11 days ago   214MB
bitwarden/web             2022.8.1   1ac4e585d2dd   2 weeks ago   247MB

Самый крупный образ - mssql на 1.4 гигабайта, что объяснимо - в нём лежит полноценная Microsoft SQL Server Express Edition. Остальные компоненты заметно скромнее по размеру, в районе 200 - 350 мегабайт каждый.

Активные контейнеры показывает docker ps.

sudo docker ps
CONTAINER ID   IMAGE                              COMMAND            CREATED          STATUS                             PORTS                                                                                    NAMES
9af240bb8845   bitwarden/nginx:2022.8.4           "/entrypoint.sh"   33 seconds ago   Up 28 seconds (health: starting)   80/tcp, 0.0.0.0:80->8080/tcp, :::80->8080/tcp, 0.0.0.0:443->8443/tcp, :::443->8443/tcp   bitwarden-nginx
4758bb5d8c6c   bitwarden/admin:2022.8.4           "/entrypoint.sh"   39 seconds ago   Up 33 seconds (health: starting)   5000/tcp                                                                                 bitwarden-admin
2814dd1eddd2   bitwarden/identity:2022.8.4        "/entrypoint.sh"   45 seconds ago   Up 35 seconds (healthy)            5000/tcp                                                                                 bitwarden-identity
22fa6c748d4f   bitwarden/sso:2022.8.4             "/entrypoint.sh"   45 seconds ago   Up 34 seconds (health: starting)   5000/tcp                                                                                 bitwarden-sso
9906ace7ea69   bitwarden/api:2022.8.4             "/entrypoint.sh"   45 seconds ago   Up 34 seconds (healthy)            5000/tcp                                                                                 bitwarden-api
1d1f10c10667   bitwarden/mssql:2022.8.4           "/entrypoint.sh"   45 seconds ago   Up 39 seconds (health: starting)                                                                                            bitwarden-mssql
f7ab34d501cc   bitwarden/attachments:2022.8.4     "/entrypoint.sh"   45 seconds ago   Up 37 seconds (healthy)                                                                                                     bitwarden-attachments
6646bf077ba8   bitwarden/web:2022.8.1             "/entrypoint.sh"   45 seconds ago   Up 39 seconds (healthy)                                                                                                     bitwarden-web
e73076475cc7   bitwarden/icons:2022.8.4           "/entrypoint.sh"   45 seconds ago   Up 35 seconds (health: starting)   5000/tcp                                                                                 bitwarden-icons
535f2f7599c1   bitwarden/events:2022.8.4          "/entrypoint.sh"   45 seconds ago   Up 35 seconds (healthy)            5000/tcp                                                                                 bitwarden-events
7a489f258459   bitwarden/notifications:2022.8.4   "/entrypoint.sh"   45 seconds ago   Up 34 seconds (healthy)            5000/tcp                                                                                 bitwarden-notifications

Контейнер nginx - единственный, который проброшен наружу через порты 80 и 443 хоста. Все остальные слушают порт 5000 только внутри Docker-сети, а наружу попадают исключительно через прокси. Это правильная архитектура с минимальной поверхностью атаки. Статусы health: starting в первые минуты - норма, потому что приложениям нужно время на разогрев и проверку зависимостей. Через несколько минут все контейнеры перейдут в состояние healthy.

Регистрация первого пользователя в веб-интерфейсе и практическое использование развёрнутого менеджера паролей

Bitwarden запущен и готов принимать подключения. Открыв в браузере адрес https://your-server-ip, пользователь видит страницу входа со стандартным интерфейсом Bitwarden. При использовании самоподписанного сертификата браузер выдаст предупреждение о небезопасном соединении - на этапе тестирования его можно проигнорировать, на боевой инсталляции нужно поставить нормальный сертификат.

Первый шаг - регистрация учётной записи через кнопку Create Account. На странице регистрации запрашивается email-адрес и мастер-пароль. К мастер-паролю стоит отнестись особенно серьёзно. Этот пароль - ключ ко всей цифровой жизни пользователя. Его нельзя восстановить, потерять или забыть. Bitwarden не хранит мастер-пароль ни в каком виде, он используется локально на устройстве клиента для генерации криптографических ключей, которыми шифруется содержимое хранилища.

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

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

Дальше начинается рутина переноса паролей. Можно импортировать данные из других менеджеров через CSV или JSON-файлы, можно вводить вручную, можно подключить плагины браузеров и они сами начнут предлагать сохранять новые пароли. Мобильные приложения для iOS и Android интегрируются с системным механизмом автозаполнения, делая ввод паролей на телефоне таким же удобным, как в браузере на компьютере.

Получившаяся установка - это персональный сервер для хранения цифровой идентичности всей семьи или небольшой команды. Через бесплатный план самохостящегося Bitwarden можно создавать организации с несколькими пользователями, делиться отдельными хранилищами между членами команды, настраивать гранулярные права доступа. Корпоративные функции вроде аудита паролей на компрометацию через сервис Have I Been Pwned, проверки сложности и старости паролей, уведомлений о повторном использовании работают в полном объёме без всяких ограничений. Освоение этой системы избавляет пользователя от вечной зависимости от облачных сервисов с их непонятной политикой безопасности и периодическими утечками данных. Свои секреты лучше хранить у себя - простая мысль, реализация которой стала доступна благодаря открытым проектам уровня Bitwarden.