背景
仕事だと定期的にPCを交換しますが、そのたびにsshキーを全て最初から登録し直すのは非常に大変です。
かといって.sshをdotfilesとしてGitHubに管理したり、手動でコピーするのも転送経路をどうするかとか前PCから消し忘れたりとセキュリティ的に心配になります。
そこでsshキーをBitwarden上で管理し、ssh-agentを使ってsshができるようにします。
環境
インストールと設定
が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キーをパスフレーズで暗号化している場合
最期ほどのカスタムフィールドに加えて、
テキスト
タイプ- キー名は
passphrase
- 値をパスフレーズ
でカスタムフィールドとして追加します。
以上で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/config
でIdentityFile
でキーの指定をしている場合はコメントアウトするかその行を削除してください。
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キーを管理する方法を紹介しました。