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