YubiKey内の秘密鍵を利用してリモートサーバーにSSH接続する

f:id:pentiotech:20201102125249p:plain

こんにちは、OneLogin担当の川野です。今回はYubiKey5シリーズを利用してYubiKey内に鍵ペアを生成し、それを用いてSSH認証を実現します。SSH認証に秘密鍵を用いることで、より認証を強固にすることはよく知られていますが、YubiKeyを使用することで更に頑丈な認証を実現することができます。秘密鍵をYubiKey内に作成、格納することで物理的にYubiKeyを挿入しない限り、認証を通過しないようにすることが可能です。

目次

  • 準備するもの
  • 手順
    • YubiKeyで秘密鍵を作成する
      • YubiKey Managerを利用する場合
      • YubiKey PIV Manager(YubiKey Managerの旧バージョン)を利用する場合
    • OpenSCをインストールする
    • 公開鍵をサーバーに登録する
    • クライアントユーザーでログインする

準備するもの

  • YubiKey(今回は5シリーズを使用)
  • SSH認証用Linuxサーバー(本記事はCentOS7 を使用しています)

手順

YubiKeyで秘密鍵を作成する


・YubiKey Managerを使用する場合
まずはYubiKeyを管理するためのツールであるYubiKey Managerを以下サイトからインストールします。 developers.yubico.com
Applicationsタブから[PIV]をクリックします。

f:id:kawanohate:20200925112340p:plain
YubiKey Manager ホーム画面

中央の[Configure Certificates]をクリックします。
f:id:kawanohate:20200925112505p:plain
YubiKey Manger PIV画面

証明書画面へ移動するのでAuthenticationタブ上で右下の[Generate]をクリックします。
f:id:kawanohate:20200925112632p:plain
YubiKey Manger 鍵生成

Self-signed Certificateにチェックを入れて[Next]をクリックします。
f:id:kawanohate:20200925114609p:plain
証明書署名形式設定画面

鍵暗合方式をRSA2048に設定して[Next]をクリックします。
f:id:kawanohate:20200925114701p:plain
鍵暗合方式設定画面

設定したい鍵の名前を入力して[Next]をクリックします。
f:id:kawanohate:20200925114817p:plain
鍵名設定画面

鍵の有効期限を設定して[Next]をクリックします。
f:id:kawanohate:20200925114903p:plain
証明書有効期限設定画面

最後に内容を確認して[Generate]をクリックします。
f:id:kawanohate:20200925115002p:plain
証明書内容確認画面

PINを求められるので入力してメモ帳などに控えておきましょう。
f:id:kawanohate:20200925115103p:plain
PIN入力画面
以上でYubiKey内に鍵を生成することができました。


・YubiKey PIV Manager'(YubiKey Managerの旧バージョン)を利用する場合

インストールができたら起動し、YubiKeyを差し込みます。正常に動作すると以下のような画面が表示されます。(すでにYubiKey内に証明書がある場合)
証明書画面へ移動するため[Certificates]をクリックします

f:id:kawanohate:20200923152740p:plain
YubiKey PIV Manager 初期画面

次にYubiKey内に秘密鍵を作成します。Authenticationタブで[Generate new key]をクリックします。

f:id:kawanohate:20200923154105p:plain
秘密鍵の生成画面
証明書の詳細情報を入力して右下の[ OK ]をクリックします。PINを求められるので入力してメモ帳などに控えておきましょう。
f:id:kawanohate:20200923153755p:plain
証明書の詳細設定画面

OpenSCをインストールする


OpenSCとは様々な物理デバイスとソフトウェアをつなぐことができるオープンソースです。今回の場合、OpenSCがYubiKeyとローカルOSを繋ぎ、鍵ペアの情報を伝えることで認証を実現することができます。
以下サイトのPKCS#11から、お使いのOSに対応したOpenSCをインストールしてください。

www.pentio.com

公開鍵をサーバーに登録する


正常にOpenSCがインストールされていればYubiKey内の公開鍵を取り出すことができます。ローカルで以下のコマンドを実行します。

ssh-keygen -D /usr/local/opt/opensc/lib/opensc-pkcs11.so

f:id:kawanohate:20200923160032p:plain
公開鍵の出力
これをLinuxサーバーに転送する必要があるので、一度 id_rsa.pubと名前を付けたファイルに出力します。

ssh-keygen -D /usr/local/opt/opensc/lib/opensc-pkcs11.so >> id_rsa.pub



これをサーバーに転送します。

scp -i {サーバー認証用の既存の秘密鍵} {id_rsa.pubのパス} {転送したいサーバー内のパス}



転送した id_rsa.pubをその鍵を利用したいユーザーディレクトリの所定の場所へコピーする必要があります。今回はcentosユーザーに鍵を適用します。Linuxサーバーにログインし、以下コマンドを実行します。

cat id_rsa.pub >> /home/centos/.ssh/authorized_keys



書き込むことができたか以下コマンドで確認します。

cat /home/centos/.ssh/authorized_keys

クライアントユーザーでログインする

ローカルから作成した秘密鍵を利用してSSHログインします。

ssh -I /usr/local/opt/opensc/lib/opensc-pkcs11.so {ユーザー名}@{サーバーのIP}

秘密鍵のPINを求められるので作成した時に設定したPINを入力します。 正常にログインできれば認証は完了です。

f:id:kawanohate:20200923165835p:plain
SSH認証の成功例

まとめ

YubiKeyの中に秘密鍵を格納することで安全にリモートサーバにSSHする方法を説明しました。YubiKey Managerを使うと簡単にYubiKey内に秘密鍵の生成ができることが確認できました。

秘密鍵の管理が煩雑になっている場合にはYubiKeyを使ってみてはいかがでしょうか?