Windows で SSH で Windows Hello とかセキュリティキーとか
Windows で SSH で Windows Hello とかセキュリティキーとか
最近の OpenSSH は FIDO/U2F に対応しているようです。Windows 11 22H2 標準の OpenSSH は 8.6p1 と対応しているみたいです。なのでやってみようというわけです。
やってみた。そしてだめだった。
ssh-keygen
で対応している暗号化アルゴリズムを調べます。FIDO/U2F に対応しているのは ecdsa-sk
などの *-sk
です。
> ssh-keygen.exe --help
unknown option -- -
usage: ssh-keygen [-q] [-a rounds] [-b bits] [-C comment] [-f output_keyfile]
[-m format] [-N new_passphrase] [-O option]
[-t dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa]
[-w provider] [-Z cipher]
...
対応しているみたいですね! というわけで鍵ペアを作成します。
> ssh-keygen -t ecdsa-sk
Generating public/private ecdsa-sk key pair.
You may need to touch your authenticator to authorize key generation.
Key enrollment failed: unknown or unsupported key type
だめでした...
Upstream changes from OpenSSH 8.6. Please note this release doesn't have FIDO support.
サポートしていないって...
最新の OpenSSH をつかったらいけた
今の Windows 用 OpenSSH の最新バージョンは V8.9.1.0p1-Beta みたいです。
見てると、8.9.0
で FIDO/U2F に対応したっぽいです。
FIDO/U2F hardware authenticators support to Win32-OpenSSH. Thanks to @martelletto, @akshayku.
というわけでインストールします。
> winget install Microsoft.OpenSSH.Beta
インストール先が C:Program Files\OpenSSH
になりますので、環境変数 PATH の先頭にこれを追加してください。
そして、鍵ペアを作成します。
> ssh-keygen -t ecdsa-sk
こんな感じで Windows Hello の画面が出るので、PIN を入力します。
Generating public/private ecdsa-sk key pair.
You may need to touch your authenticator to authorize key generation.
Enter file in which to save the key (C:\Users\masakura/.ssh/id_ecdsa_sk):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\masakura/.ssh/id_ecdsa_sk
Your public key has been saved in C:\Users\masakura/.ssh/id_ecdsa_sk.pub
The key fingerprint is:
SHA256:jkY/CYHeMWt6pdT+CcNQURgb5F4YHMRu7sruYnJ+Jns azuread\masakura@hurricane
The key's randomart image is:
鍵が無事作成されました!
- 別のパソコンでは ecdsa-sk は作成できませんでした
- ed25519-sk は Yubikey などのセキュリティキー専用っぽいです
.ssh/config に次のように秘密鍵のパスを設定しておきます。
Host *
IdentityFile ~/.ssh/id_ecdsa_sk
あとはいつも通りに使うだけです。ssh foo.example.jp
とすると、Windows Hello もしくはセキュリティキーのアンロックの画面が表示されるので、PIN などを入力します。
最後に
秘密鍵って盗られた時の保険にパスフレーズを設定するんですが、そのパスフレーズの入力がめんどくさいし、(まあ、 ssh-agent があるわけですが) 弱いパスフレーズだとあまり意味がないですよね。
この FIDO/U2F に対応した方法なら、秘密鍵が漏洩しても破られることはないんじゃないかなと思います。(多分ですよ? 詳しく仕組み調べていないので)
入力するのが PIN でパスフレーズよりも短くてすむのもありがたいですが、Windows Hello の顔認証や指紋認証が使えるのもいいですよね。
Discussion