ssh の やり取りをちょっと詳しく

ssh の やり取りの流れを大まかにつかんでおきたいということで
メモを取っておきたいと思います

まず、トランスポート層で鍵交換を行います。

SSH_MSG_KEXINIT パケットをお互い送りあって、
うまいことお互いの共通鍵を作ります。

Diffie-Hellman鍵交換という仕組みを使います。
これは、交換に必要なデータを平文で流しても、
共通鍵を知られないという。
離散対数問題の平文として流れるデータから、
共通鍵を推測することが難しいことを利用します。

その鍵を使いトランスポート層を暗号化します。
例えばパスワード認証なら、
packet length
padding length
payload
padding
を暗号化し、
payload の 1byte目を SSH_MSG_USERAUTH_REQUEST とし、
送信します。

サーバはトランスポート層自体を復号化し、
payloadのSSH_MSG_SERVICE_REQUESTを読み取り、
何のリクエストかチェックし、それがユーザ認証要求であると解釈し、
そのレスポンスを暗号化し、クライアントに向けて送信します。

認証が正常に終了すると、
仮想的な複数のチャネルの生成をクライアントが要求し、サーバが応答しやり取りが開始されます。
チャネルは暗号化されたアプリケーション層に『recipient channel』というデータを送受信し、
ひとつの接続でftpのポート20番と21番の関係のようなやり取りを、ひとつのポートで実現します。
ターミナルなどはひとつのチャネルで動作します。

以上がsshにおける大まかなやり取りです。