ssh鍵をiPhone/Android (Passkey) に入れて運用してみた（Windows）

## 目的

sshをMFAに対応させる方法を模索してたらたどり着いた。  
(sshも生体認証したいよねー)
Windowsのみ対応。また一部レジストリハック必要。

## 前提

* Bluetooth搭載のWindowsPC
* ログイン先のsshサーバが公開鍵タイプ `sk-ecdsa-sha2-nistp256@openssh.com` を受け入れる事

## やり方

### Putty-CACを導入

https://github.com/NoMoreFood/putty-cac

このputtyはMS-CAPI経由でWindowsの証明書ストアに保存されてた秘密鍵や、Windows HelloなどのFIDOを用いたsshの鍵認証が可能。　便利

### FIDO鍵作成

putty.exe を起動させ、
`connection` -> `SSH` -> `Certificate` -> `FIDO Tools`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510245/e498ca2e-0319-dee6-69d5-87b77180cdf7.png)
Application Nameに鍵の名前を適当につけて、`Create Key`を押下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510245/2c0dd488-dc3b-7b80-c25a-c61ffafdb409.png)
Windows セキュリティのポップアップが出てくるので、`別のデバイスを使用する`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510245/d7134c09-2583-d3fc-130b-6287d451deb0.png)
パスキーの保存場所として `iPhone, iPad, または Android デバイス`を選択して次へ

ちなみに、ここで`セキュリティキー`を選ぶとYubikeyなどのFIDO Tokenに、
`このWindowsデバイス`を選ぶとWindows Helloへ保存される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510245/1554222d-9276-a9a7-8a2c-d4d38794b584.png)

QRコードが出てくるのでスマホでスキャン。

スマホ側はスクショが取れず画面はないが、パスキーを保存するを選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510245/fc3e0a21-1dc1-9c74-5bd2-07f1d4c22665.png)

うまくいけばこの画面に

## 使い方

基本的に pageant を利用する。
最後に簡単に触れるが、Windows Native の ssh コマンドや、WSL2上のLinuxから利用するには pageant を使うのが楽。

VSCode や git なども連動するのでオススメ

### pageant の登録

pageant.exe を起動させ、タスクトレイのアイコンを開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510245/14d29ad7-f7ac-2a3f-906e-de426eb4671e.png)

`Add FIDO Key`を押下し、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510245/e7e2d945-9b93-55d8-7f2e-7851d5709caa.png)

さっき作った鍵を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510245/a9fc26af-0b18-1796-c637-2de20b8c44d6.png)

登録されたら鍵を選択し、`Copy To Clipboard` を押下し公開鍵を取得する

```
sk-ecdsa-sha2-nistp256@openssh.com AAAAwaevi1ieta6tohNg5cae5hoh3ix1vaiwoh3leejeezohghai6Aecheeki7uVurer7yahNahs8kuwaiGae9oocooxaelagaip9SohbeiduFiem1ooW2shaj1phai0ienahmooxaith8Rahrohwoozoob7jaiKahch3aek6phaixiNooph4naish9zoonohxai1pheeng  FIDO:ssh:hogehoge ssh:hogehoge
```

こんな感じの公開鍵が得られるので、これをログインしたいサーバの `authorized_keys` に追記する。

### ssh を用いたログイン方法

`authorized_keys` に登録されており、pageantの鍵リストに登録されているのならば、puttyを用いて通常通りにsshすればよい

実際に ssh ログインを試みると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510245/c02330ba-ec2e-7fdb-d009-e076693930f2.png)

putty から pageant に鍵利用のリクエストが行くので、
pageantの署名確認画面を押下（これはPageantのオプションで有効にしている場合）

pageantからWindowsへパスキー利用のリクエストが行き、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510245/b1627748-35aa-57df-8195-d1b6ae4ebe96.png)

今回はスマホに保存したので
`iPhone, iPad, または Android デバイス`を選択して次へ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510245/c9f0f0f9-9b3d-ee5f-1482-ccb067335cf7.png)

QRコードが出てくるので、登録したスマホで読み込み、生体認証を行う。

これでログインできる。

## Windows Native SSHやWSLのサポート

詳しくは @slotport さんのこの記事にしっかり書かれているので、こちらを
https://qiita.com/slotport/items/e1d5a5dbd3aa7c6a2a24

基本的には

WSL2から使うならこれを

https://github.com/sahendrickson/wsl2-ssh-bridge

Windows Native sshから使うなら、これ入れて、Windowsのユーザ環境変数`SSH_AUTH_SOCK=\\.\pipe\ssh-pageant`を追加すれよい

https://github.com/benpye/wsl-ssh-pageant

## 欠点

ここで作った鍵を他のWindows端末で使う方法が公式にない！！！

PuTTYのレジストリに登録があるので、これをエクスポートして利用したいWindowsPCでインポートすると、別のWindowsでも使えることを確認したが……

`HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Fido`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510245/d1140bee-8f7b-1c6f-bb56-fcaf9a3eaf57.png)

まぁ、鍵ファイルを運ぶ代わりにレジストリファイルを運ぶと思えばよいのかな……


## 備考

おそらく ssh サーバの設定 sshd_config で
```
AuthenticationMethods publickey
PubkeyAcceptedKeyTypes sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com
```
と PublicKey のみ、かつ、`sk-`から始まる鍵を指定することで、一般的なMFAレベルを強制できるんじゃないかと思う

とはいえ、セキュリティキーをエミュレートするなんて簡単だし、
ハードウェアセキュアエレメントをちゃんと運用するとなると大変そうだよね


クラウドのご時世だし、GoogleやMSアカウントを使った認証へとシフトしてくれないかな？
Azureならこんなのあるし

https://learn.microsoft.com/en-us/entra/identity/devices/howto-vm-sign-in-azure-ad-linux