目的
sshをMFAに対応させる方法を模索してたらたどり着いた。
(sshも生体認証したいよねー)
Windowsのみ対応。また一部レジストリハック必要。
前提
- Bluetooth搭載のWindowsPC
- ログイン先のsshサーバが公開鍵タイプ
sk-ecdsa-sha2-nistp256@openssh.com
を受け入れる事
やり方
Putty-CACを導入
このputtyはMS-CAPI経由でWindowsの証明書ストアに保存されてた秘密鍵や、Windows HelloなどのFIDOを用いたsshの鍵認証が可能。 便利
FIDO鍵作成
putty.exe を起動させ、
connection
-> SSH
-> Certificate
-> FIDO Tools
Application Nameに鍵の名前を適当につけて、Create Key
を押下。
Windows セキュリティのポップアップが出てくるので、別のデバイスを使用する
パスキーの保存場所として iPhone, iPad, または Android デバイス
を選択して次へ
ちなみに、ここでセキュリティキー
を選ぶとYubikeyなどのFIDO Tokenに、
このWindowsデバイス
を選ぶとWindows Helloへ保存される
QRコードが出てくるのでスマホでスキャン。
スマホ側はスクショが取れず画面はないが、パスキーを保存するを選択する。
うまくいけばこの画面に
使い方
基本的に pageant を利用する。
最後に簡単に触れるが、Windows Native の ssh コマンドや、WSL2上のLinuxから利用するには pageant を使うのが楽。
VSCode や git なども連動するのでオススメ
pageant の登録
pageant.exe を起動させ、タスクトレイのアイコンを開く
Add FIDO Key
を押下し、
さっき作った鍵を選択する
登録されたら鍵を選択し、Copy To Clipboard
を押下し公開鍵を取得する
sk-ecdsa-sha2-nistp256@openssh.com AAAAwaevi1ieta6tohNg5cae5hoh3ix1vaiwoh3leejeezohghai6Aecheeki7uVurer7yahNahs8kuwaiGae9oocooxaelagaip9SohbeiduFiem1ooW2shaj1phai0ienahmooxaith8Rahrohwoozoob7jaiKahch3aek6phaixiNooph4naish9zoonohxai1pheeng FIDO:ssh:hogehoge ssh:hogehoge
こんな感じの公開鍵が得られるので、これをログインしたいサーバの authorized_keys
に追記する。
ssh を用いたログイン方法
authorized_keys
に登録されており、pageantの鍵リストに登録されているのならば、puttyを用いて通常通りにsshすればよい
実際に ssh ログインを試みると
putty から pageant に鍵利用のリクエストが行くので、
pageantの署名確認画面を押下(これはPageantのオプションで有効にしている場合)
pageantからWindowsへパスキー利用のリクエストが行き、
今回はスマホに保存したので
iPhone, iPad, または Android デバイス
を選択して次へ
QRコードが出てくるので、登録したスマホで読み込み、生体認証を行う。
これでログインできる。
Windows Native SSHやWSLのサポート
詳しくは @slotport さんのこの記事にしっかり書かれているので、こちらを
https://qiita.com/slotport/items/e1d5a5dbd3aa7c6a2a24
基本的には
WSL2から使うならこれを
Windows Native sshから使うなら、これ入れて、Windowsのユーザ環境変数SSH_AUTH_SOCK=\\.\pipe\ssh-pageant
を追加すれよい
欠点
ここで作った鍵を他のWindows端末で使う方法が公式にない!!!
PuTTYのレジストリに登録があるので、これをエクスポートして利用したいWindowsPCでインポートすると、別のWindowsでも使えることを確認したが……
HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Fido
まぁ、鍵ファイルを運ぶ代わりにレジストリファイルを運ぶと思えばよいのかな……
備考
おそらく ssh サーバの設定 sshd_config で
AuthenticationMethods publickey
PubkeyAcceptedKeyTypes sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com
と PublicKey のみ、かつ、sk-
から始まる鍵を指定することで、一般的なMFAレベルを強制できるんじゃないかと思う
とはいえ、セキュリティキーをエミュレートするなんて簡単だし、
ハードウェアセキュアエレメントをちゃんと運用するとなると大変そうだよね
クラウドのご時世だし、GoogleやMSアカウントを使った認証へとシフトしてくれないかな?
Azureならこんなのあるし