セキュリティキー「YubiKey」でEC2へのSSHを2段階認証にしてみた

EC2 Ubuntu Server 20.04にFIDO U2F準拠なセキュリティキーYubiKeyを使って2段階認証SSHしてみた
2020.05.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

OpenSSHのFIDO U2F対応について

FIDO U2Fはパスワードレスに認証するための規格です。実装したデバイスとしてYubikeyなどがあり、デバイスをUSBポートに挿して触れるだけ認証されます。

2020年2月にリリースされたOpenSSH 8.2ではこのFIDO U2Fを利用したハードウェア認証に対応しました。

本機能を利用すると、通常の公開鍵認証に追加して、FIDO U2F認証を利用した2段階認証を実現できます。仮に秘密鍵が漏洩しても、鍵の生成に利用したデバイスがない限りSSHログインできません。

やってみた

FIDO U2FデバイスのYubiKeyを利用し、Ubuntu Server 20.04のEC2インスタンスに対して2段階認証でSSHしてみます。

動作環境

OpenSSH 8.2以上のサーバー・クライアントとFIDO/U2Fに対応したデバイスが必要です。

今回は、サーバーにはデフォルトでOpenSSH 8.2に対応したUbuntu 20.04を利用し、クライアントにはbrewで最新版をインストールできるMacを利用しました。

また、FIDO/U2F デバイスには、手元にあった Security Key by Yubico USB-A を利用しました。

鍵の生成

FIDO/U2Fの2段階認証向けに新しい公開鍵タイプ

  • ecdsa-sk
  • ed25519-sk

が追加されています(ともに楕円曲線DSA。skはsecurity keyの略)。ssh-keygenの鍵生成時に、この鍵タイプを指定し、デバイスを一度タッチします。

$ ssh-keygen -t ecdsa-sk -f ~/.ssh/id_ecdsa_sk
Generating public/private ecdsa-sk key pair.
You may need to touch your authenticator to authorize key generation.

★ここでデバイスをタッチ★

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/jsmith/.ssh/id_ecdsa_sk
Your public key has been saved in /Users/jsmith/.ssh/id_ecdsa_sk.pub
The key fingerprint is:
SHA256:... jsmith@BAR
The key's randomart image is:
+-[ECDSA-SK 256]--+
|  .o..oo         |
|. .oo. ..        |
|o=.. o.          |
|BoO + .o         |
|+X + o. S        |
|o=o.. ...o       |
|+E* .o.+o .      |
|.o =  =+.        |
|  o .o oo        |
+----[SHA256]-----+
  • 秘密鍵 : id_ecdsa_sk
  • 公開鍵 : id_ecdsa_sk.pub

が生成されます。

Ubuntu 20.04のEC2インスタンスを起動

クイックスタート一覧に Ubuntu Server 20.04 LTS が含まれているので、そちらを起動します。

公開鍵をログインサーバーに展開

公開鍵(id_ecdsa_sk.pub)をログインサーバーの $HOME/.ssh/authorized_keys に追記します。

~/.ssh/authorized_keys

ssh-rsa ...
sk-ecdsa-sha2-nistp256@openssh.com ... ← 追加

SSH実行

秘密鍵(id_ecdsa_sk)を指定してSSHします。

"Confirm user presence for key ECDSA-SK SHA256:..." とFIDO/U2F 認証をもとめられるので、デバイスをタッチします。

$ ssh -i $HOME/.ssh/id_ecdsa_sk ubuntu@XXX.compute.amazonaws.com
Confirm user presence for key ECDSA-SK SHA256:...  

★ここでデバイスをタッチ★

Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.4.0-1009-aws x86_64)
...
ubuntu@ip-172-31-35-110:~$

無事ログインできました。

対応する SSH ログを確認します。

/var/log/auth.log

May 24 10:32:09 ip-172-31-35-110 sshd[1320]: Accepted publickey for ubuntu from 1.2.3.4 port 62739 ssh2: ECDSA-SK SHA256:...
May 24 10:32:09 ip-172-31-35-110 sshd[1320]: pam_unix(sshd:session): session opened for user ubuntu by (uid=0)
May 24 10:32:09 ip-172-31-35-110 systemd-logind[529]: New session 3 of user ubuntu.

"ssh2: ECDSA-SK SHA256:" から、ECDSA-SK の鍵で認証したことがわかります。

最後に

SSHログインのセキュリティを強化するための手段として、2段階認証は非常に有効です。

OSSを活用した実装として、Google Authenticatorと連携し、ワンタイムパスワードを用いて2段階認証することも可能ですが、構築が少し複雑でした。

今回紹介したFIDO U2Fを利用した2段階認証ではOpenSSHの機能しか利用しないため、構築・管理が非常にシンプルになります。

ただし

  • サーバー・クライアントともに、最新の OpenSSH 8.2 以上が必要
  • FIDO/U2Fデバイスが必要

という点にはお気をつけください。

Ubuntu 20.04は初期状態からOpenSSH 8.2がインストールされているので、動作検証におすすめです。

それでは。

参考