QUIC for SSH の提案仕様が出たよ

QUIC-based UDP Transport for SSH」という提案が提出されています。

トランスポートプロトコルとしてQUICを利用することで、様々な恩恵を受けることが出来ます。

  • ユーザランドでコネクションが管理されるため、TCPとは異なりOSレイヤのでコネクション切断の影響をうけない
  • IPアドレスが変わっても接続を維持できる(コネクションマイグレーション)
  • 経路上の第三者による切断に耐性がある(QUICでは通信の切断にも鍵が必要)

個人的にも、SSHがQUIC上で動作することで切断しづらくなることを期待しております。

それでは、この仕様についてざっと見ていくことにしましょう。

ただ、まだまだこれから議論がされる提案仕様ですので、設計は大きく変わるでしょう。

QUIC-based UDP Transport for SSH の概要

QUICは内部的にTLSハンドシェイクを行ってコネクションの確立を行うため、SSHの鍵交換の仕組みをそのまま入れ込むことが出来ません。ですので、「QUIC-based UDP Transport for SSH」では、鍵交換だけSSH流のやりかたをし、その鍵を用いてQUICのハンドシェイクが完了した状態からQUICを始めるという少々トリッキーな仕組みになっています。

(なので、SSH over QUICというより、仕様のタイトル通りQUIC for SSHという感じですね)

この仕様では、コネクションを確立するために必要な情報を交換する「SSH_QUIC_INIT」「SSH_QUIC_REPLY 」というメッセージと、通信のキャンセルをする「SSH_QUIC_CANCEL」というメッセージを新しく定義しています。

f:id:ASnoKaze:20200709010023p:plain

SSH_QUIC_INIT」および「SSH_QUIC_REPLY 」は、SSH関連の情報とQUIC関連の情報が含まれます。

SSH関連の情報として、署名アルゴリズム、信用する鍵のフィンガープリント、ECDH用のパラメータ(SSH_MSG_KEX_ECDH_INIT)などが含まれます。

QUIC関連の情報としては、QUICのハンドシェイクが完了した状態とするために、QUICバージョンや暗号スイートが含まれます。

QUICコネクションが確立されると、ストリームID 0上でデータがやりとりされます。

SSH_QUIC_INIT

SSH_QUIC_INITが持つ情報について詳しく見ていきます

  • client-connection-id: QUICのコネクションIDとして使用される
  • client-quic-versions: サポートするQUICバージョンの列挙
  • client-sig-algs: クライアントの署名アルゴリズム
  • trusted-fingerprint: クライアントが信頼する鍵のフィンガープリント
  • client-kex-alg-name: クライアントが対応する鍵交換アルゴリズム
  • client-kex-alg-data: 鍵交換のパラメータ
  • quic-tls-cipher-suite: QUICの暗号スイート対応リスト
  • ext-pair: 拡張領域
  • padding: アンプ攻撃対策のパディング

各種、使用するアルゴリズムは既存のSSHで定義されたもの、暗号スイートはTLSで定義されたものをそのまま使う

SSH_QUIC_REPLY

SSH_QUIC_REPLYが持つ情報について詳しく見ていきます

  • server-connection-id: QUICのコネクションIDとして使用される
  • server-quic-versions: 選択したQUICバージョン
  • server-sig-algs: サーバの署名アルゴリズム
  • server-kex-algs: 選択した鍵交換アルゴリズム
  • quic-tls-cipher-suite: 選択したQUICの暗号スイート
  • ext-pair: 拡張領域
  • server-kex-alg-data: 鍵交換のパラメータ

各種、使用するアルゴリズムは既存のSSHで定義されたもの、暗号スイートはTLSで定義されたものをそのまま使う。

なお、受け取ったSSH_QUIC_INITでは処理ができない場合は、エラーを返すことになる。具体的にはserver-connection-id, server-kex-alg-dataに空を設定し、拡張領域にerr-descというフィールドを設定いしエラー理由を通知する。

QUICコネクションのセットアップ

QUICコネクションについては、先の流れで得られた情報を元にハンドシェイクが完了した状態となります

  • QUICバージョンは選択された通り
  • TLS暗号スイートは選択されたとおり
  • QUICの鍵フェーズは0
  • シェアードシークレットは、SSHの鍵交換されたものから導出される

その他

QUIC Transportパラメータの交換どうするんだ、、?

個人的にはやはり通常通りのQUICハンドシェイクをしたほうが良いのではと思うが、鍵交換部分はどうするのがいいのだろう、、、SSHの鍵交換してTLS PSKに注入するような感じのことが出来る?