快轉到主要內容

自架密碼管理器Bitwarden的伺服器「Vaultwarden」,備份現有帳號密碼

· 民國114年乙巳年
·
切換繁體/簡體
分類 Linux系統 Self-hosting自架
標籤 Bitwarden
目錄

Bitwarden是一款開源的密碼管理器,Ivon主要用它在瀏覽器和手機上自動填入密碼。並用它紀錄信用卡號碼、狗窩住址、還原金鑰、小祕密等等資訊。

Bitwarden免費版方案許久,資料都是存在官方伺服器,我想得準備一個備案,免得Bitwarden公司日後開始作惡。

Bitwarden是開源專案,從客戶端到伺服端都是可以自架的。我們並沒有說一定要用Bitwarden公司官方的伺服器,可以自己架一個。

Bitwarden客戶端我會繼續沿用,接下來要做的是自架一個相容Bitwarden的伺服器,將資料同步過去。

官方維護的伺服器在這裡:Bitwarden infrastructure,用C#寫成,可是部署指示寫的有點複雜,不知道為什麼都用Docker了還要用指令稿啟動~大概是為企業用戶準備的吧。此外,Bitwarden官方對伺服器的要求竟然需要2GB RAM!

我看了一些教學後,發現官方伺服器可以用「Vaultwarden」取代。用Rust寫成,減少原專案的複雜度。相容Bitwarden的API。

雖是非官方專案,不過Vaultwarden其中一個開發者有被Bitwarden公司僱用,允許在業餘時間貢獻專案。

考慮到我只是要簡單的同步密碼,我不追求複雜的Bitwarden企業版功能。這些內建的功能就夠用了~Vaultwarden我自己測試,實際跑起來吃不到512MB RAM。

1. 準備SSL憑證
#

為了有效保護密碼,給Vaultwarden伺服器上SSL是必須的。

Vaultwarden在瀏覽器有用到Web Crypto API,會需要HTTS連線,否則網頁會無法載入。

要是你將Vaultwarden架在公開的VPS,請務必設定安全機制,否則整本密碼簿洩漏可是會死人的(物理)。建議加上Nginx的反向代理。

如果使用內網穿透軟體的話,我用Tailscale Serve或者Cloudflare Tunnel達成HTTPS效果。最好準備一個域名,方便從外部存取。

2. 用Docker部署Vaultwarden
#

  1. 在Linux安裝Docker

  2. 參考官方文件,新增docker-compose

mkdir -p ~/vaultwarden/

cd ~/vaultwarden/

vim docker-compose.yml
  1. 填入以下內容。DOMAIN就填寫你的域名,我是使用子域名方便辨識Vaultwarden所在的網址。127.0.0.1是僅供http本機連線測試使用的。因為我有使用HTTPS,所以左邊的http將其去除,通訊埠可以設定成自己想要的樣子。
services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      DOMAIN: "https://vault.example.com"
    volumes:
      - ./vw-data/:/data/
    ports:
      - 8000:80
  1. 啟動服務
docker compose up -d

3. Nginx反向代理範例
#

  1. 編輯/etc/nginx/nginx.conf,加入這段:
http {

map $http_upgrade $connection_upgrade {
    default      upgrade;
    ''           close;
}
  1. Nginx設定檔/etc/nginx/sites-available/vaultwarden範本如下:
server {
    listen 80;
    server_name <子域名>;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name <子域名>;

    ssl_certificate /etc/letsencrypt/live/<子域名>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<子域名>/privkey.pem;

    add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-XSS-Protection "1; mode=block";

    client_max_body_size 128M; # 限制上傳檔案大小

    location / {
        proxy_pass http://127.0.0.1:8000; # Docker容器的通訊埠
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }

    location /notifications/hub {
        proxy_pass http://127.0.0.1:8082;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }

    location /notifications/hub/negotiate {
        proxy_pass http://127.0.0.1:8082;
    }
}
  1. 重新載入nginx設定檔
sudo ln -s /etc/nginx/sites-available/vaultwarden /etc/nginx/sites-enabled/

sudo nginx -t

sudo systemctl restart nginx

4. 初始化Vaultwarden
#

註解:你不需要註冊Bitwarden官方伺服器的帳號也可以用Vaultwarden。

跟使用Bitwarden官方服務一樣,用電子郵件在自己的伺服器上註冊一個帳號,再設定主密碼即可。

如果這個伺服器只有你一個人要用,記得在設定裡面關閉註冊新帳號的功能。

5. 匯入現有Bitwarden帳號的密碼
#

Bitwarden Web vault,點工具 → 匯出 → 匯出.json密碼

然後在Vaultwarden的工具 → 匯入,格式應當是完全相容的。

6. 瀏覽器擴充功能登入Vaultwarden
#

任一Bitwarden的客戶端都可以無縫切換到自架的Vaultwardern的伺服器。

以瀏覽器擴充功能為例,在登入面板,將網域切換到自架伺服器,輸入自己的域名,然後登入。

相關文章


此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。

(留言板載入中)這是Giscus留言板,需要Github帳號才能留言。支援Markdown語法,若要上傳圖片請善用外部圖床。您的留言會在Github Discussions向所有人公開。

Click here to edit your comments.

(留言板載入中)這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用外部圖床網站。