軟體架構案例分析 - Bitwarden 建立本地開發環境 軟體架構案例分析 - Bitwarden 建立本地開發環境

Published on Thursday, May 11, 2023

Bitwarden 建立本地開發環境

Bitwarden 作為一套知名的密碼管理系統想當然關於安全性方面的設計肯定需要比一般的系統更加謹慎。 密碼管理系統一旦有漏洞數以萬計的密碼就會外流到網路上,並且如果使用者安全習慣並不好所有網站都使用 同一個密碼或者密碼過於簡單就會造成災耐。

這個系列將會對 Bitwarden 開源程式碼進行分析,並且學習它背後的設計了解它為何能夠比大多數的網站還要安全

首先我們到 Bitwarden Github 查看目前 Bitwarden 所開源的專案, 目前重要的專案有三個,分別為:

  • server :後端專案使用 .NET Core 進行開發,重要的邏輯都在此專案
  • clients :前端專案使用 Angular 進行開發,搭配 Electron 可同時作為桌面應用程式
  • mobile :App 專案使用 Xamarin 進行開發

今天的目標是先將專案下載下來並且將開發環境建立起來,先將 server 專案下載到本機

git clone https://github.com/bitwarden/server.git

接下來從範例複製一個 .env 環境檔與 secrets 檔之後在 Docker 會使用到,記得把資料庫的密碼換成更強的密碼本文資料庫預計要使用 Postgres

cd dev
cp .env.example .env
cp secrets.json.example secrets.json

POSTGRES_PASSWORD=修改強密碼

輸入此命令 Docker Compose 會建立起一個 postgres 服務與 mail服務

docker compose --profile postgres --profile mail up -d

使用以下腳本產生憑證,我們需要將 Thumbprint 記錄下來之後會用到

.\create_certificates_windows.ps1

Thumbprint                                Subject
----------                                -------
0BE8A0072214AB37C6928968752F698EEC3A68B5  CN=Bitwarden Identity Server Dev
C3A6CECAD3DB580F91A52FC9C767FE780300D8AB  CN=Bitwarden Data Protection Dev

打開 secrets.json 檔案並修改內部內容

  • 修改 postgreSqlconnectionString
  • 修改 identityServer 輸入剛剛紀錄的 Thumbprint
  • 修改 dataProtection 輸入剛剛紀錄的 Thumbprint
  • 修改 installationidkey,開啟 連結 申請
  • 修改 licenseDirectory 設定至一個空目錄,之後上傳的憑證會保存到此資料夾

這邊需要注意如果要使用 SqlServer 以外的資料庫還需要額外的設定,需要在 secrets.jsonglobalSettings 新增 DatabaseProvider

"globalSettings": {
	"DatabaseProvider": "postgresql",

都修改完成後運行以下腳本之後會透過 dotnet user-secrets 的功能將 secrets.json 複製到此路徑下 %APPDATA%\microsoft\UserSecrets 之後會根據專案的 UserSecretsId 設定去讀取相對應的 secrets.json

.\setup_secrets.ps1
Successfully saved 12 secrets to the secret store. - Notifications
Successfully saved 12 secrets to the secret store. - Api
Successfully saved 12 secrets to the secret store. - Billing
Successfully saved 12 secrets to the secret store. - Sso
Successfully saved 12 secrets to the secret store. - Icons
Successfully saved 12 secrets to the secret store. - Scim
Successfully saved 12 secrets to the secret store. - Events
Successfully saved 12 secrets to the secret store. - Identity
Successfully saved 12 secrets to the secret store. - EventsProcessor
Successfully saved 12 secrets to the secret store. - Admin

這邊運行中會輸出 Successfully saved 訊息,以 Identity 專案為例執行專案後會去 %APPDATA%\microsoft\UserSecrets\bitwarden-Identity\secrets.json 載入 json 檔案, 並不是像平常的專案都把資訊寫在 appsettings.json

最後運行 migrate.ps1 腳本設定資料庫參數,會使用遷移腳本將資料更新到資料庫

.\migrate.ps1 -postgres

這邊因為每個資料庫遷移腳本都會有些微的差異因此 bitwarden 為每個資料庫類型都建立一個遷移專案並放至於 util 底下, 當我們執行 migrate.ps1 腳本時內部會到對應的資料庫底下執行 dotnet ef database update

  • MySql: MySqlMigrations
  • Postgres: PostgresMigrations
  • MsSql: MsSqlMigratorUtility
  • Sqlite: SqliteMigrations

準備好開發環境後就能準備運行專案了,但運行之前需要先編譯所有專案我們可以到根目錄底下輸入以下命令,會自動編譯所有專案並執行 npm

./scripts/build

完成之後我這邊使用 Rider 開啟方案育設有提供 Full Server 設定檔可以批量將所有服務執行起來

  1. Admin: http://localhost:62911
  2. Api: http://localhost:4000
  3. Billing: http://localhost:44519
  4. Events: http://localhost:46273
  5. EventsProcessor: http://localhost:54103
  6. Icons: http://localhost:50024
  7. Identity: http://localhost:33656
  8. Notifications: http://localhost:61840
  9. Sso: http://localhost:52823

首先我們開啟本機的 Bitwarden Client 來連線到我們的開發環境,點擊右上角新增帳戶後點擊左上角設定並輸入對應服務的網址 Bitwarden-Change-Server

連線完成後點擊下方建立帳戶在我們本地的服務建立新會員 Bitwarden-Create-Account

建立完成後使用我們剛剛建立的使用者進行登入就能成功進入到金庫畫面,並且可以成功建立資料 Bitwarden-Index-Page

接著開啟 admin 後台網址 http://localhost:62911/admin 此後台可以用來管理會員,此服務比較特別並沒有密碼輸入的欄位, 目前需要使用 email 取得登入網址才能登入到後台,管理員的 email 預設已經設定在 secrets.json 的 adminSettings 了, 預設的值為 admin@localhost 只要在登入頁面輸入 admin@localhost 即可發送登入 email Bitwarden-Admin-Login-Page

接著我們開啟一開始架設的 MailCatcher 服務,這個服務會去攔截 email 並自帶有界面只需要開啟 http://localhost:1080/ 就可以看到剛剛的 email 點擊登入後會自動登入並且轉跳回 admin 首頁 MailCatcher

最後可以到 User 頁面看到我們剛剛建立的新會員 Bitwarden-Admin-User-Page


Summary

今天成功將 Bitwarden 的基礎開發環境都建立起來可以供我們之後測試使用,目前來看 Bitwarden 都有照服務來切分專案,之後會來學習各專案的是怎麼互相溝通的 和了解整個專案的架構