Ubuntu Weekly Recipe

第620回 Ubuntu 20.04 LTSでU2F/FIDOデバイスを使ったSSHの2要素認証を試す

この記事を読むのに必要な時間:およそ 3 分

Ubuntu 20.04 LTSでは,OpenSSHサーバーのバージョンが8.2にアップデートされました。このバージョンではU2F/FIDOハードウェアデバイスのサポートが追加されており,ハードウェアベースの2要素認証が簡単に行えます。今回は比較的安価に入手できるYubiKeyのSecurity Key by Yubico※1を使い,SSHログインに2要素認証を導入する方法を紹介します。

※1
YubiKeyには様々なモデルが存在しますが,SSHログインのみを行う場合はU2F/FIDOにのみ対応していれば問題ありません。YubiKeyの上位モデルではワンタイムパスワードやOpenPGPなどにも対応していますが,これらの機能は利用しません。

U2F/FIDOとは

FIDO(ファイド)とはFast IDentity Onlineの略で,⁠使いやすさ」⁠プライバシーとセキュリティ」⁠標準化」の3つを核とした,パスワードにかわる新しい認証規格です。FIDOはGoogleやAmazonといった企業も参加している「FIDOアライアンス」によって標準化されています。

U2Fは※2Universal 2nd Factorの略で,FIDOによって公開されているプロトコルのひとつです。簡単に言えば,従来のID/パスワードに追加する2要素認証の,2要素目を標準化しようというものです。一般的に2要素認証には,508回でも紹介したTime-Based One-Time Password(TOTP)を使うケースが多いでしょう。しかしTOTPは,ログインの都度スマホアプリを見てワンタイムパスワードを入力する必要があるなど,運用が面倒くさい点は否定できません。U2Fでは,物理的なセキュリティキーを使って2要素認証を行います。これにより,セキュリティレベルを犠牲にすることなく,認証を簡略化できるのです。

※2
FIDO2において,U2FはCTAP1と呼ばれています。

図1 GitHubに2要素認証の要素としてセキュリティキーを登録した例。サインイン画面でパスワードを入力した後,セキュリティキーを使用するボタンが表示される。なおここで「Enter a two-factor code from your phone」をクリックすると,従来通りワンタイムパスワードの入力による認証も可能となっている

画像

図2 セキュリティキーを使うと,ワンタイムパスワードのかわりに物理キーへのタップ操作を要求される。タップするだけで認証は完了する

画像

ecdsa-sk/ed25519-skの鍵ペアを作成する

それでは実際に,Security Key by Yubicoを使ってSSHサーバーへのログインを行ってみましょう。今回はサーバー版の20.04 LTSを使い,自分自身にSSHログインすることで動作を検証しています。

GitHubなどのWebサービスでは,アカウントにセキュリティキーを登録することで,そのキーでの2要素認証を可能にしています。対してセキュリティキーを用いたSSHログインでは,そのキーに対応した鍵ペアを作成する必要があります。OpenSSH 8.2では,ssh-keygenコマンドの-tオプションで指定できる鍵タイプに「ecdsa-sk」「ed25519-sk」という,ふたつの「-sk」というサフィックスを持つタイプが追加されています。このどちらかを指定して,新しい鍵を作成してください。ここではed25519-skを使用しました。

ssh-keygenコマンドを実行すると,まずキーへのタッチを要求されます※3⁠。その後は鍵を保存するファイル名の指定とパスフレーズの設定という,お馴染みの手順になります。

※3
タッチせずにいると,タイムアウトしてコマンドは終了します。
$ ssh-keygen -t ed25519-sk
Generating public/private ed25519-sk key pair.
You may need to touch your authenticator to authorize key generation.                  ← ここでキーへのタッチを要求される
Enter file in which to save the key (/home/mizuno/.ssh/id_ed25519_sk):                 ← 鍵のファイル名を指定する。
Enter passphrase (empty for no passphrase):                                            ← 秘密鍵のパスフレーズを入力する
Enter same passphrase again:                                                           ← パスフレーズを再入力する
Your identification has been saved in /home/mizuno/.ssh/id_ed25519_sk
Your public key has been saved in /home/mizuno/.ssh/id_ed25519_sk.pub
The key fingerprint is:
SHA256:9w8p7xZ3wdG8KHMlIjfn6pn5lC4BFEVN8/Nc7xgxCCk mizuno@focal
The key's randomart image is:
+[ED25519-SK 256]-+
|         .=+oo ..|
|        Eo.= =ooo|
|        ..o * Bo+|
|         . o + B=|
|        S o = . =|
|         . +..o+.|
|          o O=...|
|           O+o   |
|           o=o.  |
+----[SHA256]-----+

図3 USBに接続した状態のSecurity Key

画像

図4 タッチを要求されている時は,鍵マークが点滅する

画像

なおセキュリティキーがシステムに接続されていない状態で鍵タイプにed25519-skやecdsa-skを指定した場合,ssh-keygenコマンドは即座に終了します。

Security Keyが見つからなかった場合の例

$ ssh-keygen -t ed25519-sk
Generating public/private ed25519-sk key pair.
You may need to touch your authenticator to authorize key generation.
Key enrollment failed: device not found

作成された公開鍵(この例では.ssh/id_ed25519_sk.pub)を,サーバーのauthorized_keysに登録してください。今回はローカルマシン上で検証を行うので,catコマンドで出力してしまえばよいでしょう。

公開鍵をauthorized_keysファイルの末尾に追記する

$ cat ~/.ssh/id_ed25519_sk.pub >> ~/.ssh/authorized_keys 
$ chmod 600 ~/.ssh/authorized_keys 

著者プロフィール

水野源(みずのはじめ)

Ubuntu Japanese Teamメンバー。理想のフリーデスクトップ環境を求めて東へ西へ……のはずが,気がついたら北の大地で就職していたインフラ寄りのエンジニア。最近レンズ沼にハマる。