上網登入各個網站使用各類服務,已經是我們的日常行程之一,但註冊的帳號密碼一多,如何安全的保管它們就很重要了。有的人會用紙筆記,或者用密碼管理App,如Bitwarden、1Password等等。但是這些方法並非都是萬無一失,都有各自的缺點。例如:紙筆記錄需要塗塗改改,時間久了會搞混;密碼管理App的資料都是存放在業者的伺服器,萬一哪天它們被入侵還是怎樣,那資料不就全都GG了?(案例)
我自己的帳號密碼也不算少,起初也是想說找個免費好用的密碼管理App存進去就好了,但是看到前面提到的那個案例,便對那些密碼管理App的安全性打了個大大的問號。那麼問題來了:是否有辦法既能透過密碼管理App存取密碼,又能保證存放的密碼資料萬無一失?
最初我是找到Bitwarden這個網站,它除了能直接在他們的伺服器上註冊帳號來存放密碼外,也可以「自建」,就是在自己的主機、NAS、VPS等架設自己的Bitwarden伺服器,資料全都存放在其中。由於我自己已經有架設網站,因此可以直接利用現有的環境來架設Bitwarden伺服器,實現「自己的密碼自己存」,完全不假他人之手。
行前準備
在開始架設自己的Bitwarden伺服器前,需要準備以下這些:
- 一台能跑Docker的電腦/NAS/VPS(系統以Linux為佳)
- 一個網域(沒有又不想花錢買的話可以用No-IP免費註冊一個)
註:Bitwarden伺服器的Docker映像有兩個版本:官方版與第三方版(Vaultwarden)。官方版與後面搭配的用戶端App與瀏覽器套件相容性較好,但對硬體需求較高;後者則是對硬體要求較低,且可使用所有功能,惟在瀏覽器套件與用戶端App的相容性做得不夠好。這裡我使用的是第三方版。
開始架設
這裡示範的環境與條件如下:
- 使用的是執行Debian 12的實體主機/VPS,且已安裝好Docker
- 已經註冊好一個網域(付費購買的網域或從No-IP註冊的DDNS網址),且已設定好HTTPS連線
- 主機的80連接埠已被使用
- 登入你的主機,然後選個地方作為Bitwarden伺服器的資料存放目錄。這裡我使用/opt/vaultwarden。
- 進入1.的目錄,建立一個文字檔,命名為vaultwarden.env,然後填入以下內容:
TZ=Asia/Taipei
LOG_FILE=data/vaultwarden.log
ROCKET_PORT=80
DOMAIN=https://(換成你要使用的網域)
ADMIN_TOKEN=(隨機亂數)SMTP_HOST=郵件伺服器*
SMTP_FROM=寄件者email
SMTP_PORT=SMTP伺服器連接埠號*
SMTP_SECURITY=連線加密方式*
SMTP_USERNAME=使用者名稱
SMTP_PASSWORD=登入密碼- TZ:設定時區
- LOG_FILE:Vaultwarden的紀錄檔
- ROCKET_PORT:Vaultwarden使用的連接埠號
- DOMAIN:Vaultwarden對外連線使用的網域
- ADMIN_TOKEN:Vaultwarden管理後台(與密碼管理介面不一樣!)的密鑰,可使用openssl指令產生;留空會將其停用
- SMTP開頭變數:設定Vaultwarden的寄件參數,如伺服器、登入資訊、寄件者email等等
看你要用哪個郵件服務就填與之對應的參數即可
- 執行以下指令來執行Vaultwarden(映像會自動下載)
docker run -d --name vaultwarden -v /opt/vaultwarden:/data -p 80:80 --restart=always --env-file /opt/vaultwarden/vaultwarden.env vaultwarden/server:latest-alpine
照慣例說明以上指令的參數:-d
:執行後保持在背景運作--name vaultwarden
:命名這個容器,名字可以隨意填,只要你知道這個容器是什麼作用就好-v /opt/vaultwarden:/data
:將主機的/opt/vaultwarden目錄掛載到容器的/data目錄,這是密碼資料的存放位置-p 8080:80
:第一個80是主機要開放的連接埠號;第二個必須與前面env檔中的ROCKET_PORT的值一致--restart always
:指定容器重新啟動的條件,本例設定一律自動重啟--env-file
:2.的檔案位置,本例為1.的目錄下的vaultwarden.envvaultwarden/server:latest-alpine
:指定使用的映像,本例的映像為官方最新穩定版,但使用Alpine Linux為基礎系統(體積較小)
- 最後就是設定反向代理,這裡我使用Nginx。
- 在nginx設定目錄下的sites-available中新增一個文字檔,本例命名為vaultwarden.conf
- 打開這個連結,展開Nginx項目並將其中所有內容貼進去
要修改的部分(行末要附上’;’): - server_name:換成你的網域
- upstream vaultwarden-default中的server:最後的連接埠號換成在3.中的-p參數的第一個連接埠號(8080)
- 執行
ln -s /etc/nginx/sites-available/vaultwarden.conf /etc/nginx/sites-enabled/vaultwarden.conf
,啟用設定檔 - 執行
sudo nginx -t
檢查設定檔;沒問題的話就執行sudo nginx -s reload
上面步驟都有做正確的話,打開網址後應該會看到這個畫面:

最後就可以註冊一個帳號並登入,然後把帳號密碼一一加進去(或者從瀏覽器匯出然後匯入也可以)
與Bitwarden用戶端和瀏覽器外掛搭配使用
重點在於登入時,「正登入到」那裏要選”自我裝載”(另外兩個是bitwarden.com與bitwarden.eu,代表Bitwarden的美國與歐盟伺服器),然後填入網址,然後填入註冊的email與密碼,並完成兩步驟驗證(沒有設定或先前登入時有選擇”記住我”的話會直接進入)即可。

之後有需要登入時,它就會自動從資料庫調出帳號密碼,並且自動填到對應欄位;另外也可以自動產生兩步驟驗證的驗證碼(需要先把相關參數填進去)並貼上,省下開手機的時間。
已知問題
- 設定使用WebAuthn之後,對應的項目會變成無法編輯或刪除(網頁端與手機端不受影響);不確定最新版本是否已解決這個bug(發文時官方有出新版)
- 無法使用SSO登入;如不是多人使用則無大礙
有備無患:如何備份Vaultwarden的資料
不怕一萬,只怕萬一;Vaultwarden的資料也需要做好備份(重要=備份,不備份=不重要)。那要怎麼備份?
很簡單,要備份的東西就是這些而已(可在與容器的/data目錄對應的主機目錄中找到):

就把這些檔案複製一份到安全的地方存放就可以了(若不放心可以考慮多存幾份,有備無患)。
還原的話就把先前備份的檔案複製回原處,就可以了,非常簡單。
下篇預告:免Docker架設Vaultwarden的方法(我目前使用的方法)