Carpe Diem

備忘録

Bitwardenでsshキーを管理する

背景

仕事だと定期的にPCを交換しますが、そのたびにsshキーを全て最初から登録し直すのは非常に大変です。
かといって.sshをdotfilesとしてGitHubに管理したり、手動でコピーするのも転送経路をどうするかとか前PCから消し忘れたりとセキュリティ的に心配になります。

そこでsshキーをBitwarden上で管理し、ssh-agentを使ってsshができるようにします。

環境

  • macOS(M1) 13.2
  • bitwarden-cli 2023.1.0
  • joaojacome/bitwarden-ssh-agent 6035f80

インストールと設定

github.com

ssh-agentにBitwarden上のキーを登録してくれます。
そのためのインストール手順と設定を説明します。

bitwarden-cli

まずはbitwarden-ssh-agentが依存しているCLIツールをインストールします。

$ brew install bw

インストールできたらログインします。

$ bw login
? Email address: foobar@example.com
? Master password: [hidden]
? Two-step login code: xxxxxx
You are logged in!

To unlock your vault, set your session key to the `BW_SESSION` environment variable. ex:
$ export BW_SESSION="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=="
> $env:BW_SESSION="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=="

You can also pass the session key to any command with the `--session` option. ex:
$ bw list items --session xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==

sshキーをBitwarden上に保存

bitwarden-ssh-agentで指定されているのでその手順に則ってファイルを用意します。

1. フォルダの用意

Bitwardenの自分の保管庫にssh-agentというフォルダを用意します。

2. セキュアメモの用意

アイテムのタイプをメモにし、フォルダーを先程のssh-agentにします。
名前は任意です。

一旦この状態で保存します。

3. 添付ファイルのアップロード

一覧画面で先程作ったセキュアメモに添付ファイルとしてsshキーをアップロードします。

4. 添付ファイルの名前をカスタムフィールドに登録

先程アップロードしたsshキーに対して

  • テキストタイプ
  • キー名はprivate
  • 値をsshキーファイル名

でカスタムフィールドとして追加します。

sshキーをパスフレーズで暗号化している場合

最期ほどのカスタムフィールドに加えて、

でカスタムフィールドとして追加します。

以上でBitwarden上の設定は完了です。

bitwarden-ssh-agent

ソースをダウンロードします。

$ git clone https://github.com/joaojacome/bitwarden-ssh-agent.git

↑のフォルダに入りスクリプトを実行します。
最初は詰まったりした時に分かりやすいよう--debugオプションを付けると良いでしょう。

$ ./bw_add_sshkeys.py --debug

INFO:root:Getting Bitwarden session
DEBUG:root:Bitwarden vault is locked
? Master password: [hidden]
INFO:root:To re-use this BitWarden session run: export BW_SESSION="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=="
DEBUG:root:Session = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==
INFO:root:Getting folder list
DEBUG:root:Folder name: ssh-agent
INFO:root:Getting folder items
DEBUG:root:Folder ID: xxx
INFO:root:Attempting to add keys to ssh-agent
DEBUG:root:Private key file declared
WARNING:root:No "passphrase" field found for item ssh id_ecdsa
DEBUG:root:Private key ID found
DEBUG:root:Item ID: xxx
DEBUG:root:Key ID: xxx
DEBUG:root:Running ssh-add
Identity added: (stdin) (jun06t@foobar)

動作確認

ssh-agentの確認

ssh-agentに登録されているかどうかを確認します。

$ ssh-add -l
256 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxx jun06t@foobar (ECDSA)

ローカルのsshキーを一時的に別の場所に

ローカルのsshキーを使ってしまっては意味がないので、.sshから別の場所に退避させておきます。
動作確認ができたらキーを削除します。

.ssh/configIdentityFileでキーの指定をしている場合はコメントアウトするかその行を削除してください。

ssh

問題なければ実際にsshできるか確認してみてください。

$ ssh xxx.xxx.xxx.xxx

その他

再起動した場合

PCを再起動するとssh-agentもリセットされるため再度bw_add_sshkeys.pyを実行する必要があります。

一度bitwarden-cliにログインしていればアンロックするためにマスターパスワードの入力だけで済みます。

$ ./bw_add_sshkeys.py
INFO:root:Getting Bitwarden session
? Master password: [hidden]
INFO:root:To re-use this BitWarden session run: export BW_SESSION="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=="
INFO:root:Getting folder list
INFO:root:Getting folder items
INFO:root:Attempting to add keys to ssh-agent
WARNING:root:No "passphrase" field found for item ssh id_ecdsa
Identity added: (stdin) (jun06t@foobar)

またはメッセージのようにBW_SESSION.bashrcなどに保持させる方法がありますが、今度はそこがセキュリティリスクになるので推奨しません。

サプライチェーン攻撃の注意

joaojacome/bitwarden-ssh-agentに悪意あるコミッターによる機密情報を勝手にどこかのサーバに送信するような実装を埋め込むといった攻撃がありえるため、一度ソースを読むなりして安全が確認できたバージョンをforkして固定化するなどするのが安全です。

まとめ

Bitwardenでsshキーを管理する方法を紹介しました。