Во первых это просто интересно и полезно иметь свои собственные локальные ресурсы. Во вторых (хотя наверное это все таки во первых…) в наше неспокойное время порой лучше иметь такие вещи как пароли под своим полным контролем. Даже если у вас нет своего личного сервера но есть рабочий компьютер возможно есть смысл поднять менеджер паролей на данном компьютере в виртуальной среде.
Какие главные преимущества дает Bitwarden развернутый локально:
1. Безопасность, вы полностью контролируете свои пароли (но вы же должны заботиться о бекапах)
2. Возможность использовать платные функции которые не доступны на основном Bitwarden
3. Кросплатформеность
4. Динамическая синхронизация между устройствами (если сервер доступен только локально можно выполнять синхронизацию раз в день)
5. Возможность добавления в менеджер паролей ключи для 2FA, при этом эти ключи будут синхронизированы со всеми вашими устройствами.
Отдельно хочу отметить что даже если ваш сервер Bitwarden будет не доступен длительное время то вы сможете использовать менеджер паролей на вашем телефоне, синхронизация произойдет при следующем подключении к серверу.
Что нам понадобиться:
1. Линукс сервер или виртуальная машина на 512мб ОЗУ (этого даже с избытком).
2. Немного времени и умение читать инструкцию (иногда гуглить если что-то не понятно)
3. Домашний dns сервер типа adguard home или pi-hole (не обязательно)
Так же настоятельно рекомендую выполнять данную настройку через portainer так как это может избавить от некоторых проблем с запуском nginx. Все настройки приведены для установки без использования portainer но разница заключается только в том как вы будете создавать файлы docker-compose, все остальные файлы и директории создаем по инструкции.
Подготовка сервера
Выполним первоначальную настройку сервера для установки. Все дальнейшая установка будет выполняться с использованием docker-compose.
Для доступа в панель администратора Vaultwarden (Bitwarden) генерируются уникальный ключ, который в открытом виде храниться в файлах настроек сервера менеджера паролей. Данный ключ не дает доступа к данным конечных пользователей, но он позволяет нанести значительный вред системе вплоть до полной поломки. Разработчики Vaultwarden (Bitwarden) рекомендуют использовать программу argon2 установим ее.
apt install argon2
Установка и настройка менеджера паролей Bitwarden
Менеджер паролей Bitwarden не является opensource проектом, но у данного проекта существует полностью совместимая opensource копия серверной части под названием vaultwarden. Более подробно можете изучить в официальном репозитории проекта. Именно процесс развертки серверной части vaultwarden рассмотрим далее.
Установка будет выполняться в виде docker-compose проекта. Для этого необходимо подготовить дополнительные файлы.
Создаем основную рабочую папку где будут располагаться файлы, в том числе зашифрованные базы данных. Для бекапа данных достаточно скопировать файлы данной директории и поместить в новый проект.
mkdir /vaultwarden
cd /vaultwarden
При первоначальной установке с базовыми настройками vaultwarden генерирую пароль для панели администратора в виде большого ключа символов который храниться в открытом виде в файле конфигурации сервера. Для обеспечения безопасности сервера необходимо устанавливать сервер с заранее созданным паролем администратора. Более подробно можно почитать в официальной справке
Создадим зашифрованный пароль с использованием argon2
Копируем полученный результат в файл параметров запуска vaultwarden
nano .env
Вставляем полученный ключ в файл с указанием параметра, не каких изменений в строку вносить не надо. Обязательно используйте свой пароль и свой результат шифрования для обеспечения безопасности!!!!
В папке /vaultwarden будут размещены основные файлы сервера vaultwarden в том числе зашифрованные базы данных паролей.
Папка /letsencrypt используется как общая папка для хранения ssl сертификатов, данный параметр не обязательный если не планируете использовать vaultwarden без прокси сервера.
Запускаем сборку и установку контейнера
docker-compose up -d
Выходим в корневой каталог
cd
Фактически на данном этапе установка менеджера паролей закончена и интерфейс доступен по адресу
Справка vaultwarden дает несколько решений по исправлению данной проблемы но по факту все они сводятся к получению полноценного https соединения с сервером.
У нас есть несколько способов решения данной проблемы:
1. Настройка полноценного проброса сервера во внешний интернет (с использованием доменного имени или средств на подобии keendns)
2. Создание https соединения до сервера в локальной сети.
3. Выпуск само подписанных сертификатов с добавлением в список доверенных (способ не рекомендуется, полноценная работа не проверялась).
Установка прокси сервера nginx
Для решения задачи настройки https и банального удобства воспользуемся прокси сервером nginx. Прокси сервер позволяет избежать необходимости указывать порт на котором находится конкретный сервис при обращении к нему.
Создадим основной рабочий каталог nginx.
mkdir /nginx
Перейдем в каталог и создадим файл docker-compose
cd /nginx
nano docker-compose.yaml
Вставляем в файл следующий код:
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
ports:
# These ports are in format <host-port>:<container-port>
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web Port
environment:
# Mysql/Maria connection parameters:
DB_MYSQL_HOST: "db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "nginx-pm"
DB_MYSQL_PASSWORD: "nginx-pm"
DB_MYSQL_NAME: "npm"
# Uncomment this if IPv6 is not enabled on your host
# DISABLE_IPV6: 'true'
volumes:
- /nginx:/data
- /letsencrypt:/etc/letsencrypt
depends_on:
- db
db:
image: 'jc21/mariadb-aria:latest'
environment:
MYSQL_ROOT_PASSWORD: 'npm-root-pm'
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'nginx-pm'
MYSQL_PASSWORD: 'nginx-pm'
volumes:
- /nginx/mysql:/var/lib/mysql
Обязательно изменяем параметры авторизации
DB_MYSQL_USER
DB_MYSQL_PASSWORD
MYSQL_ROOT_PASSWORD
Значения одинаковых переменных в блоке app и db должны совпадать.
Сохраняем файл и запускаем контейнер.
docker-compose up -d
Nginx обязательно должен занимать 80 и 443 порты, он будет выполнять роль регулировщика который будет направлять по заданному адресу на конкретный порт нашего сервера. Проверяем работу наших контейнеров
Ps: Иногда при первом запуске можно словить ошибку 502 Bad Gatewey при указании логина и пароля, в таком случае советую воспользоваться справкой по nginx или попробовать переустановить контейнер, на сколько я понял эта проблема самого веб интерфейса настройки nginx.
После первого входа меняем логин и пароль пользователя. На этом работа с самим сервером закончена, все дальнейшие настройки выполняем через веб интерфейс.
Настройка HTTPS доступа к локальным серверам без внешнего доступа.
Для настройки https необходимо получить доменное имя второго уровня или старше. Можно купить свой домен на любом из сервисов который предоставляет услугу регистрации (домены в зоне ru стоят в среднем 300-400 рублей в год).
Для настройки локального HTTPS необходимо обратить внимание на следующее. Если у вас нет белого ip адреса или динамического ip, то есть по если вы открываете 80 порт на вашем роутере и пробуете зайти по ip адресу который получил роутер в интернет то вам необходимо использовать вариант альтернативный вариант получения сертификата. Стандартный сценарий подразумевает доступ к вашему сайту на 80 порту из интернета.
Какие варианты получения сертификата у нас есть если мы не хотим или не можем открыть внешний доступ. Можно купить сертификат у нашего днс провайдера или воспользоваться получением сертификатов через службу DNS Challeng из платных хостеров в ру сегменте услугу точно предоставляет reg.ru (более подробно можно посмотреть в настройках nginx далее).
Но что если желания тратить деньги нет вообще? Не беда есть бесплатные альтернативы. Существуют бесплатный dns провайдер duckdns который позволяет зарегистрировать до пяти бесплатных доменов третьего уровня на одну четную запись.
Для дальнейших настроек нам надо получить token с основной страницы
Создаем новый домен
Именно адрес test-domen222.duckdns.org и будет тем адресом по которому мы разместим наш ресурс под https.
Возвращаемся в nginx
Переходим в раздел Proxy Hosts и создаем новую запись
Переходим на закладку SSL и выбираем режим получения сертификата по DNS, выбираем провайдера DuckDNS и указываем токен с главной страницы DuckDNS. Токен указываем без скобок и кавычек прямо как он указан на сайте.
Указываем электронную почту (не обязательно живую проверки нет) куда будет приходить информация о вашем сертификате и соглашаемся с условиями.
После того как окно будет закрыто (может висеть достаточно долго) мы получим готовый сертификат для указанного нами адреса dns.
Все полученные нами сертификаты расположены в папке /letsencrypt/live/ дальнейшем сам nginx будет поддерживать сертификаты в данной папке в актуальном состоянии, что можно использовать для других сервисов.
На странице DuckDNS поле ip у созданного домена заполниться вашим текущим Ip, если у вас не белый ip адрес можете его оставить без изменений или указать любой хоть 0.0.0.0 для нашей задачи мы не будем использовать мировой DNS.
Мы почти закончили осталось только объяснить нашим устройствам что если мы указываем адрес test-domen222.duckdns.org нам надо идти не в общий интернет а на наш реверс прокси nginx.
Для этого воспользуемся перезаписью dns запросов. Если вы используете adguard home или pi hole в локальной сети (очень рекомендую) то делается это проще простого.
Находим раздел перезапись dns
И добавляем правило по которому обращение к созданному нами адресу ведет на наш nginx.
Все после сохранения настройка закончена, для корректного обращения к адресу возможно необходимо сбросить кеш устройства или воспользоваться режимом инкогнито у браузера.
Если же в вашей сети нет локального dns можно воспользоваться встроенным переопределением dns windows.
На этом все наши настройки закончены, можно использовать локальный https для доступа к локальным ресурсам без проброса во внешний мир.
Отключение панели администратора после настройки
Для отключения панели администратора по адресу test-domen222.duckdns.org/admin надо в файле параметров vaultwarden расположенного по пути /vaultwarden/config.json закомментировать строку содержащую admin_token и перезапустить контейнер.
А так же из docker-compose файла убрать строку описание токена:
- ADMIN_TOKEN=${VAULTWARDEN_ADMIN_TOKEN}
После этого при попытке зайти на админ панель будем получать предупреждение
Для включения выполняем обратные действия, раскомментируем токен и перезапустим контейнер.
Настройка клиентов Bitwarden
Для использования можем установить расширение основного Bitwarden и изменить в нем сервер который хотим использовать.
Аналогичные настройки по указанию собственного хостинга есть в мобильном и десктоп (не рекомендую) клиенте.
Вы можете написать сейчас и зарегистрироваться позже.
Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.
Вступление или зачем нам вообще это надо?
Во первых это просто интересно и полезно иметь свои собственные локальные ресурсы. Во вторых (хотя наверное это все таки во первых…) в наше неспокойное время порой лучше иметь такие вещи как пароли под своим полным контролем. Даже если у вас нет своего личного сервера но есть рабочий компьютер возможно есть смысл поднять менеджер паролей на данном компьютере в виртуальной среде.
Какие главные преимущества дает Bitwarden развернутый локально:
1. Безопасность, вы полностью контролируете свои пароли (но вы же должны заботиться о бекапах)
2. Возможность использовать платные функции которые не доступны на основном Bitwarden
3. Кросплатформеность
4. Динамическая синхронизация между устройствами (если сервер доступен только локально можно выполнять синхронизацию раз в день)
5. Возможность добавления в менеджер паролей ключи для 2FA, при этом эти ключи будут синхронизированы со всеми вашими устройствами.
Отдельно хочу отметить что даже если ваш сервер Bitwarden будет не доступен длительное время то вы сможете использовать менеджер паролей на вашем телефоне, синхронизация произойдет при следующем подключении к серверу.
Что нам понадобиться:
1. Линукс сервер или виртуальная машина на 512мб ОЗУ (этого даже с избытком).
2. Немного времени и умение читать инструкцию (иногда гуглить если что-то не понятно)
3. Домашний dns сервер типа adguard home или pi-hole (не обязательно)
Так же настоятельно рекомендую выполнять данную настройку через portainer так как это может избавить от некоторых проблем с запуском nginx. Все настройки приведены для установки без использования portainer но разница заключается только в том как вы будете создавать файлы docker-compose, все остальные файлы и директории создаем по инструкции.
Подготовка сервера
Выполним первоначальную настройку сервера для установки. Все дальнейшая установка будет выполняться с использованием docker-compose.
Обновляем репозитории и пакеты:
Устанавливаем Docker:
apt install curl && curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.shЗапускаем и включаем службу Docker
systemctl start docker && systemctl enable dockerУстанавливаем Docker Compose:
curl -L --fail https://raw.githubusercontent.com/linuxserver/docker-docker-compose/master/run.sh -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-composeДля доступа в панель администратора Vaultwarden (Bitwarden) генерируются уникальный ключ, который в открытом виде храниться в файлах настроек сервера менеджера паролей. Данный ключ не дает доступа к данным конечных пользователей, но он позволяет нанести значительный вред системе вплоть до полной поломки. Разработчики Vaultwarden (Bitwarden) рекомендуют использовать программу argon2 установим ее.
apt install argon2Установка и настройка менеджера паролей Bitwarden
Менеджер паролей Bitwarden не является opensource проектом, но у данного проекта существует полностью совместимая opensource копия серверной части под названием vaultwarden. Более подробно можете изучить в официальном репозитории проекта. Именно процесс развертки серверной части vaultwarden рассмотрим далее.
Установка будет выполняться в виде docker-compose проекта. Для этого необходимо подготовить дополнительные файлы.
Создаем основную рабочую папку где будут располагаться файлы, в том числе зашифрованные базы данных. Для бекапа данных достаточно скопировать файлы данной директории и поместить в новый проект.
mkdir /vaultwarden cd /vaultwardenПри первоначальной установке с базовыми настройками vaultwarden генерирую пароль для панели администратора в виде большого ключа символов который храниться в открытом виде в файле конфигурации сервера. Для обеспечения безопасности сервера необходимо устанавливать сервер с заранее созданным паролем администратора. Более подробно можно почитать в официальной справке
Создадим зашифрованный пароль с использованием argon2
echo -n "MySecretPassword" | argon2 "$(openssl rand -base64 32)" -e -id -k 19456 -t 2 -p 1Результат вывода будет шифрованное представление пароля вида:
Копируем полученный результат в файл параметров запуска vaultwarden
nano .envВставляем полученный ключ в файл с указанием параметра, не каких изменений в строку вносить не надо.
Обязательно используйте свой пароль и свой результат шифрования для обеспечения безопасности!!!!VAULTWARDEN_ADMIN_TOKEN=$argon2id$v=19$m=19456,t=2,p=1$YnV6N0lrZHZoOWpGdS9rcmdIWHR5RW1zQjJtVU4xdHhHNis2STVQN25uTT0$wEoFtCRQBcbayI6z+tVFZwV1mT2pXOLicEJdXq4st2wСохраняем файл и создаем файл docker-compose
nano docker-compose.yamlВставляем в файл следующий код:
version: "2.1" services: vaultwarden: image: vaultwarden/server:latest container_name: vaultwarden network_mode: bridge environment: - PUID=1000 - PGID=1000 - TZ=Europe/Moscow - ADMIN_TOKEN=${VAULTWARDEN_ADMIN_TOKEN} volumes: - /vaultwarden:/data - /letsencrypt:/letsencrypt ports: - 7277:80 - 3012:3012 restart: unless-stoppedВ папке /vaultwarden будут размещены основные файлы сервера vaultwarden в том числе зашифрованные базы данных паролей.
Папка /letsencrypt используется как общая папка для хранения ssl сертификатов, данный параметр не обязательный если не планируете использовать vaultwarden без прокси сервера.
Запускаем сборку и установку контейнера
docker-compose up -dВыходим в корневой каталог
cdФактически на данном этапе установка менеджера паролей закончена и интерфейс доступен по адресу
http://IP_SERVER:7277/#/login
Для доступа в админ панель
http://IP_SERVER:7277/admin
На данном этапе доступна настройка серверной части через админ панель, но для домашнего использования можно использовать стандартные параметры.
Проверяем доступ к административным настройкам сервера перейдя по адресу
http://IP_SERVER:7277/admin
Для входа используем пароль который указывали в команде шифрования пароля: MySecretPassword
Для использования как менеджер паролей необходимо создать пользователя на странице http://IP_SERVER:7277/#/login
Создаем нового пользователя
И видим такое сообщение
Справка vaultwarden дает несколько решений по исправлению данной проблемы но по факту все они сводятся к получению полноценного https соединения с сервером.
У нас есть несколько способов решения данной проблемы:
1. Настройка полноценного проброса сервера во внешний интернет (с использованием доменного имени или средств на подобии keendns)
2. Создание https соединения до сервера в локальной сети.
3. Выпуск само подписанных сертификатов с добавлением в список доверенных (способ не рекомендуется, полноценная работа не проверялась).
Установка прокси сервера nginx
Для решения задачи настройки https и банального удобства воспользуемся прокси сервером nginx. Прокси сервер позволяет избежать необходимости указывать порт на котором находится конкретный сервис при обращении к нему.
Создадим основной рабочий каталог nginx.
mkdir /nginxПерейдем в каталог и создадим файл docker-compose
cd /nginx nano docker-compose.yamlВставляем в файл следующий код:
Обязательно изменяем параметры авторизации
DB_MYSQL_USER
DB_MYSQL_PASSWORD
MYSQL_ROOT_PASSWORD
Значения одинаковых переменных в блоке app и db должны совпадать.
Сохраняем файл и запускаем контейнер.
docker-compose up -dNginx обязательно должен занимать 80 и 443 порты, он будет выполнять роль регулировщика который будет направлять по заданному адресу на конкретный порт нашего сервера. Проверяем работу наших контейнеров
docker psМы видим что запущено три контейнера.
Переходим по адресу http://IP_SERVER:81 в панель администратора nginx.
Данные для авторизации по умолчанию:
Email: admin@example.com
Password: changeme
Ps: Иногда при первом запуске можно словить ошибку 502 Bad Gatewey при указании логина и пароля, в таком случае советую воспользоваться справкой по nginx или попробовать переустановить контейнер, на сколько я понял эта проблема самого веб интерфейса настройки nginx.
После первого входа меняем логин и пароль пользователя. На этом работа с самим сервером закончена, все дальнейшие настройки выполняем через веб интерфейс.
Настройка HTTPS доступа к локальным серверам без внешнего доступа.
Для настройки https необходимо получить доменное имя второго уровня или старше. Можно купить свой домен на любом из сервисов который предоставляет услугу регистрации (домены в зоне ru стоят в среднем 300-400 рублей в год).
Для настройки локального HTTPS необходимо обратить внимание на следующее. Если у вас нет белого ip адреса или динамического ip, то есть по если вы открываете 80 порт на вашем роутере и пробуете зайти по ip адресу который получил роутер в интернет то вам необходимо использовать вариант альтернативный вариант получения сертификата. Стандартный сценарий подразумевает доступ к вашему сайту на 80 порту из интернета.
Какие варианты получения сертификата у нас есть если мы не хотим или не можем открыть внешний доступ. Можно купить сертификат у нашего днс провайдера или воспользоваться получением сертификатов через службу DNS Challeng из платных хостеров в ру сегменте услугу точно предоставляет reg.ru (более подробно можно посмотреть в настройках nginx далее).
Но что если желания тратить деньги нет вообще? Не беда есть бесплатные альтернативы. Существуют бесплатный dns провайдер duckdns который позволяет зарегистрировать до пяти бесплатных доменов третьего уровня на одну четную запись.
Заходим на https://www.duckdns.org/ и проходим простую регистрацию.
Для дальнейших настроек нам надо получить token с основной страницы
Создаем новый домен
Именно адрес test-domen222.duckdns.org и будет тем адресом по которому мы разместим наш ресурс под https.
Возвращаемся в nginx
Переходим в раздел Proxy Hosts и создаем новую запись
Переходим на закладку SSL и выбираем режим получения сертификата по DNS, выбираем провайдера DuckDNS и указываем токен с главной страницы DuckDNS. Токен указываем без скобок и кавычек прямо как он указан на сайте.
Указываем электронную почту (не обязательно живую проверки нет) куда будет приходить информация о вашем сертификате и соглашаемся с условиями.
После того как окно будет закрыто (может висеть достаточно долго) мы получим готовый сертификат для указанного нами адреса dns.
Все полученные нами сертификаты расположены в папке /letsencrypt/live/ дальнейшем сам nginx будет поддерживать сертификаты в данной папке в актуальном состоянии, что можно использовать для других сервисов.
На странице DuckDNS поле ip у созданного домена заполниться вашим текущим Ip, если у вас не белый ip адрес можете его оставить без изменений или указать любой хоть 0.0.0.0 для нашей задачи мы не будем использовать мировой DNS.
Мы почти закончили осталось только объяснить нашим устройствам что если мы указываем адрес test-domen222.duckdns.org нам надо идти не в общий интернет а на наш реверс прокси nginx.
Для этого воспользуемся перезаписью dns запросов. Если вы используете adguard home или pi hole в локальной сети (очень рекомендую) то делается это проще простого.
Находим раздел перезапись dns
И добавляем правило по которому обращение к созданному нами адресу ведет на наш nginx.
Все после сохранения настройка закончена, для корректного обращения к адресу возможно необходимо сбросить кеш устройства или воспользоваться режимом инкогнито у браузера.
Если же в вашей сети нет локального dns можно воспользоваться встроенным переопределением dns windows.
Подробнее можете ознакомиться тут
На этом все наши настройки закончены, можно использовать локальный https для доступа к локальным ресурсам без проброса во внешний мир.
Отключение панели администратора после настройки
Для отключения панели администратора по адресу test-domen222.duckdns.org/admin надо в файле параметров vaultwarden расположенного по пути /vaultwarden/config.json закомментировать строку содержащую admin_token и перезапустить контейнер.
А так же из docker-compose файла убрать строку описание токена:
- ADMIN_TOKEN=${VAULTWARDEN_ADMIN_TOKEN}После этого при попытке зайти на админ панель будем получать предупреждение
Для включения выполняем обратные действия, раскомментируем токен и перезапустим контейнер.
Настройка клиентов Bitwarden
Для использования можем установить расширение основного Bitwarden и изменить в нем сервер который хотим использовать.
Аналогичные настройки по указанию собственного хостинга есть в мобильном и десктоп (не рекомендую) клиенте.