Проблема

Нужно установить Bitwarden Server для работой с организацией. Также не забываем о Docker.

Решение

Для запуска и установки в личных целях, достаточно воспользоваться официальной инструкцией по ссылке https://help.bitwarden.com/article/install-on-premise/.
Не забываем установить Docker и Docker-compose:

1
2
3
4
curl -sSL https://get.docker.com/ | sh
sudo usermod -aG docker ${USER}
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Возможно код sudo usermod -aG docker ${USER} не заработает, замените ${USER} на имя группы своего пользователя.
Для работы с организацией есть два варианта:

  1. Купить лицензию
  2. Изменить ядро лицензирования сервера

Купить всегда успеем, а в качестве образовательной цели — выберем второй вариант 🙂
Изучаем информацию:

  1. https://github.com/jakeswenson/BitBetter
  2. https://github.com/online-stuff/BitBetter
  3. https://github.com/h44z/BitBetter

Для последней версии bitwarden/api (на момент написания статьи версия bitwarden/api была 1.30.1), эти статьи уже не работают.

Установка Bitwarden Server

Первым делом нужно сделать проброс портов 80, 443 на Ваш сервер, если он находится за NAT. (Все-таки Вы работаете с паролями, тем более организации. Мне кажется, что не совсем безопасно сервер пускать в Мир. Но если Вы большой специалист в Linux Firewall, то я уверен, что Вы знаете что делаете).
Регистрируем домен (или поддомен) в своего регистратора имен, для удобного пользования с любых устройств. Тем более, что список потдержываемых устройств у Bitwarder впечатляющий https://bitwarden.com/#download
Загружаем и устанавливаем Bitwarden:
ОБЯЗАТЕЛЬНО! Все инструкции делаем с под Вашего пользователя, не с под root!!!

1
2
curl -Lso bitwarden.sh https://go.btwrdn.co/bw-sh && chmod +x bitwarden.sh
./bitwarden.sh install

Скрипт bitwarden.sh запросит домен для внешнего доступа — вводим свой.
После чего запросит создавать ли на Ваш домен ssl сертификат для доступу к сервису по https протоколу — нажимаем «y».
Для генерации ssl сертификата нужен email, вводим свой email.
Далее начнется установка контейнеров.
После небольшого времени, скрипт запросит Installation Id и Installation Key запросить их бесплатно можно на странице https://bitwarden.com/host/.
Нужно сохранить Installation Id и Installation Key, они еще понадобятся.
Ждем полной установки.
Если Вы хотите использовать только в личных целях (только для 1 человека), достаточно запустить команду ./bitwarden.sh start, и радоваться. Но если Вы хотите использовать сервер Bitwarden с семьей, и обмениваться паролями — команду ./bitwarden.sh start НЕ ЗАПУСКАЕМ, а продолжаем дальше.
Выполняем установку небольшого списка программ:
Для начала нужно установить Install .NET Core SDK on Linux. Как установить, можно посмотреть по этой ссылке https://dotnet.microsoft.com/download/linux-package-manager/rhel/sdk-current. Выберите в поле Linux Distribution нужный Вам дистрибутив ОС.
Пример для дистрибутива Ubuntu 18.04:

1
2
3
4
5
6
wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo add-apt-repository universe
sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install dotnet-sdk-2.2

После установки Dotnet, устанавливаем дополнительные программы:

1
sudo apt-get install nano mc vim vim-doc vim-scripts wget curl git

Копируем файлы (ниже описаны команды с расчетом, что сейчас Вы находитесь в рабочем каталоге своего пользователя):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
git clone https://github.com/online-stuff/BitBetter.git
cd BitBetter/src/licenseGen/
dotnet add package Newtonsoft.Json --version 12.0.1
cd ~/BitBetter/src/bitBetter
dotnet add package Newtonsoft.Json --version 12.0.1
cd ~/BitBetter/.keys
rm *
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.cert -days 36500 -outform DER -passout pass:test
 
########### отвечаем на вопросы (Параметры указываем свои. Важности нет!):
########### Country Name (2 letter code) [AU]:UA
########### State or Province Name (full name) [Some-State]:Poltava
########### Locality Name (eg, city) []:Poltava
########### Organization Name (eg, company) [Internet Widgits Pty Ltd]:blabla
########### Organizational Unit Name (eg, section) []:blabla
########### Common Name (e.g. server FQDN or YOUR name) []:blabla
########### Email Address []:blabla@blabla.ua
 
openssl x509 -inform DER -in cert.cert -out cert.pem 
openssl pkcs12 -export -out cert.pfx -inkey key.pem -in cert.pem -passin pass:test -passout pass:test 
cd ~/BitBetter 
./build.sh 
cd src/licenseGen/ 
./build.sh 
cd ~

Что мы сделали? Мы создали два контейнера под названиями BitBetter и licenseGen, которые будут храниться только на нашей хостовой машине.
Далее нам нужно внести изменения у файлы, которые создал официальный скрипт запуска Bitwarden, чтобы при запуске он не запускал официальный контейнер bitwarden/api, а запускал наш, модифицырован bitbetter/api.

nano ~/bwdata/docker/docker-compose.yml
ищем строки
api:
image: bitwarden/api:1.30.1
 
изменяем их на 
api:
image: bitbetter/api:latest
Сохраняем, и выходим: CTRL+O->ENTER

также изменяем:

1
2
3
4
nano ~/bwdata/env/global.override.env
Заполняем данные для отправки email
Также добавляем значение для параметра adminSettings__admins=. Нужно чтобы это был рабочий email, но который не будет использоваться как аккаунт. На него будут приходить временные ссылки для входа в админ панель. 
Сохраняем, и выходим: CTRL+O->ENTER

Также изменяем:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
nano ~/bwdata/scripts/run.sh
ищем строки
function restart() {
    dockerComposeDown
    dockerComposePull
    updateLetsEncrypt
    dockerComposeUp
    dockerPrune
    printEnvironment
}
 
заменяем их на
function restart() {
    dockerComposeDown
    #dockerComposePull
    updateLetsEncrypt
    dockerComposeUp
    dockerPrune
    printEnvironment
}
Сохраняем, и выходим: CTRL+O->ENTER

Запускаем Bitwarden, ждем полную установку:

1
./bitwarden.sh start

убедитесь, что все запустилось и работает. Выполните команду

1
docker ps

Также проверьте, что контейнер под именем bitwarden-api использует наш созданный bitbetter-api:latest
Если все работает, заходим на Web-интерфейс Bitwarden и создаем нового пользователя, подтверждаем email — ОБЯЗАТЕЛЬНО!
Для создания организации нам сначала нужно сделать премиальный аккаунт с которого будет создаваться организация. Для этого, нам нужно узнать User-GUID. Он находится в настройках пользователя в админ-панели.
Заходим на админ-панель Bitwarden: https://mydomain.com/admin, вводим email, который указали в параметре adminSettings__admins=. На этот Email придет временная ссылка для доступа.
В админ-панели заходим в настройки пользователя, и сохраняем себе ID.
Теперь у нас есть все данные для создания организации, а именно — User-GUID, и Installation Id
Возвращаемся в терминал, выполняем команды:

1
2
3
cd ~/BitBetter/src/licenseGen/
./build.sh
./run.sh ~/BitBetter/.keys/cert.pfx user "Name" "EMail" "User-GUID"

Расскажу по параметрах:
user — так и оставляем
«Name» — меняем на имя пользователя
«EMail» — меняем на email пользователя
«User-GUID» — вставляем ID пользователя в админке.
Вывод который даст нам предыдущая команда, нужно сохранить в *.json файл себе на рабочий стол.
Пример вывода:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
  "LicenseKey": "d7f6e************e2b59fef6645f",
  "Id": "819**************0-aa4400f3676b",
  "Name": "blabla@bla.com",
  "Email": "blabla@bla.com",
  "MaxStorageGb": 32767,
  "Premium": true,
  "Version": 1,
  "Issued": "2019-05-05T14:54:25.3782587Z",
  "Refresh": "2119-04-05T14:54:25.3783183Z",
  "Expires": "2119-05-05T14:54:25.3783868Z",
  "Trial": false,
  "Hash": "ir0/fBxH**************itwV3rDNXXcV0F3+o=",
  "Signature": "B9VCzm5sVmYbjDmPkaW9nr2nwkMxXE3qh2Uj//p7XaV0xmA67Xb1Fz94ATzjd8haAm/jcUxw7hTtCU0TIWYZCCXvrBa0KvqG/zl4lzZLzP/vaX5+6NT****************************GhvXMYJtQij6LGVJQWUtXYijVxgX17ax2MH6Vh3QOsZm4TlZUverERTL2b7c3/p+KtW016bh3ajCvmyLukSdQfleiJfhn0ArdWq4BZ1fzBCOxINOqdyCuUIvUUhzdTSX4Uy1Nukj0CbmP1Fd9NubnhWAxoYG5c39s6K0u+eHRAi3TgNfDz2SamGEfuuXdT22+1CYvJniSxM2gNgnVe3qza+1GqFObTghWXUOZIbtdrNTeUoF39TPmA7XScPPcDrPScue5THXzVQMB1UzEFMxywDBmHsZMABynKNgopq/zZFFinvJxcydCguXZwciWMOePoyXh39EHmmeJSs9wFRSyQxdLCP1Ixl5Vx+y3ATxR7DoEC8FPMpZCY4qsF//kQD+jj/Y6F1CzVI/U3U6QqrBD9MVChMOOq9nr/x76MWnbayosdvAnKKh/GoUlM8HyDhGH5FK/yMT2KbfTYz8Y423iJYoDTDhyMGTTZ3QMRmYCfEMCFdcPyk8Bgr/8aevMCCcaYo="
}

Заходим в WEB-интерфейс пользователя blabla@bla.com, и активируем аккаунт — Настройки → Перейти на Premium , загружаем сохраненный *.json файл. Поздравляю, Вы перешли на премиум аккаунт)
Создаем организацию:
В консоли выполняем команду:

1
./run.sh ~/BitBetter/.keys/cert.pfx org "Name" "EMail" "Install-ID used to install the server from bitwarden.com/host"

Расскажу по параметрах:
org — так и оставляем
«Name» — название организации
«EMail» — email организации
«Install-ID used to install the server from bitwarden.com/host» — Installation Id
Вывод который даст нам предыдущая команда, также нужно сохранить в *.json файл себе на рабочий стол.
Пример вывода:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
  "LicenseKey": "878c05f49a**********2138c7cb",
  "InstallationId": "8d***********************00a0c2f6",
  "Id": "f00b84******************087db4e",
  "Name": "Моя семья",
  "BillingEmail": "blabla@bla.com",
  "BusinessName": "BitBetter",
  "Enabled": true,
  "Plan": "Custom",
  "PlanType": 6,
  "Seats": 32767,
  "MaxCollections": 32767,
  "UseGroups": true,
  "UseEvents": true,
  "UseDirectory": true,
  "UseTotp": true,
  "Use2fa": true,
  "MaxStorageGb": 32767,
  "SelfHost": true,
  "UsersGetPremium": true,
  "Version": 4,
  "Issued": "2019-05-05T15:09:30.8181821Z",
  "Refresh": "2119-04-05T15:09:30.8182374Z",
  "Expires": "2119-05-05T15:09:30.8182981Z",
  "Trial": false,
  "UseApi": false,
  "Hash": "pl2kaH9kjD****************77smKMyTeqc=",
  "Signature": "NGTeZcbbr+V35KuBnjpMrI0VOJKsHvr9wnu9fHU*************************************PVij7O7QfEeqNP/hJj3dfqQnQl7f1gjk7AJGgfqO+lJBGaKS36NOesGKc9DmjfLmw+XavwyREyx3Uu7t7PBGLIAAMx3IqkZoCn4BIWjP7hDZcbH/Rof8Q6ap/jFXbE0LM4XkblzqtewE18O4DeedJjb+NxQGHLYU6g91HFpR5y2u3K7uYHZzQuMy29RBrfg0inpOJRssFlNJcejDhi4BasH70gfyKOIaIar+BE/PX7QSSDw/m7wZuu2NEtEOGiuCM161SNWwSKHh/+T+1cv/wbSNzgOeSbM8etmL42xuEPZMj/Hgp/FcSfXSGrjpNm+ZzcMalyh48yKprlCzFwvzPOfiD3KCkR6jLQMuc2iKBFm3poUtL7RA53pauRGSX+uO6aDIjs47COiFQcZNeXOPh3LZsd7ehMh0BmgVB5Q7dmM7J8w+K94tsKZX2LdWaMy2IaOQ0pAyZXwdB6GiqUHC8x+711R0XnQAFvWwc8ODfdODuTNAr50aetA9lKdn3nW2VKwtIROPYTfe2/1ShjHxeeqTKjvHJkcsQwdSMeTXzVvkIOXoEtDHHiAliN92Ihrjj43KTGPQnMixt1+c0SMtqQs="
}

Переходим в Настройки → Огранизации → Добавить организацию → Загружаем *.json файл для огранизации.
Теперь, нужно разослать всем пользователям приглашения, которых Вы хотите добавить в организацию. Причем переход на Premium уже не обязательно. Организация и так активирует всех пользователей.