🔗

MacでBitwarden + Yubikeyを使ったSSH接続メモ

2023/03/13に公開

概要

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