なぜパスワードマネージャーでSSHキーを管理するのか
SSHキーはリモートサーバーやGitプロバイダー、内部インフラへの認証の標準手段です。しかし、多くの開発者は~/.ssh/に平文ファイルとして保存し、保護も同期も監査もされていない状態で運用しています。SSHキーをVaultwarden(またはBitwarden)に移すことで、以下の3つの問題が解決します。
- 一元管理: すべてのキーが一つの保管庫に集約され、複数のマシンに散らばりません。
- 端末間同期: キーを一度追加すれば、すべてのデバイスで自動的に利用可能になります。
- 監査証跡: キーへのアクセスやクライアント操作はすべてサーバーに記録されます。
Bitwarden SSHエージェントは、ロックされた保管庫と日常的なSSHキー利用の橋渡しをします。
Bitwarden SSHエージェントの概要
Bitwarden SSHエージェントは軽量なデーモンで、保管庫に保存されたSSHキーを標準のSSH_AUTH_SOCKインターフェースを通して公開します。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
# 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)
# wingetを使用
winget install Bitwarden.CLI
# 手動ダウンロード
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にはSSHエージェントサーバーが内蔵されています。bw serveで起動します。
# エージェントの起動(フォアグラウンドで実行 — tmuxやscreenの使用を推奨)
bw serve --port 8080
バックグラウンドで永続的に実行するには、systemdユーザーサービスを作成します。
[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に追加して、セッション間で永続化します。
保管庫へのSSHキーの追加
Vaultwardenは専用のSSHキーアイテムタイプをサポートしており、秘密鍵と公開鍵を一つの保管庫エントリとして保存できます。
- 保管庫(Web UIまたはクライアント)を開きます。
- アイテムを追加 → SSHキーをクリックします。
- 以下の項目を入力します。
- 名前: 例:「GitHub Deploy Key」
- 秘密鍵: PEMまたはOpenSSH形式の秘密鍵全体(
-----BEGIN OPENSSH PRIVATE KEY-----を含む)を貼り付けます。 - 公開鍵: 対応する
.pubファイルの内容を貼り付けます。 - キーがパスフレーズで保護されている場合は、カスタムフィールドにパスフレーズを追加します。
- アイテムを保存します。
キーはVaultwarden保管庫内で暗号化された状態で保存され、同じアカウントまたは組織にログインするすべてのデバイスで利用可能になります。
Git操作でのキーの使用
エージェントが起動し保管庫のロックが解除されていれば、gitはVaultwardenに保存されたSSHキーを透過的に使用します。
# SSHを使用したリポジトリのクローン
git clone [email protected]:username/private-repo.git
内部では、gitがsshを呼び出し、sshがSSHエージェントソケットに通信し、bw serveが保管庫からキーを取得します。プロンプトもファイルコピーも手動のssh-addも不要です。
git fetch、git push、git pullなどのリモート操作も同様に動作します。
サーバーアクセス
リモートサーバーへの接続も同じ流れです。
エージェントが自動的に適切なキーをネゴシエーションします。複数のキーが保管庫にある場合は、サーバーが受け入れるまで順に試行されます。必要に応じて~/.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はすべてのログイン、アイテムアクセス、同期イベントを記録します。誰がどのキーにいつアクセスしたかを確認できます。
アクセスの取り消し
チームメンバーが退任した場合やデバイスを紛失した場合は、Vaultwardenの組織またはコレクションから該当ユーザーを削除するだけでアクセスを取り消せます。キーはローカルに保存されていないため(エージェントが一時的にキャッシュするのみ)、取り消しは即座に反映されます。
- Vaultwardenの管理パネルを開きます。
- 管理 → ユーザーに移動します。
- 組織からユーザーを削除するか、コレクションの権限を調整します。
- 以降、そのユーザーの
bw serveはキーの取得に失敗します。
まとめ
Bitwarden SSHエージェントは、Vaultwardenをパスワード管理ツールからSSHベースのワークフローに対応した統合クレデンシャルハブへと進化させます。キーは暗号化された状態で保管庫に保持され、端末間で同期され、標準のSSHエージェントインターフェースを介してオンデマンドで提供されます。マスターパスワードと2FAを組み合わせることで、従来の~/.ssh/キーファイルよりも優れたセキュリティと利便性を実現します。
