🔑

OIDCを活用した鍵管理不要なSSH「opkssh (OpenPubkey SSH)」の紹介

に公開

概要

Cloudflareから大変興味深いブログが出てきました。

https://blog.cloudflare.com/open-sourcing-openpubkey-ssh-opkssh-integrating-single-sign-on-with-ssh

内容を要約すると、OpenID Connect(OIDC)などのシングルサインオン(SSO)技術を活用し、SSH鍵管理の手間やセキュリティリスクを解消することを目的としたプロダクト opkssh を公開したとのことです。

https://github.com/openpubkey/opkssh

SSH認証は従来だとパスワード認証 or 公開鍵認証の2択でしたが、パスワード認証はセキュリティ的に強度が低く、公開鍵認証もクライアントはSSH鍵の生成と漏洩や紛失しないように管理の必要があり、サーバー側は公開鍵の登録と管理といった作業をしなければならず、煩雑で鍵の管理にも気を付ける必要がありました。
そこでopksshはOIDCを活用することで、ユーザー認証時に一時的なSSH鍵を自動生成しSSHできるようにしてくれます!
めっちゃ求めていたやつ😍

と言っても文字より動画を見たほうがわかりやすいと思うので、ブログから引用します。

demo
Open-sourcing OpenPubkey SSH (OPKSSH): integrating single sign-on with SSH
より

動画を見てると、最初はパスワードを求められていましたが、Googleログインすることでパスワードを入力せずにログインできるようになっています!

使い方

サーバー

  1. opkssh のインストール

    wget -qO- "https://raw.githubusercontent.com/openpubkey/opkssh/main/scripts/install-linux.sh" | sudo bash
    
  2. ユーザーの登録

    opkssh add user example@gmail.com google
    
    • user はログインする人のサーバー側のユーザー名
    • example@gmail.com はログインする人のGoogleアカウントに登録しているメールアドレス
    • google はログイン時に使用するプロバイダーの指定
      • 他にも執筆時点で Microsoft/Azure と Gitlab が使えるみたいです

これでサーバー側の準備はOKです!簡単!

クライアント

  1. opkssh のインストール

  2. ログイン

    opkssh login
    
    • コマンドを叩くと http://127.0.0.1:65102/chooser にサーバーが立ち上がります。
      chooser
    • サーバー側で設定したプロバイダーを選択して認証します
    • 認証に成功すると You may now close this window と表示されます
  3. ssh

    あとはいつも通りにsshをします

    ssh user@192.168.1.2
    

    するとパスワード入力せず、公開鍵登録もしていないのにログインできました!便利!

仕組み

詳しくはブログを参照して頂きたいのですが、気になったので簡単に仕組みを解説します。

works
https://blog.cloudflare.com/open-sourcing-openpubkey-ssh-opkssh-integrating-single-sign-on-with-ssh/#how-it-works より

クライアント

  1. ログインプロセス
    Aliceは opkssh login を実行
    これにより一時的(デフォルトでは24時間有効)なSSH公開鍵と秘密鍵を自動生成し、ブラウザでSSOプロセス(例えば Google認証) を開始。

  2. PK Tokenの取得
    認証が成功するとOpenPubkeyプロトコルにより、ユーザーの一時的な公開鍵とメールアドレスなどのID情報を含むPK Tokenが発行される。
    このPK Tokenは「この公開鍵は認証済みのAliceのものである」という証明として機能するもので、SSH公開鍵の証明書拡張フィールドに埋め込まれ、通常のSSHプロトコル内でサーバーに送信される。

サーバー

  1. SSHサーバーの設定変更
    SSH サーバーは、AuthorizedKeysCommandという機能を使い、OpenPubkeyの検証プログラムを呼び出すように以下のような設定がされる。
    この設定により、サーバは受信したSSH公開鍵ファイルを、OpenPubkey verifierというカスタムプログラムに渡して認証の判断を行う。

    AuthorizedKeysCommand /usr/local/bin/opkssh verify %u %k %t
    AuthorizedKeysCommandUser root
    
  2. PK Token の検証プロセス

    • トークンの有効性: PK Tokenが期限切れでなく、正しく署名されているかどうかを確認する。ここで署名は、信頼できる認証プロバイダによって行われている必要がある。
    • 公開鍵の一致: SSH公開鍵ファイルに記載されている公開鍵と、PK Token内に含まれる公開鍵が一致しているかどうかを確認する。これにより、実際にセッションを保護している公開鍵が正当なものかが検証される。
    • ユーザーの認可: PK Tokenから抽出されたメールアドレスに基づき、そのユーザーがサーバへのアクセス権限を持っているかどうかを確認する。

つまり、裏で一時的なSSH公開鍵を生成してSSHするときに一緒に送って検証するって流れみたいです。
OIDCもSSHもフォーマットを壊すことなく拡張をしてうまいことやってるなーて思いました。

余談

OpenPubkeyを初めて聞いたので軽く調べたのですが、OIDCを拡張したプロトコルのようです。
OIDCをそのまま署名等に活用はできないので、ユーザーが生成した暗号署名を追加してIDと公開鍵を関連付けられるようにしたものらしいです。
ただ拡張によってプライバシー上の懸念が生じるとのことで、なかなか難しいですね。

それと、SSHがこうなるとPGP署名も同じようにやりたいところですが、今のところOpenPubkeyではサポートされてなさそうです。
あまり調べていないんですが、軽くLLMに聞いたら「現状のOpenPubkeyはPGP署名にそのまま活用するようには設計されていません」と言われたので難しいのかもです。

ただ、gitsignという別プロジェクトがあったりします。
これは数年前に話題になったsigstoreをPGP署名に応用したものです。
こちらも opkssh みたいにGoogleログイン等で署名できるものになります。
ただこれを使ってもGitHubでサポートされていないので Unverified と言われてします😢

gitsign

既存の仕組みで動いていないので仕方ないのですが、issuesを見ててもあんまり動きがないのでうーん

早くSSHもPGPもキーレスで生きたいものです🚀

参考文献

https://blog.cloudflare.com/open-sourcing-openpubkey-ssh-opkssh-integrating-single-sign-on-with-ssh
https://www.supinf.co.jp/tech-blog/details/about-openpubkey
https://blog.sigstore.dev/openpubkey-and-sigstore
https://zenn.dev/ultrasupara/scraps/9a5b42733772a1
https://atmarkit.itmedia.co.jp/ait/articles/2310/26/news056.html

GitHubで編集を提案

Discussion