MacでBitwarden + Yubikeyを使ったSSH接続メモ
概要
macOSからBitwardenに保存したED25519-SK
の鍵を使ってサーバーへ接続するための作業のメモです。
鍵ファイルの作成
Yubikeyによる認証を行う鍵を ED25519-SK
で作成する。ただし macOS Ventura(13.2.1)
時点ではSSHがセキュリティキーに対応していないためHomebrewでインストールを行う必要がありました。
$ brew install openssh
$ exec $SHELL -l
$ ssh-keygen -t ed25519-sk -C '' -f yubikey.pem
Generating public/private ed25519-sk key pair.
You may need to touch your authenticator to authorize key generation.
<Yubikeyをタッチ>
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in yubikey.pem
Your public key has been saved in yubikey.pem.pub
サーバへの接続の為、対象のサーバーに公開鍵を登録しておいてください。
BitwardenへSSH鍵を保存
鍵をBitwardenに保存し、使用時にダウンロードして利用出来るようにします。今回使用しませんが、SK以外の鍵を使う場合に bitwarden-ssh-agent
を利用出来るようにフォルダをssh-agent
として、セキュアメモを作成します。
セキュアメモの登録
ファイルを添付するには一度セキュアメモを保存して、編集する事で添付が可能になります。
項目 | 設定値 |
---|---|
タイプ | セキュアメモ |
名前 | 任意の名前 |
フォルダー | ssh-agent |
カスタムフィールド名 | private |
カスタムフィールド値 | 添付する鍵のファイル名 |
Bitwarden CLIのインストール
BitwardenをCLIから使用できるように bitwarden-cli
を Homebrewにてインストールします。
$ brew install bitwarden-cli
$ bw login
? Email address: <Bitwarden登録のメールアドレス>
? Master password: [hidden] <マスターパスワード>
? Two-step login method: YubiKey OTP Security Key
? Two-step login code: <Yubikeyタッチ>
You are logged in!
$ bw sync
鍵の確認
鍵アイテムのIDと添付ファイルのIDが必要となるのでメモしておきます。自分の場合yubikeyとセキュアメモの名前に記載しているため、それでアイテムを検索しています。
$ bw list items --search yubikey | jq '.[]|[.id, .name, .attachments[]]'
? Master password: [hidden]
[
"<アイテムID>",
"<セキュアメモ名>",
{
"id": "<添付ファイルID>",
"fileName": "<添付ファイル名>",
"size": "625",
"sizeName": "625 Bytes",
"url": "<添付ファイルダウンロードURL>"
}
]
ESSH
ESSHは個人的に便利で使っているSSHラッパーとなります。設定のグルーピングやタグ付け、接続時のフック等の機能があるため便利です。Homebrewでインストールが可能です。
hooks_before_connect
が接続前の処理、 hooks_after_disconnect
が切断後の処理となっています。
インストール
$ brew install essh
$ exec $SHELL -l
設定
$ vi ~/.essh/config.lua
group {
User = '<接続ユーザ名>',
HostName = '<接続先ホスト名>',
hooks_before_connect = {
"echo get key from bitwarden",
"get-yubikey-pem",
},
hooks_after_disconnect = {
"echo remove keys",
"rm -f /tmp/yubikey1.pem",
"rm -f /tmp/yubikey2.pem",
},
host 'host.yubikey1' {
IdentityFile = '/tmp/yubikey1.pem'
},
host 'host.yubikey2' {
IdentityFile = '/tmp/yubikey2.pem'
},
}
$ essh --print
Host host.yubikey1
HostName <接続先ホスト名>
IdentityFile /tmp/yubikey1.pem
User <接続ユーザ名>
Host host.yubikey2
HostName <接続先ホスト名>
IdentityFile /tmp/yubikey2.pem
User <接続ユーザ名>
スクリプトの作成
SSH鍵をダウンドードする為のスクリプトを作成します。
ここでBitwarden CLIの項目で取得したアイテムID
と添付ファイルID
を使用します。
例では2つのYubikeyの鍵を取得するようにしています。また、サクッと作ったものなので、ループ対応などを行った方が鍵を増やしたときには楽になると思います。
$ mkdir -p ~/bin/
$ touch ~/bin/get-yubikey-pem
$ chmod +x ~/bin/get-yubikey-pem
$ vi ~/bin/get-yubikey-pem
#!/bin/sh
BW_SESSION=$(bw unlock --raw)
bw sync
BW_ITEM_ID=<アイテムID>
BW_ATTACH_ID=<添付ファイルID>
KEY_PATH=/tmp/yubikey1.pem
bw get attachment ${BW_ATTACH_ID} --itemid ${BW_ITEM_ID} --output ${KEY_PATH} --session ${BW_SESSION}
BW_ITEM_ID=<アイテムID>
BW_ATTACH_ID=<添付ファイルID>
KEY_PATH=/tmp/yubikey2.pem
bw get attachment ${BW_ATTACH_ID} --itemid ${BW_ITEM_ID} --output ${KEY_PATH} --session ${BW_SESSION}
使用例
上記作業にてesshにて接続を実施する事で鍵ファイルの取得〜接続〜切断〜鍵の削除が行えるようになっています。
$ essh host.yubikey1
get key from bitwarden
? Master password: [hidden]
Syncing complete.
Saved /tmp/yubikey1.pem
Saved /tmp/yubikey2.pem
Confirm user presence for key ED25519-SK SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
User presence confirmed
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-67-generic x86_64)
user@host:~$ exit
logout
Connection to host closed.
remove keys
Discussion