RSHD(8)

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

書式
rshd [-alnL]

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

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

1.  サーバは、クライアントの要求元ポート番号のチェックをおこないます。 要求元ポート番号 が 512 から 1023 の範囲にない場合、サーバは接続を強制切断します。

2.  サーバは、ソケットから ヌル バイト (`\0') を検出するまで文字を読みます。 受信文字列は、 ASCII コードによる 10 進数の数値に変換します。

3.  ステップ 2 で受信した数値が 0 でない場合、その数値を 標準エラー出力 で使用する 2 番目のストリームのポート番号として解釈します。 そしてクライアントマシン上でも指定されたポート番号の 2 番目の接続を生成します。 この 2 番目の接続の要求元ポート番号も、512 から 1023 の範囲で指定します。

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

5.  最初のソケットを介して、ヌル終端された最大 16 文字の ユーザ名を取得します。ユーザ名は、 クライアント マシン上のユーザ識別に使用します。

6.  最初のソケットを介して、ヌル終端された最大 16 文字の ユーザ名を取得します。ユーザ名は、 サーバ マシン上のユーザ認証に使用します。

7.  最初のソケットを介して、シェルに渡されるべき、ヌル終端された コマンドを取得します。コマンド長の制限は、システムの引数リスト サイズの上限に依存します。

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

9.  /etc/nologin ファイルが存在し、ユーザがスーパユーザでない場合、接続を 切断します。 nologin ファイルの名前に関しては、 login.conf にて ローカルユーザのログインクラスに関する nologin ケーパビリティが優先します。 ログインクラスは、ログイン時間(times.allow と times.denny ケーパビリティ) およびリモートホスト(hosts.allow と hosts.denny ケーパビリティ)による rsh(1) アクセスの制限にも使われます。

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

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

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

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

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

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

Command too long.
    渡されたコマンドラインの長さが、引数リストの大きさを超えています (システムに依存します)。

Login incorrect.
    当該ユーザに関するエントリが、パスワードファイルに登録されていないか、 上述の認証手続きに失敗しました。

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

Logins not available right now.
    ローカルユーザのログインクラスに対する login.conf において、許された時間以外で rsh(1) が試されました。

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

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

<shellname>: ...
    ユーザのログインシェルを起動できませんでした。本メッセージの出力は 標準エラー出力 に関連づけられたコネクションを介して返されますので、 フラグバイトは先行しません。

関連項目
rlogin(1), rsh(1), gethostbyaddr(3), rcmd(3), ruserok(3), hosts(5), login.conf(5), nologin(5), services(5), named(8), rlogind(8), syslogd(8).

関連ファイル
/etc/hosts
/etc/hosts.equiv
/etc/login.conf
$HOME/.rhosts
/etc/nologin

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

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

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