为什么将 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/ 密钥文件提供更好的安全性和便利性。

