RSHD(8)

名称
rshd - リモートシェルのサーバ

書式
rshd [-alnL]

解説
rshd サーバは rcmd(3) ルーチンのためのサーバであり、その結果として rsh(1) プログラム用のサーバです。 rshd は、信頼できるホストからの特権ポートを用いた認証をベースとして、 プログラムのリモート実行機能を提供します。

rshd サーバは、``cmd'' サービスに割り当てられたポート (services(5) 参照) でサービス要求を listen() します。サービス要求を受信すると、 サーバは以下の手順を開始します:

1.  サーバは、クライアントの要求元ポート番号のチェックを行います。 もし要求元のポート番号が 512 から 1023 の範囲外であれば、 サーバは接続を強制切断します。

2.  サーバは、ソケットから null (`\0') を受信するまで文字を読みます。 受信した文字列は、 ASCII コードによる 10 進数の数として解釈されます。

3.  ステップ 2 で受信した数が 0 でない場合、その数は stderr 用の 2 本目のストリームのポート番号として解釈されます。 それから、2 本目の接続が、指定されたポートでクライアントマシン上に 生成されます。 2 本目の接続の接続元のポート番号も、512 から 1023 の間になります。

4.  サーバは、クライアントのソースアドレスをチェックし、該当するホスト名を 要求します (gethostbyaddr(3), hosts(5), named(8) を参照して下さい)。ホスト名が特定出来ない場合、 ドット表記法によるホストアドレスを用います。 もしそのホスト名がサーバと同一のドメイン内にある場合 (ドメイン名の最後の 2 パートで判断します)、もしくは -a オプションが与えられた場合は、ホスト名に対応したアドレスを要求し、 名前とアドレスの対応をチェックします。もしこの対応が不正なものであった場合、 接続は強制切断され、``Host address mismatch.'' のメッセージが表示されます。

5.  最初のソケットを介して、null で終了する最大 16 文字のユーザ名を取得します。 このユーザ名は、 クライアント マシン上のユーザ識別子として解釈されます。

6.  最初のソケットを介して、null で終了する最大 16 文字のユーザ名を取得します。 このユーザ名は、 サーバ マシン上で使うユーザ識別子として解釈されます。

7.  最初のソケットを介して、null で終了するシェルに渡されるコマンドを取得します。 コマンドの長さは、システムの引数リストの長さの上限までに制限されます。

8.  rshd は、 ruserok(3) を用いてユーザの確認を行います。ここで、 rshd は /etc/hosts.equiv および当該ユーザのホームディレクトリ上に存在する .rhosts ファイルを利用します。 -l オプションは、ユーザがスーパユーザでない限り .rhosts ファイルに基づいた ruserok(3) のすべての認証を行わないようにします。

9.  もし /etc/nologin ファイルが存在し、ユーザがスーパユーザでない場合、接続は 切断されます。

10. 最初のソケットを用いて 1 個の null バイトが返却され、 コマンドラインがユーザのログインシェルに渡されます。シェルは rshd によって確立されたネットワーク接続を継承します。

-n オプションが与えられないかぎり、トランスポートレベルの keepalive メッセージが 有効になります。keepalive メッセージを使用することによって、 クライアントがクラッシュしたり、ネットワーク的に到達不可能になった場合に、 セッションをタイムアウトで終了させることが可能となります。

-L オプションを用いることで、すべての正常なアクセスについては、 syslogd(8) を通して auth.info メッセージとしてログが残されます。

診断
以下に示す例のうち最後のものを除き、すべての診断メッセージは、 最初に開設されたソケットを用いて、他のすべての接続をクローズした後に 返却されます。エラーは、値 1 をもつ 1 バイトのデータが 先頭につくことでわかります (0 は、ログインシェルの実行より前の処理が すべて成功した場合に、上記のステップ 10 で返却されます)。

Locuser too long.
    クライアントマシン上のユーザ名が、16 文字を超えています。

Ruser too long.
    リモートマシン上のユーザ名が、16 文字を超えています。

Command too long.
    コマンドラインの長さが、システムの制限を超えています。

Login incorrect.
    passwd ファイルエントリに、当該ユーザが登録されていません。

Remote directory.
    ホームディレクトリへの chdir(2) が失敗しました。

Permission denied.
    ユーザ認証が失敗しました。

Can't make pipe.
    標準エラー出力用に必要なパイプが作成出来ませんでした。

Can't fork; try again.
    サーバによる fork(2) が失敗しました。

<shellname>: ...
    ユーザのログインシェルが起動できませんでした。本メッセージの出力は、 stderr 用に確立されたコネクションを用いて送信され、 先頭の 1 バイトのフラグはつきません。

関連項目
rsh(1), rcmd(3), ruserok(3)

バグ
ここで用いられているユーザ認証手順は、各クライアントマシンおよび接続媒体が 信頼できるものと仮定しています。これはセキュリティホールになりやすいのですが、 ``オープン'' な環境下では便利です。

全てのデータについて暗号化を行う手順が実装されるべきです。

TELNET のような、もっと拡張性のあるプロトコルが用いられるべきです。