SSHセキュリティの層

SSHプロトコルを使用することで、このプロトコルの仕様に合わせて作成されたクライアントプログラムやサーバープログラムは安全に通信し合い、相互に使用し合うことができます。

現在、SSHには2つのバージョンがあります。SSHバージョン1には、特許権付き暗号化アルゴリズム(ただし、これらの特許権の一部は期限切れになっています)と、データストリームへのデータの挿入を認めるセキュリティホールが含まれています。できる限り、SSHバージョン2対応のサーバーとクライアントを使用すべきでしょう。

OpenSSHには、バージョン1と2の両方のサポートが含まれています。OpenSSLの暗号化ライブラリと組み合せることで、OpenSSHは広い範囲のセキュリティ機能を提供します。

SSHプロトコルは、バージョン1、2とも、同じセキュリティ層を使用して、さまざまな角度から通信の整合性を強化しています。各層が提供する保護タイプはそれぞれ異なるので、他の層と一緒に使用することで、通信のセキュリティ全体が強化され、使いやすくなります。

トランスポート層

トランスポート層のおもな役割は、認証時と認証後に2つのホスト間で安全な通信を確立することです。通常、TCP/IPの上で実行されているトランスポート層は、データの暗号化と復号を処理して、サーバーが認証に適正なマシンであることを確認し、データパケットを送受信する際に整合性を確保することによってこれを実現します。さらに、トランスポート層は、データの圧縮も提供できるため、情報の転送を効率よくスピードアップすることができます。

クライアントがSSHプロトコルを使用してサーバーと通信すると、2つのシステムがトランスポート層を正しく構築できるように、いくつかの重要なポイントのネゴシエーションが実行されます。

鍵を交換する際、サーバーはホスト鍵を使ってクライアントに自分自身を証明しなければいけません。もちろん、このクライアントが以前にこの特定のサーバーと1度も通信したことがないと、クライアントはサーバーの鍵を知りません。OpenSSHは、初めてSSH接続が発生したときにクライアントがサーバーのホスト鍵を受け取れるようにすることで、この問題を処理しています。これで、次回からの接続で、サーバーのホスト鍵と、クライアントに保存されているバージョンを突き合わせることができるため、クライアントが本当に目的のサーバーと通信していることを証明できます。

注意重要
 

OpenSSHで使用するホスト鍵の検証方法は、完全ではありません。最初に接続した時点では、ローカルシステムは必ずしも目的のサーバーと侵入者との違いがわからないので、侵入者がサーバーのふりをしているかもしれません。しかし、優れたホスト鍵の配布手段が普及するまで、この初期的な安全性に欠ける方法でも、ないよりはましでしょう。

SSHは、ほとんどすべての種類の公開鍵アルゴリズムやエンコーディング形式を使用できるように作られています。最初の鍵交換で2つの値(交換に使用するハッシュ値と共用秘密値)が作成されると、2つのシステムは、認証と、この接続を介して送信されるデータの保護を行うために、新しい鍵とアルゴリズムの計算をただちに開始します。

認証

トランスポート層が、2つのシステム間で情報の受け渡しを行うための安全なトンネルを作成し終わると、サーバーは、秘密鍵でエンコードした署名を使用したり、パスワードを入力したりして、サポートされている各種の認証方法をクライアントに伝えます。クライアントは、サポートされている方法を使って、サーバーに対し自分自身を認証します。

サーバーは、さまざまなタイプの認証をサポートするように構成できるため、認証方法は、サーバー、クライアントの各側で最適に制御することができます。サーバーは、セキュリティモデルに基づいて、どの暗号化方法をサポートするかを指定することができ、クライアントは、利用できるオプションの中から、認証方法を試行する順序を選ぶことができます。SSHプロトコル層の安全性という性質のおかげで、ホストベースの認証など、安全性に欠けるような認証方法でも安心して使用することができます。

SSHを必要とする場合は、一般的に、パスワードを使用して認証します。他のセキュリティ認証スキームと異なり、パスワードは平文でサーバーに転送されます。ただし、トランスポート層を通るときにパスワード全体が暗号化されるので、どのようなネットワークでも安心して送信することができます。

接続

SSHトランスポート層で認証が正常終了すると、2つのシステム間の単一接続をマルチプレキシングすることにより、複数のチャンネルが開きます[1]。これらのチャンネルにより、X11情報が転送される各種の端末セッションなど、SSH接続を使用する必要がある個々のサービス通信がそれぞれ別々に処理されます。

クライアントとサーバーは両方とも新しいチャンネルを作成できます。各チャンネルには、それぞれの側で別々の番号が割り当てられます。一方の側が新しいチャンネルを開こうとすると、そのチャンネル番号が要求と一緒に送られます。この番号情報は、相手側に格納され、特定のサービスタイプの通信をそのチャンネルに送る場合に使用されます。この目的は、さまざまなタイプのセッションが互いに影響しないようにすることにあり、チャンネルは、2つのシステム間の基本SSH接続を切断することなく閉じることができます。

チャンネルは、データを順序正しく送受信できる、フロー制御もサポートしています。このように、チャンネル上でのデータ送信は、チャンネルが受け取る準備ができたというメッセージをホストが受け取るまで開始されません。

チャンネルは、SSHでは、X11フォワーディングやTCP/IPポートフォワーディングで特に役立ちます。個々のチャンネルを別々に設定して、異なる最大サイズを使用したり、特定のタイプのデータを転送したりすることができます。これにより、SSHは、プロトコルの基本インフラストラクチャを変更することなく、公衆網や高速LANリンクでのダイヤルアップなど、さまざまなタイプのリモート接続に柔軟に対応することができます。クライアントとサーバーは、SSH接続内で自動的に各チャンネルの設定をネゴシエートします。

注意

[1]

マルチプレクス接続は、共有の共通媒体を介して送信される複数の信号から成り立ちます。SSHでは、共通の安全な接続を介して各種チャンネルが送信されます。