以下の一連のイベントにより2つのホスト間のSSH通信の一貫性を 保護する援助をします。
暗号化したハンドシェークがなされてクライアントは正しいサーバーと 通信していることを証明できます。
クライアントとリモートホスト間の接続上のトランスポート層は対称暗号を使って暗号化されます。
クライアントが自分自身をサーバーに対して認証します。
リモートクライアントは、暗号化した接続を介してリモートホストと安全に交流ができます。
トランスポート層のおもな役割は、 認証時と認証後の通信時に2つのホスト間で安全な通信を確立することです。 トランスポート層は、データの暗号化と解読を処理して、 データパケットを送受信する際に一貫性を確保することによってこれを実現します。 さらに、トランスポート層は、圧縮も提供できるため、 情報の転送をスピードアップします。
SSHクライアントがサーバーと通信すると、2つのシステムがトランスポート層を正しく構築できるように、 鍵となる情報が交換されます。この交換の間、以下のステップが実行されます。
鍵の交換をする
公開鍵暗号化アルゴリズムを決定する
対称暗号化アルゴリズムを決定する
メッセージ認証アルゴリズムを決定する
ハッシュアルゴリズムを決定する
鍵を交換する際、サーバーは独自のホスト鍵を使ってクライアントに自分自身を証明します。 このクライアントが以前にこの特定のサーバーと1度も通信したことがないと、 クライアントはサーバーの鍵を知りませんので、 接続はできません。 OpenSSHは、ユーザーが通知を受け新しいホスト鍵の受理を確認した後に、 サーバーのホスト鍵を承認することでこの問題を処理しています。 次回からの接続では、サーバーのホスト鍵と、 クライアントに保存されているバージョンを突き合わせることができるため、 クライアントが本当に目的のサーバーと通信していることを証明できます。 それ以降、ホスト鍵が適合しなくなった場合、 接続が発生する前にユーザーはクライアントに保存されているバージョンを削除する必要があります。
![]() | 注意 |
---|---|
ローカルシステムは目的のサーバーと侵入者がセットアップした偽りのサーバーとの違いがわからないので、 最初に接続した時点で、侵入者がSSHサーバーを偽装することが可能です。 これを防ぐには、最初に接続する前に、またはホスト鍵が不適合になった時点でサーバー管理者に連絡を取り、 新しいSSHサーバーの一貫性を確かめます。 |
SSHは、ほとんどすべての種類の公開鍵アルゴリズムやエンコーディング形式を使用できるように作られています。 最初の鍵交換で交換用に使用するハッシュ値と共有秘密値を生成した後、 2つのシステムは直ちに新しい鍵とアルゴリズムの計算を開始し、 この接続を介して送信される認証やデータを保護します。
特定の鍵とアルゴリズムを使ってある程度のデータを送信すると(正確な量はSSHの実装に依存します)、 別の鍵交換が起こり、また別のハッシュ値と新しい共有秘密値のセットを生成します。 このため、仮に侵入者がハッシュ値と共有秘密値を解読できたとしても、 その情報は限定された時間だけしか役に立ちません。
トランスポート層が、2つのシステム間で情報の受け渡しを行うための安全なトンネルを作成し終わると、 サーバーは、秘密鍵でエンコードした署名の使用や、パスワードの入力などのサポートされている 各種の認証方法をクライアントに伝えます。クライアントは、サポートされている方法の1つを使って、 サーバーに対し自分自身を認証します。
SSHサーバーとクライアントは、さまざまなタイプの認証をサポートするように構成でき、 その認証方法は、 各側で最適に制御することができます。 サーバーは、そのセキュリティモデルに基づいてどの暗号化方法をサポートするかを指定することができ、 クライアントは、利用できるオプションの中から、認証方法を試行する順序を選ぶことができます。 SSHトランスポート層の安全性という性質のおかげで、 ホストとパスワードベースの認証など、 一見安全性に欠けるような認証方法でも安心して使用することができます。
SSHトランスポート層で認証が正常終了すると、 マルチプレキシングと呼ばれる技術により 複数のチャンネルが開きます[1]。 これらのチャンネルで、各種の端末セッション用と送信されたX11セッション用の通信が処理されます。
クライアントとサーバーは両方とも新しいチャンネルを作成できます。各チャンネルには、それぞれの側で 別々の番号が割り当てられます。クライアントが新しいチャンネルを開こうとする場合、クライアントは そのチャンネル番号を要求と一緒に送ります。この番号情報は、サーバーに格納されており、そのチャンネルの 通信方向決定に使用されます。この目的は、さまざまなタイプのセッションが互いに影響しないようにすることであり、 1つのセッションが終了した時点で、そのチャンネルは、基本SSH接続を切断することなく閉じることができます。
チャンネルは、データを順序正しく送受信できる、フロー制御もサポートしています。このように、チャンネル上でのデータ送信は、チャンネルが開いたというメッセージをホストが受け取るまで開始されません。
クライアントとサーバーは、クライアントが要求するサービスやユーザーがネットワークに接続した方法に依存する、各チャンネルの特徴を自動的にネゴシエートします。このことは、プロトコルの基本的な構造を変更すること無しに、異なるタイプのリモート接続を扱う大きな自由度をもたらします。
[1] | マルチプレクス接続は、共有の共通媒体を介して送信される複数の信号から成り立ちます。 SSHでは、共通の安全な接続を介して各種チャンネルが送信されます |