Featured image of post Vaultwarden/BitwardenでSSHキーを管理する方法 Featured image of post Vaultwarden/BitwardenでSSHキーを管理する方法

Vaultwarden/BitwardenでSSHキーを管理する方法

Vaultwarden(Bitwarden)のSSHエージェント機能を使ってSSHキーを一元管理する方法を解説。安全なキーアクセス、端末間同期、CLIセットアップまで。

なぜパスワードマネージャーでSSHキーを管理するのか

SSHキーはリモートサーバーやGitプロバイダー、内部インフラへの認証の標準手段です。しかし、多くの開発者は~/.ssh/に平文ファイルとして保存し、保護も同期も監査もされていない状態で運用しています。SSHキーをVaultwarden(またはBitwarden)に移すことで、以下の3つの問題が解決します。

  • 一元管理: すべてのキーが一つの保管庫に集約され、複数のマシンに散らばりません。
  • 端末間同期: キーを一度追加すれば、すべてのデバイスで自動的に利用可能になります。
  • 監査証跡: キーへのアクセスやクライアント操作はすべてサーバーに記録されます。

Bitwarden SSHエージェントは、ロックされた保管庫と日常的なSSHキー利用の橋渡しをします。

Bitwarden SSHエージェントの概要

Bitwarden SSHエージェントは軽量なデーモンで、保管庫に保存されたSSHキーを標準のSSH_AUTH_SOCKインターフェースを通して公開します。sshgitがキーを必要とするとき、エージェントがBitwarden CLI(bw)に問い合わせ、暗号化された保管庫から秘密鍵を取得します。キー素材はディスクに書き込まれることなく、メモリ上で復号されてエージェントソケットから提供されます。

この仕組みはOpenSSH互換のあらゆるクライアント(sshscprsyncgitmosh、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キーアイテムタイプをサポートしており、秘密鍵と公開鍵を一つの保管庫エントリとして保存できます。

  1. 保管庫(Web UIまたはクライアント)を開きます。
  2. アイテムを追加SSHキーをクリックします。
  3. 以下の項目を入力します。
    • 名前: 例:「GitHub Deploy Key」
    • 秘密鍵: PEMまたはOpenSSH形式の秘密鍵全体(-----BEGIN OPENSSH PRIVATE KEY-----を含む)を貼り付けます。
    • 公開鍵: 対応する.pubファイルの内容を貼り付けます。
    • キーがパスフレーズで保護されている場合は、カスタムフィールドにパスフレーズを追加します。
  4. アイテムを保存します。

キーはVaultwarden保管庫内で暗号化された状態で保存され、同じアカウントまたは組織にログインするすべてのデバイスで利用可能になります。

Git操作でのキーの使用

エージェントが起動し保管庫のロックが解除されていれば、gitはVaultwardenに保存されたSSHキーを透過的に使用します。

# SSHを使用したリポジトリのクローン
git clone [email protected]:username/private-repo.git

内部では、gitsshを呼び出し、sshがSSHエージェントソケットに通信し、bw serveが保管庫からキーを取得します。プロンプトもファイルコピーも手動のssh-addも不要です。

git fetchgit pushgit pullなどのリモート操作も同様に動作します。

サーバーアクセス

リモートサーバーへの接続も同じ流れです。

エージェントが自動的に適切なキーをネゴシエーションします。複数のキーが保管庫にある場合は、サーバーが受け入れるまで順に試行されます。必要に応じて~/.ssh/configIdentitiesOnlyを設定できます。

複数キーの管理

~/.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の組織またはコレクションから該当ユーザーを削除するだけでアクセスを取り消せます。キーはローカルに保存されていないため(エージェントが一時的にキャッシュするのみ)、取り消しは即座に反映されます。

  1. Vaultwardenの管理パネルを開きます。
  2. 管理ユーザーに移動します。
  3. 組織からユーザーを削除するか、コレクションの権限を調整します。
  4. 以降、そのユーザーのbw serveはキーの取得に失敗します。

まとめ

Bitwarden SSHエージェントは、Vaultwardenをパスワード管理ツールからSSHベースのワークフローに対応した統合クレデンシャルハブへと進化させます。キーは暗号化された状態で保管庫に保持され、端末間で同期され、標準のSSHエージェントインターフェースを介してオンデマンドで提供されます。マスターパスワードと2FAを組み合わせることで、従来の~/.ssh/キーファイルよりも優れたセキュリティと利便性を実現します。