為什麼將 SSH 金鑰儲存在密碼管理器中
SSH 金鑰是對遠端伺服器、Git 供應商和內部基礎架構進行身份驗證的黃金標準。然而,大多數開發人員將它們儲存為普通檔案在 ~/.ssh/ 下 - 不受保護、未同步且未經審核。將 SSH 金鑰移至 Vaultwarden(或 Bitwarden)解決了三個基本問題:
- 集中管理:所有金鑰都位於一個保管庫中,而不是分散在各個電腦上。
- 跨裝置同步:新增一次金鑰;它會自動出現在每個裝置上。
- 審計追蹤:伺服器會記錄每個按鍵存取和用戶端操作。
Bitwarden SSH 代理程式彌合了鎖定的保管庫和透明地使用 SSH 金鑰的日常需求之間的差距。
Bitwarden SSH 代理程式概述
Bitwarden SSH 代理程式是一個輕量級守護程序,它透過標準 SSH_AUTH_SOCK 介面公開儲存在保管庫中的 SSH 金鑰。當 ssh 或 git 需要金鑰時,它會與代理程式通信,代理請求 Bitwarden CLI (bw) 從保管庫中取得對應的私鑰。金鑰材料永遠不會接觸磁碟 - 它位於加密的保管庫中,僅在需要時在記憶體中解密。
此方法適用於任何 OpenSSH 相容客戶端:ssh、scp、rsync、git、mosh 以及使用 SSH 代理協定的 GUI 工具。
先決條件
| 要求 | 筆記 |
|---|---|
| Vaultwarden 伺服器(自架)或 Bitwarden 雲端 | CLI 登入需要 API 端點 |
Bitwarden CLI (bw) | 官方命令列客戶端 |
| OpenSSH 用戶端 | 隨 Linux、macOS 和 Windows 10+ 一起提供 |
SSH_AUTH_SOCK 支援 | 各大平台皆可 |
安裝 Bitwarden CLI
Linux / macOS
# Download the CLI
curl -Lo bw.zip "https://vault.bitwarden.com/download/?app=cli&platform=linux"
unzip bw.zip
sudo install bw /usr/local/bin/
rm bw.zip bw
Windows(PowerShell)
# Using winget
winget install Bitwarden.CLI
# Or download manually
Invoke-WebRequest -Uri "https://vault.bitwarden.com/download/?app=cli&platform=windows" -OutFile bw.zip
Expand-Archive -Path bw.zip -DestinationPath C:\tools\bw
$env:Path += ";C:\tools\bw"
驗證安裝:
bw --version
配置 SSH 代理
Bitwarden CLI 包含一個以 bw serve 開頭的內建 SSH 代理伺服器:
# Start the agent (runs in foreground — use a terminal multiplexer or daemonize it)
bw serve --port 8080
對於持久性後台會話,請建立專用使用者服務或使用 screen / tmux。在有 systemd 的 Linux 上:
[Unit]
Description=Bitwarden SSH Agent
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/bw serve --port 8080
Restart=on-failure
User=youruser
[Install]
WantedBy=default.target
環境設定 — 將 SSH_AUTH_SOCK 指向代理程式的 Unix 套接字:
export SSH_AUTH_SOCK="$HOME/.bitwarden-ssh-agent.sock"
將此行新增至您的 ~/.bashrc、~/.zshrc 或 shell 設定檔中,以便它在會話中保持不變。
將 SSH 金鑰新增至 Vault
Vaultwarden 支援專用的 SSH 金鑰 專案類型,該類型將私鑰及其對應的公共金鑰儲存為單一保管庫條目。
- 開啟您的保管庫(Web UI 或用戶端)。
- 按一下 新增項目 → SSH 金鑰。
- 填寫欄位:
- 名稱:例如“GitHub 部署金鑰”
- 私鑰:貼上完整的 PEM 或 OpenSSH 私鑰(包括
-----BEGIN OPENSSH PRIVATE KEY-----)。 - 公鑰:貼上對應的
.pub檔案內容。 - 如果密鑰受密碼保護,請在自訂欄位中附加密碼。
- 保存該項目。
此金鑰現已在 Vaultwarden 保管庫中進行靜態加密,可供登入相同帳戶或組織的每台裝置使用。
使用金鑰進行 Git 操作
一旦代理程式運行並且您的保管庫解鎖,git 就會透明地使用儲存在 Vaultwarden 中的 SSH 金鑰:
# Clone a repository using SSH
git clone [email protected]:username/private-repo.git
在幕後,git 呼叫 ssh,它與 SSH 代理套接字通信,後者中繼到 bw serve,後者從保管庫獲取密鑰。沒有提示,沒有檔案複製,沒有手動ssh-add。
相同的流程適用於 git fetch、git push、git pull 以及透過 SSH 的任何其他遠端操作。
透過 SSH 存取伺服器
以同樣的方式連接到任何遠端伺服器:
代理自動協商正確的密鑰。如果保管庫中有多個金鑰,SSH 會嘗試每個金鑰,直到伺服器接受一個金鑰 - 如果需要,可透過 ~/.ssh/config 和 IdentitiesOnly 進行設定。
管理多個密鑰
使用 ~/.ssh/config 將特定鍵固定到特定主機:
Host github.com
HostName github.com
IdentityFile ~/.ssh/id_ed25519_vault
Host personal-server
HostName 192.168.1.100
IdentityFile ~/.ssh/id_rsa_internal
這些 IdentityFile 路徑是像徵性的 - 代理根據儲存在保管庫中的金鑰解析它們。
安全考慮
- 主密碼 + 2FA:每次密鑰存取都需要一個未鎖定的保管庫。如果保管庫被鎖定,
bw serve無法解密金鑰。 - 金鑰永遠不會接觸磁碟:私鑰材料在記憶體中解密並透過代理套接字提供 - 它永遠不會寫入檔案。
- 會話逾時:設定
bw會話逾時,以便保管庫在不活動後自動鎖定。 - 審核日誌:Vaultwarden 記錄每次登入、專案存取和同步事件。您可以查看誰訪問了哪個密鑰以及何時訪問。
撤銷存取權限
當團隊成員離開或裝置遺失時,透過從包含 SSH 金鑰的 Vaultwarden 組織或集合中刪除使用者來撤銷存取權限。由於密鑰永遠不會儲存在本地(僅由代理臨時快取),因此撤銷是即時的 - 該密鑰根本無法再被該用戶解密。
- 開啟 Vaultwarden 管理面板。
- 導航至 管理 → 使用者。
- 從組織中刪除使用者(或調整收集權限)。
- 使用者的
bw serve將無法在下次操作中取得密鑰。
概括
Bitwarden SSH 代理程式將 Vaultwarden 從密碼管理器轉變為基於 SSH 工作流程的完整憑證中心。金鑰在保管庫中保持加密狀態,跨裝置同步,並透過標準 SSH 代理介面按需提供服務。與主密碼和 2FA 結合,此設定比傳統的 ~/.ssh/ 金鑰檔案提供更好的安全性和便利性。

