第14章 OpenSSH
SSH
(Secure Shell)は、クライアント/サーバーアーキテクチャーを使用する 2 つのシステム間でのセキュアな通信を容易にし、ユーザーがリモートでサーバーホストシステムにログインできるようにするプロトコルです。FTP
、Telnet
、rlogin などの他のリモート通信プロトコルとは異なり、SSH はログインセッションを暗号化するため、侵入者が接続して暗号化されていないパスワードを収集するのが困難になります。
ssh プログラムは、telnet や rsh などのリモートホストへのログインに使用される、旧式で、セキュリティー保護が十分でない端末アプリケーションを置き換えるように設計されています。scp と呼ばれる関連プログラムが、ホスト間でファイルをコピーするように設計された rcp などの古いプログラムに代わるものです。このような旧式アプリケーションは、クライアントとサーバーとの間で送信するパスワードを暗号化しないため、可能な限り使用しないようにしてください。リモートシステムへのログインにセキュアな方法を使用することで、クライアントシステムとリモートホストの両方に対するリスクが軽減されます。
Red Hat Enterprise Linuxnbsp;Hat Enterprise Linuxnbsp;Linux には、一般的な OpenSSH パッケージ openssh と、OpenSSH サーバー、openssh-server パッケージ、およびクライアント openssh-clients パッケージが含まれます。
14.1. SSH プロトコル
14.1.1. SSH を使用する理由
潜在的な侵入者は、ネットワークトラフィックの中断、傍受、経路変更を可能にする様々なツールを自由に駆使して、システムに侵入します。一般的には、これらの脅威は以下のとおり分類できます。
- 2 つのシステム間の通信の傍受
- 攻撃者は、ネットワーク上で通信を行う二者の間のどこかに潜み、両者間で渡される情報をコピーしている可能性があります。攻撃者は情報を傍受して保持する、または情報を改ざんして元の受信者に送信する場合があります。通常、この攻撃は パケットスニファー を使用して実行されます。これは、ネットワークを通過する各パケットをキャプチャーしてその内容を分析する一般的なネットワークユーティリティーです。
- 特定のホストの偽装
- 攻撃者のシステムは、送信の対象となる受信者を装うように設定されます。このストラテジーが機能すると、ユーザーのシステムは間違ったホストと通信していることに気づかないままとなります。この攻撃は、DNS ポイズニング として知られる手法、または IP スプーフィング と呼ばれる手法を使用して実行できます。前者の場合、侵入者はクラックされた DNS サーバーを使用して、クライアントシステムを不当に複製されたホストへ指定します。後者の場合、侵入者は、信頼されたホストから送信されたように見せかけた偽装ネットワークパケットを送信します。
いずれの手法でも、潜在的な機密情報を傍受することが可能です。その傍受が悪意のある理由で行われる場合には、多大な損害をもたらしかねません。リモートシェルログインとファイルコピー用に SSH を使用すると、こうしたセキュリティーの脅威を大幅に軽減できます。これは、SSH クライアントとサーバーがデジタル署名を使用してそれぞれの ID を確認するためです。さらに、クライアントシステムとサーバーシステムとの間の通信はすべて暗号化されます。各パケットはローカルシステムとリモートシステムのみに知られている鍵を使用して暗号化されるため、通信のいずれか一方の ID をスプーフィングする試みは成功しません。
14.1.2. 主な特長
SSH プロトコルは、以下のような保護手段を提供します。
- 対象のサーバーになりすますことができない
- クライアントは、初回接続後に、以前接続したサーバーと同じサーバーに接続していることを確認できます。
- 認証情報の取得ができない
- クライアントは、強力な 128 ビット暗号化を使用して、サーバーへ認証情報を送信します。
- 通信の傍受ができない
- セッション中に送受信された全データは、128 ビット暗号化を使用して転送されるため、傍受された送信データの暗号解読と読み取りは非常に困難になります。
さらに、以下のようなオプションも提供されます。
- ネットワーク上でグラフィカルアプリケーションを使用するセキュアな手段を提供する
- クライアントは、X11 転送 と呼ばれる技術を使用して、サーバーから X11 (X Window System)アプリケーションを転送できます。
ForwardX11Trusted
オプションをyes
に設定した場合、または-Y
オプションで SSH を使用する場合は、X11 SECURITY 拡張制御が省略され、セキュリティー上の脅威となる可能性があることに注意してください。 - セキュアでないプロトコルをセキュアにする手段を提供する
- SSH プロトコルは、送受信するものをすべて暗号化します。SSH サーバーは、ポート転送 と呼ばれる技術を使用して、POP などのセキュアではないプロトコルをセキュアにし、システムとデータ全体のセキュリティーを強化できます。
- セキュアなチャンネルを作成する
- OpenSSH サーバーとクライアントは、サーバーマシンとクライアントマシンとの間のトラフィックに対して、仮想プライベートネットワークに似たトンネルを作成するように設定できます。
- Kerberos 認証をサポートする
- OpenSSH サーバーとクライアントは、Kerberos ネットワーク認証プロトコルの GSSAPI (Generic Security Services Application Program Interface)実装を使用して認証を行うように設定できます。
14.1.3. プロトコルのバージョン
現在、SSH にはバージョン 1 とバージョン 2 の 2 つの種類があります。Red Hat Enterprise Linuxnbsp;Hat Enterprise Linuxnbsp;Linux の OpenSSH スイートは、SSH バージョン 2 を使用します。これには、バージョン 1 の既知の不正使用の影響を受けない、強化された鍵交換アルゴリズムがあります。ただし、互換性の理由から、OpenSSH スイートはバージョン 1 の接続もサポートしますが、バージョン 1 はデフォルトで無効になっており、設定ファイルで有効にする必要があります。
重要
可能な限り、SSH バージョン 1 を使用せず、SSH バージョン 2 互換のサーバーとクライアントを使用してください。
14.1.4. SSH 接続のイベントシーケンス
以下に挙げる一連のイベントは、2 つのホスト間で行われる SSH 通信の整合性を保護するのに役立ちます。
- 暗号化ハンドシェイクが行われ、クライアントが正しいサーバーと通信していることを確認できます。
- クライアントとリモートホストとの間の接続のトランスポート層が、対称暗号方式を使用して暗号化されます。
- クライアントが、サーバーに対して自己認証します。
- クライアントは、暗号化された接続でリモートホストと対話します。
14.1.4.1. トランスポート層
トランスポート層の主な役割は、認証時とその後の通信中に、2 つのホスト間の通信を簡単に安全でセキュアなものにすることです。トランスポート層は、データの暗号化と復号を処理し、データパケットの送受信時にその整合性を保護することでその役割を果たします。また、トランスポート層は、情報を圧縮して転送を高速にします。
SSH クライアントがサーバーに接続すると鍵情報が交換されるため、両システムでトランスポート層が適正に構築できます。以下は、こうした鍵情報の交換中に発生する手順です。
- 鍵を交換する
- 公開鍵暗号化アルゴリズムが決定する
- 対称暗号化アルゴリズムが決定する
- メッセージ認証アルゴリズムが決定する
- ハッシュアルゴリズムが決定する
鍵交換時に、サーバーは一意の ホストキー を使用してクライアントに対して自らを識別します。クライアントがこの特定のサーバーと事前に通信しなかった場合、サーバーのホストキーはクライアントに認識されず、接続されません。OpenSSH は、ユーザーに、ホストの信頼性が確立されないことと、ユーザーがこれを受け入れるか拒否するかをユーザーに通知します。ユーザーは、新規ホストキーを受け入れる前に独立して検証する必要があります。その後の接続では、サーバーのホスト鍵がクライアントに保存されているバージョンと照合され、クライアントが実際に目的のサーバーと通信していることが信頼されます。その後、ホスト鍵が一致しなくなった場合は、接続前にクライアントに保存されたバージョンを削除する必要があります。
警告
新しい SSH サーバーの整合性を常に確認してください。攻撃者は初回コンタクト中に、認識されずにローカルシステムに目的の SSH サーバーを事前設定できます。新しい SSH サーバーの整合性を確認するには、最初の接続前、またはホスト鍵の不一致が発生した場合には、サーバー管理者に問い合わせてください。
SSH は、ほとんどすべての公開鍵アルゴリズムまたはエンコード形式に対応するように設計されています。初回の鍵交換で、交換に使用されるハッシュ値と共有秘密値が作成されると、2 つのシステムは新しい鍵とアルゴリズムの計算を直ちに開始して、認証と、今後の接続で送信されるデータを保護します。
所定の鍵とアルゴリズムを使用して一定量のデータ (正確な量は SSH 実装により異なる) が送信された後に、もう 1 回鍵交換が行われてハッシュ値と新しい共有秘密値の別のセットが生成されます。攻撃者がハッシュ値と共有秘密値を判別できたとしても、その情報が役に立つのは限られた時間のみです。
14.1.4.2. 認証
トランスポート層が、2 つのシステム間で情報を渡すためのセキュアなトンネルを構築すると、サーバーは、秘密鍵でエンコードされた署名の使用やパスワードの入力など、サポートされている別の認証方法をクライアントに伝えます。次に、クライアントが、対応しているいずれかの方法を使用して、サーバーに対して自己認証を試みます。
SSH サーバーとクライアントは、異なるタイプの認証を採用するように設定できるため、双方の制御が最適化されます。サーバーは、そのセキュリティーモデルに基づいて、対応する暗号化方法を決定できます。クライアントは、利用可能なオプションの中から、試行する認証方法の順番を選択できます。
14.1.4.3. チャネル
SSH トランスポート層での認証に成功すると、多重化と呼ばれる手法により複数のチャンネルが開きます。[4].これらの各チャンネルは、異なるターミナルセッションと、転送された X11 セッションの通信を処理します。
クライアントとサーバーの両方で、新しいチャンネルを作成できます。その後、各接続の両端に、別々の番号が割り当てられます。クライアントが新しいチャンネルを開こうとする際、要求と共にチャンネル番号を送信します。この情報はサーバーにより保存され、そのチャンネルに通信を移動するのに使用されます。これは、異なるタイプのセッションが相互に影響しないように、あるセッションの終了時にそのチャンネルが SSH による一次接続を停止せずに閉じることができるようにするためです。
また、チャンネルは フロー制御 もサポートしており、これにより、順序どおりにデータを送受信できます。この方法では、チャンネルが開いているというメッセージをクライアントが受信するまで、チャンネルでデータが送信されません。
クライアントが要求するサービスのタイプと、ユーザーがネットワークに接続される方法に応じて、クライアントとサーバーは、各チャンネルの特性を自動的にネゴシエートします。これにより、プロトコルの基本インフラストラクチャーを変更しなくても、異なるタイプのリモート接続を非常に柔軟に処理できます。