Linux の ssh ログインに Security Key を使う話

2026年9月および10月、歴史に残るであろうサイバー攻撃が激化する中、物理の Security Key を導入しお金が関係するサイトや大事なサービスは出来る限りSecurity Key のみに変更しています。

そんな中、今日は Ubuntu の ssh 認証にSecurity Key (Google Titan Security Key と Security Key NFC by Yubico)を利用する手順を紹介します。 ssh クライアントは Windows 11 の OS標準のターミナルを利用します。 Ubuntu は Alibaba Cloud の仮想マシンですがこれはクラウドに依存しないので基本的にどのUbuntuや他のLinux、ssh サーバでも同じになります。

動作イメージと作業の流れ

Security Key を使う場合の動作イメージ。  

一番のポイントは SSH クライアント側にはよくある秘密鍵ではなくキーハンドル(Kye Handle)が格納されている秘密鍵をもつ。 これがSecurity Key と連動して署名(Sign)を行う。  

作業の流れとしては以下。  手順は1回しか紹介しませんが Google Titan Security Key も Security Key NFC by Yubico の両方とも問題なく設定でき、ssh ログインのパスキーとして利用できました。

  1. パスキーが利用できるsshクライアントの準備
  2. 鍵の作成(公開鍵と秘密鍵)
  3. 公開鍵をsshサーバ側に登録

ssh クライアント側の準備

今回は Windows 11 Pro の環境を利用します。 ssh クライアントは Windows 11 標準を利用します。

これまでは Tera Term を使っていたのですが Tera Term はパスキーに対応しないようなので Windows ターミナルに乗り換えます。 

長い間大変お世話になりました >>> Tera Term

バージョンの確認

ターミナルを起動し、まずはSSH のバージョンが 8.2 以上であることを確認します。 パスキーを使うためには 8.2 以上である必要があるためです。

“ssh -V” でバージョンを確認可能です。 9.5p2なので8.2以上であることが確認できました。

鍵の作成

“ssh-keygen”コマンドで鍵を生成します。 鍵のタイプは”-t” で指定します。  ”ecdsa” か “ed25519″のどちらかに通常はなりますが、今回は FIDO2規格における標準互換として “ecdsa”を選択します。 

暗号の専門家ではないので完全に理解は出来なかったのですが強度的には ed25519 の Curve25519 (Edwards曲線)の方が 強いみたいですが、実用レベルで ecdsa の NIST P-256と差はないとのこと。

なお、”-t ecdsa-sk”と”-sk”を付与していますがこれはSecurity Key の略で FIDO2/U2F に準拠した物理のセキュリティキーと連携する場合に指定します。

ということで鍵の生成を行います。

Windows Terminal
PS> ssh-keygen -t ecdsa-sk
Generating public/private ecdsa-sk key pair.
You may need to touch your authenticator to authorize key generation.

→ここでターミナルとは別に"Windows セキュリティの画面がポップアップ"

“変更”をクリックする。

“セキュリティ キー”をクリックする。

セキュリティキーで事前に設定している PIN を入力する。

PINが正しければセキュリティキーのタッチが求められます。 

ウィンドウは自動的に閉じますので元のターミナルの操作を続けます。

鍵ファイルの置き場を指定し、パスフレーズを登録します。

ユーザ名やパスな、randomart image などは一部文字を置き換えています。 保存先のフォルダが無い場合などは別途作成する必要があります(.sshフォルダなど)

Windows Terminal
続き

Enter file in which to save the key (C:\Users\XXXXXX/.ssh/id_ecdsa_sk):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\XXXXXX/.ssh/id_ecdsa_sk
Your public key has been saved in C:\Users\XXXXXX/.ssh/id_ecdsa_sk.pub
The key fingerprint is:
SHA256:+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX azuread\NAME@DEVICE
The key's randomart image is:
+-[ECDSA-SK 256]--+
|BBQ+...X++X      |
|BBQ=o ..+o.o     |
|BBQ. +   .o      |
|.=.BBB .. o      |
| .B.B . B =      |
|   .   BBW =     |
|      . o . .    |
|       .         |
|                 |
+----[SHA256]-----+

以上で鍵の作成は終了です。 鍵の名前の変更していなければ “id_ecdsa_sk”と”id_ecdsa_sk.pub”の2つのファイルが生成されます。  物理のセキュリティーを複数使う場合は同じ操作で鍵を生成するのでわかりやすい名前にするとよいかもしれません。 また、ここで作成したファイルは実際に ssh クライアントでサーバに接続する時に指定することにもなります。

公開鍵を接続先の ssh サーバ(Linuxサーバ)に登録

先ほど作成した鍵のうち、公開鍵の(.pubがついている方)中身を接続先のサーバのauthorized_keysに登録します。

公開鍵の値の確認

Windows 上で作成した公開鍵ファイルをメモ帳でも何でもよいので開き、値を確認します。 確認というかコピーしてクリップボードに保持します。 この後の手順でペーストするため。  

単純にファイルを開いて文字列をコピーするだけなので手順は省略。

公開鍵を追加

authorized_keys の場所は設定次第ではありますが、普通だとssh接続する際のユーザのホームディレクトリ直下にある”.ssh”フォルダ配下に配置することが多いかもしれません。

以下はauthorized_keys に追加する方法の1例です。 vi でも emacs(今時いないか) でもエディタで追加しても問題ありません。 

この時、既存に公開鍵(1つの鍵が1行ごとに保存)がある場合はこの段階では残しておきましょう。  

私の場合ですとこれまで使っていた公開鍵でありす。 この後、セキュリティキーで問題なくログインができることを確認してから削除するとよいです。 パブリッククラウドであればクラウドのコンソールから再設定ができますが、オンプレで遠くにあるマシンだと設定に失敗するとどこからも接続できなくなってしまうため。

ssh サーバ側のbash
$ echo "ここにコピーした公開鍵の文字列を貼り付け" >> ~/.ssh/authorized_keys

設定は以上で終了です。

動作確認

ssh クライアント側と ssh サーバ側の設定が終わったので動作確認です。

“ssh”コマンドで”-i” で作成した鍵(秘密鍵)を指定します。

Windows Terminal
PS> ssh -i .ssh\id_ecdsa_sk <username>@<XXX.XXX.XXX.XXX>
Enter passphrase for key '.ssh\id_ecdsa_sk':

→パスフレーズを入力

ポップアップでパスキーの選択が求められますので”セキュリティ キー”をクリックします。

タッチします。

Alibaba Cloud 上の仮想マシンの Ubuntu にログインできました。

Windows Terminal
PS> ssh -i .ssh\id_ecdsa_sk XXXXX@XXX.XXX.XXX.XXXX
Enter passphrase for key '.ssh\id_ecdsa_sk':
Confirm user presence for key ECDSA-SK SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
User presence confirmed
Welcome to Ubuntu 26.04.1 LTS (GNU/Linux 7.0.0-31-generic x86_64)

 * Documentation:  https://docs.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Sat Oct 31 09:55:37 PM CST 2026

  System load:  0.07               Processes:             134
  Usage of /:   19.2% of 39.01GB   Users logged in:       0
  Memory usage: 44%                IPv4 address for eth0: XXX.XXX.XXX.XXX
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

4 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm



Welcome to Alibaba Cloud Elastic Compute Service !

Last login: Sat Oct 31 21:42:27 2026 from 221.27.0.207
xxxxx@bigriver3:~#

まとめ

手順は割愛しますが、以下も実施しています。 この結果、このブログをホストしている Alibaba Cloud 上の Ubuntu には物理のセキュリティキー無ではSSHログインは出来ない状態となりセキュリティを強化することができました。 また、Google と Yubico の2つのキーで冗長化も行ったのでどちらかのキーを紛失しても大丈夫です。 まあ、Alibaba Cloud 上の仮想マシンなので2つ同時に紛失しても強制的にリセットすることも可能です。

  • 既存の公開鍵の削除 (これまで使っていた秘密鍵のペアの公開鍵)
  • 2つ目のセキュリティキーの登録 (1つ目はGoogle Titan Security Key 、2つ目としてSecurity Key NFC by Yubico)

また、実際に作業を行う際にはサーバへのSSH以外のログイン手段を確保して進めることをお勧めします。 もし、SSHでしかログインする手段がない場合は慎重に慎重に作業を行いましょう。  Alibaba Cloudもそうですが、AzureもAWSもログイン手段を強制的にリセットしたり、クラウドのWeb画面からサーバのコンソールへGUIやCUIで接続できる手段は提供されているのでこの作業を行う際にはそれらの接続が行えることを事前に確認し、また、作業を行う際も接続は張りっぱなしで行うと万が一の時にも簡単にリカバリできると思います。

これまでは公開鍵認証そしてパスフレーズ無で運用してきたので、それに比べると劇的にセキュリティ強度は高くなります。パスフレーズ無の秘密鍵を盗まれたら簡単に接続できる状態でした。もちろん、Ubuntu への接続にはIPアドレス制限もあるし、鍵を保存している箇所も暗号化していたり、SSHクライアントとなる Windows には Microsoft Defender for Endpoint P2 を導入し、自宅環境としては通常の企業並みの防御力を備えていたつもりでした。

しかし、通常の企業の防御力ではいつ突破されても仕方ないといえるのが最近の状況。 これまでは自宅のNWは侵入されない前提での接続元IPアドレス制限、仮に侵入されてもDefender for Endpoint P2入ったPCには滅多に侵入されない前提でパスフレーズ無だったのだけれど、まさにゼロトラスト、何も信用しないということで出来る限りのセキュリティ強化を行うことができたとは思います。

以上