4.2 SSH:安全なネットワーク操作

ネットワーク環境に多数のコンピュータがインストールされるほど、遠隔地からホストへのアクセスが必要となります。通常、これはユーザが認証のためにログイン文字列とパスワード文字列を送信することを意味します。これらの文字列が平文で転送される限り、パケットが盗聴されて、転送元ユーザのアカウントにアクセスするために、そのアカウントを知る権限ユーザを使用せずに不正使用される恐れがあります。これはユーザのファイルがすべて攻撃者に公開されてしまうだけでなく、不正なアカウントを使用して管理者やrootユーザのアクセス権を取得したり、他のシステムに侵入できることにもなります。従来、リモート接続の確立にはtelnetが使用されていましたが、telnetには暗号化形式や他のセキュリティメカニズムのパケット盗聴に対する防護機能が用意されていません。その他にも、従来のFTPプロトコルや一部のリモートコピープログラムのように、保護機能のない通信チャネルが存在します。

SSHスイートは、認証文字列(通常はログイン名とパスワード)およびホスト間でやりとりされる他のすべてのデータを暗号化することで、必要な保護を提供します。SSHを使用した場合も、データフローを第三者に記録される可能性は残りますが、内容は暗号化されており、暗号鍵を知らない限り平文に戻すことはできません。そのため、SSHを使用すると、インターネットのように安全でないネットワーク上でも安全な通信が可能になります。SUSE Linuxに付属しているSSHは、OpenSSHです。

4.2.1 OpenSSHパッケージ

SUSE Linuxでは、デフォルトでパッケージOpenSSHがインストールされます。これによりtelnet、rlogin、rsh、rcp、およびftpの代わりにプログラムssh、scp、およびsftpが使用可能になります。デフォルト設定では、SUSE Linuxシステムのシステムアクセスは、OpenSSHユーティリティを使用し、ファイアウォールがアクセスを許可した場合にのみ可能になります。

4.2.2 sshプログラム

sshプログラムを使用すると、リモートシステムにログインして対話形式で作業できます。このプログラムは、telnetおよびrloginに代わるものです。sloginプログラムは、sshを指す単なるシンボリックリンクです。たとえば、コマンドssh sunを使用してホストsunにログインするとします。ホストはsunのパスワードを求めるプロンプトを表示します。

認証に成功すると、リモートのコマンドラインで作業したり、などの対話型アプリケーションを使用できます。ローカルユーザ名がリモートユーザ名と異なる場合は、ssh -l augustine またはssh augustine@を使用して、異なるログイン名でログインできます。

さらに、sshでは、rshから既知されるリモートシステム上でコマンドを実行できます。次の例では、ホストsun上でコマンドuptimeを実行し、tmpというディレクトリを作成します。プログラムの出力は、ホストearthのローカル端末に表示されます。

ssh otherplanet "uptime; mkdir tmp" 
tux@otherplanet's password:
1:21pm  up  2:17,  9 users,  load average: 0.15, 0.04, 0.02

この例では、両方のコマンドを1つのコマンドで送信するために、引用符が必要です。2つ目のコマンドもsun上で実行するには、このように引用符で囲む必要があります。

4.2.3 scp—Secure Copy

scpは、ファイルをリモートマシンにコピーします。これは、rcpに対する安全で暗号化機能を持つ代替策です。たとえば、scp MyLetter.tex sun:は、ファイルMyLetter.texをホストearthからホストsunにコピーします。earth上でのユーザ名がsun上でのユーザ名と異なる場合は、後者をusername@host形式で指定します。このコマンドには-lオプションがありません。

正しいパスワードを入力すると、scpによりデータ転送が開始され、進行状況バーをシミュレートする一連のアスタリスクが表示されます。また、進行状況バーの右端への到達予想時間も表示されます。すべての出力を抑制するには、オプション-qを指定します。

scpには、ディレクトリ全体の再帰コピー機能も用意されています。コマンドscp -r src/ sun:backup/を入力すると、ディレクトリsrcの内容全体がすべてのサブディレクトリを含めてホストsun上のbackupディレクトリにコピーされます。このサブディレクトリが存在しない場合は、自動的に作成されます。

オプション-pはscpに対して、変更のないファイルのタイムスタンプを残すように指示します。-Cを指定するとデータ転送が圧縮されます。この場合、データ転送量は最小限ですみますが、プロセッサにかかる負荷が大きくなります。

4.2.4 sftp—安全なファイル転送

安全なファイル転送のために、scpの代わりにsftpプログラムを使用できます。sftpセッション中は、ftpで認識される多数のコマンドを使用できます。特にファイル名がわからないデータを転送する場合に、sftpプログラムはscpよりも優れた選択肢です。

4.2.5 SSHデーモン(sshd)—サーバ側

SSHのクライアントプログラムであるsshおよびscpを操作する場合は、サーバであるSSHデーモンをバックグラウンドで実行し、TCP/IP port 22で接続をリスンする必要があります。このデーモンは、初回起動時に鍵のペアを3組生成します。鍵のペアはそれぞれ、秘密鍵と公開鍵で構成されます。そのため、このプロシージャは公開鍵ベースと呼ばれます。SSHを介した通信のセキュリティを保証するために、秘密鍵ファイルへのアクセスはシステム管理者に限定する必要があります。ファイルアクセス権は、デフォルトインストールにより適切に設定されます。秘密鍵はSSHデーモンでローカルにのみ必要であり、他人には付与しないでください。公開鍵コンポーネント(拡張子.pubで識別)は、接続を要求しているクライアントに送信されます。これは、ユーザ全員が読み込み可能です。

接続はSSHクライアントにより開始されます。待機中のSSHデーモンと要求側のSSHクライアントは、プロトコルとソフトウェアのバージョンを比較して不正なポートを介した接続を防止するために、識別データを交換します。オリジナルのSSHデーモンの子プロセスが要求に応答するため、同時に複数のSSH接続を確立できます。

SSHサーバとSSHクライアントとの通信の場合、OpenSSHはバージョン1および、2のSSHプロトコルをサポートします。新規にインストールされたシステムは、デフォルトでバージョン2に設定されます。更新後も引き続きバージョン1を使用する場合は、/usr/share/doc/packages/openssh/README.SuSE内の指示に従ってください。このドキュメントには、SSH 1環境を数ステップでSSH 2作業環境に変換する方法も含まれています。

バージョン1のSSHを使用する場合、サーバはホスト公開鍵とSSHデーモンにより1時間ごとに再生成されるサーバ鍵を送信します。この両方を使用すると、SSHクライアントは自由に選択したセッション鍵を暗号化でき、この鍵がSSHサーバに送られます。また、SSHクライアントはサーバに対して、どの暗号化方式(暗号)を使用するかも指示します。

バージョン2のSSHプロトコルはサーバ鍵を必要としません。クライアント側とサーバ側は、Diffie-Helmanのアルゴリズムを使用して鍵を交換します。

セッション鍵を復号化するにはホストとサーバの秘密鍵が不可欠であり、公開部分からは導出できません。秘密鍵を使用してセッション鍵を復号化できるのは、接続相手のSSHデーモンのみです(man /usr/share/doc/packages/openssh/RFC.nroffコマンドでマニュアルページを参照してください)。この初期接続フェーズは、SSHクライアントの詳細デバッグオプション-vをオンにすると緊密に監視できます。

デフォルトではバージョン2のSSHプロトコルが使用されます。バージョン1のプロトコルを使用するには、-1スイッチを指定してこの設定を上書きします。クライアントでは、すべてのホスト公開鍵がリモートホストとの初期接続後に~/.ssh/known_hostsに格納されます。このため、man-in-the-middle攻撃、つまり、外部SSHサーバが他の名前とIPアドレスを偽装して使用しようとする攻撃が防止されます。この種の攻撃は、~/.ssh/known_hostsに含まれていないホスト鍵が使用されたことで検出されるか、適切な秘密鍵がないためにサーバがセッション鍵を復号化できないことで検出されます。

/etc/ssh/に格納された秘密鍵と公開鍵のバックアップを、外部の安全な場所に保管することをお薦めします。これにより、鍵の変更を検出でき、再インストール後は古い鍵を再び使用できます。また、ユーザの動揺を招くような警告を出す必要もなくなります。警告にも関わらず実際には正しいSSHサーバであることが確認された場合は、このシステムに関する既存のエントリを~/.ssh/known_hostsから削除する必要があります。

4.2.6 SSHの認証メカニズム

この時点で実際の認証が発生します。 最も単純な形式の認証は、前述のようにパスワードを入力することからなっています。SSHの目標は、使いやすく安全なソフトウェアを提供することでした。これは、rshおよびrloginにとって代わるという側面もあるため、SSHは日常的な使用に適した認証方式も提供できるようにする必要があります。そのために、SSHはもう1つ、ユーザが生成する鍵のペアを使用します。SSHパッケージには、そのためのヘルパープログラムが用意されています。ssh-keygenです。ssh-keygen -t rsaまたはssh-keygen -t dsaを入力すると鍵のペアが生成され、鍵を格納するベースファイルの名前を求めるプロンプトが表示されます。

デフォルト設定を確認し、パスフレーズ要求に応答します。ソフトウェアから空のパスフレーズが提示された場合も、ここで説明する手順には10~30文字のテキストを使用することをお勧めします。短くて単純な語句は使用しないでください。また、パスフレーズを再入力して確認してください。その後、秘密鍵と公開鍵の格納場所(この例ではファイルid_rsaおよびid_rsa.pub)が表示されます。

古いパスフレーズを変更するには、ssh-keygen -p -t rsa または ssh-keygen -p -t dsaを使用します。公開鍵コンポーネント(この例ではid_rsa.pubファイル)をリモートマシンにコピーし、~/.ssh/authorized_keysファイルに保存します。次回の接続確立時には、パスフレーズで自己認証するように要求されます。このプロンプトが表示されない場合は、これらのファイルの位置と内容を確認してください。

長時間実行する場合、この手順はその都度パスワードを入力するよりも煩雑です。そのため、SSHパッケージにはssh-agentというツールが用意されており、Xセッションの存続期間中は秘密鍵が保持されます。Xセッション全体はssh-agentの子プロセスとして開始されます。この場合に最も簡単な方法は、.xsessionファイルの先頭にある変数usesshyesに設定し、KDMやXDMなどのディスプレイマネージャを介してログインすることです。また、ssh-agent startxと入力する方法もあります。

これで、sshまたはscpを通常どおり使用できます。前述のように公開鍵を配布している場合、パスワードを求めるプロンプトは表示されなくなります。Xセッションを終了するか、xlockなどのパスワード保護アプリケーションでロックすることに注意してください。

バージョン2のSSHプロトコル導入に関連する変更は、すべてファイル/usr/share/doc/packages/openssh/README.SuSEにも記載されています。

4.2.7 X、認証および転送メカニズム

前述したセキュリティ関連の改善に加えて、SSHを使用するとリモートXアプリケーションの使用も簡略化されます。オプション-Xを指定してsshを実行すると、リモートマシン上でDISPLAY変数が自動的に設定され、すべてのX出力が既存のSSH接続を介してリモートマシンにエクスポートされます。それと同時に、権限のないユーザは、この方法でリモートで起動してローカルに表示していたXアプリケーションのパケットを盗聴できなくなります。

オプション-Aを追加すると、ssh-agentの認証メカニズムが次のマシンに繰り越されます。これにより、事前に接続先ホストに公開鍵を配布してそこで適切に保存している場合にのみ、パスワードを入力しなくても様々なマシンから作業できます。

デフォルト設定では両方のメカニズムが無効になっていますが、システム単位の設定ファイル/etc/ssh/sshd_configまたはユーザの~/.ssh/configファイル内でいつでも永続的に有効にすることができます。

sshを使用してTCP/IP接続をリダイレクトすることもできます。次の例では、SSHに対してそれぞれSMTPポートとPOP3ポートをリダイレクトするように指定しています。

ssh -L 25:sun:25 earth

このコマンドを使用すると、 earthのport 25 (SMTP)に送られた接続は、すべて暗号化チャネルを介してsunのSMTPポートにリダイレクトされます。これが特に役立つのは、SMTP-AUTHまたはPOP-before-SMTP機能のないSMTPサーバを使用する場合です。ネットワークに接続している任意の場所から「ホーム」メールサーバに電子メールを転送して配信できます。同様に、次のコマンドを使用すると、earth上のすべてのPOP3要求(ポート 110)をsunのPOP3ポートに転送できます。

ssh -L 110:sun:110 earth

どちらのコマンドも、権限付きのローカルポートに接続するためrootユーザで実行する必要があります。電子メールは、既存のSSH接続で標準ユーザにより送受信されます。これを機能させるには、SMTPとPOP3のホストをlocalhostに設定する必要があります。追加情報は、前述の各プログラムのマニュアルページおよび/usr/share/doc/packages/opensshにある該当ファイルを参照してください。