SSHの認証に物理セキュリティキー&認証局を用いて一時的な鍵を生成する方法とは?
世界中で利用されているリモートでサーバー操作を行うソフトウェア「OpenSSH」は、認証方式として公開鍵認証を用いるのが一般的ですが、認証局による認証を行うことも可能です。エンジニアのCarl Tashian氏が、認証局の秘密鍵に物理セキュリティキーを用いることで、高いセキュリティを維持して一時的な鍵の生成を行う方法を説明しています。
SSH Emergency Access
https://smallstep.com/blog/ssh-emergency-access/
今回説明されているSSHの認証方法は、通常の認証方式である「公開鍵をホストのauthorized_keysに登録し、クライアントから秘密鍵を用いて認証を行う」のではなく、「認証局を作成してサーバー側で信頼し、認証局による署名が行われた秘密鍵で認証を行う」というもの。認証局の署名時に有効期限などを設定することで、一時的な秘密鍵の生成が可能になります。
認証局によるSSH認証を行うために準備すべきものは以下。
・レジデントキーに対応した物理セキュリティキー
・物理セキュリティキーを格納する安全な場所
・OpenSSH バージョン8.2以上
YubiKey 5シリーズはレジデントキーに対応しており、今回の方法で利用できるとのこと。
iPhoneに物理的に挿入するだけで二段階認証が可能なセキュリティトークン「YubiKey 5Ci」 - GIGAZINE
具体的なセットアップについて、Tashian氏は以下のように説明しています。まずは鍵タイプにOpenSSH 8.2で追加された「ecdsa-sk」を指定し、ssh-keygenコマンドで認証局の鍵ペアを作成します。コマンド実行後、認証局をサーバーで承認するために必要な公開鍵「sk-user-ca.pub」と、セキュリティキーにインストールされた認証局の秘密鍵を操作するための「sk-user-ca」が生成されるとのこと。
ssh-keygen -t ecdsa-sk -f sk-user-ca -O resident -C [セキュリティキーのID]
続いてサーバーの設定ファイル「/etc/ssh/sshd_config」に以下の記述を追記し、「/etc/ssh/ca.pub」に登録されている認証局をサーバー側で信頼するように設定。「/etc/ssh/ca.pub」には先ほど生成した「sk-user-ca.pub」の内容を追記しておきます。
TrustedUserCAKeys /etc/ssh/ca.pub
設定が完了したらSSHサーバーを再起動し、設定を反映します。これで認証局の署名が行われた暗号鍵を用いれば、クライアントからSSH接続ができるようになります。
systemctl sshd restart
続いてSSHクライアント側で利用する鍵ペアを作成します。
ssh-keygen -t ecdsa -f emergency
作成した鍵ペアのうち、秘密鍵に対して認証局の秘密鍵による署名を行います。以下のコマンドでは、サーバー上の「ubuntu」というユーザーに前後10分間だけアクセスできるよう期限を設定しています。
ssh-keygen -s sk-user-ca -I test-key -n ubuntu -V -5m:+5m emergency
あとはsshコマンドで署名済みの秘密鍵を指定すれば、SSH接続を行うことができます。SSH認証の鍵を共有したい場合は「emergency」ファイルと証明書となる「emergency-cert.pub」を相手に送付すればOK。
ssh -i emergency ubuntu@my-hostname
Tashian氏が説明している方法ではセキュリティ向上のために物理セキュリティキーを利用していますが、認証局の鍵タイプに「ecdsa」などを指定すれば、認証局によるSSH認証を行うこと自体は可能です。
・関連記事
SSHのポート番号が「22」に決まった経緯を開発者のTatu Ylonen氏が公開 - GIGAZINE
物理セキュリティキーの「YubiKey」でついに生体認証が可能となることが判明 - GIGAZINE
Googleの安全な2段階認証を構築し不正アクセスを防ぐ物理キー「Titan セキュリティ キー」使用レビュー - GIGAZINE
Googleがセキュリティキーを自作可能になるオープンソースプロジェクト「OpenSK」を開始 - GIGAZINE
SSHの公開鍵暗号には「RSA」「DSA」「ECDSA」「EdDSA」のどれを使えばよいのか? - GIGAZINE
・関連コンテンツ