rshを実行すると動作しますが、最初に奇妙な「接続拒否」メッセージが表示されます。
$ rsh localhost pwd
connect to address 127.0.0.1 port 544: Connection refused
Trying krb4 rsh...
connect to address 127.0.0.1 port 544: Connection refused
trying normal rsh (/usr/bin/rsh)
/home/service
しかし、straceでrshを実行すると、サーバーにまったく接続できません。
$ strace -c rsh localhost ulimit -n
connect to address 127.0.0.1 port 544: Connection refused
Trying krb4 rsh...
connect to address 127.0.0.1 port 544: Connection refused
trying normal rsh (/usr/bin/rsh)
rcmd: socket: Permission denied
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
28.39 0.000113 2 58 read
27.64 0.000110 16 7 write
16.83 0.000067 1 47 open
15.33 0.000061 2 27 munmap
11.81 0.000047 1 80 mmap
0.00 0.000000 0 58 close
0.00 0.000000 0 1 stat
0.00 0.000000 0 45 fstat
..........................................
..........................................
..........................................
これは以下から抜粋したものですstrace rsh localhost ulimit -n
:
connect(3, {sa_family=AF_INET, sin_port=htons(544), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 ECONNREFUSED (Connection refused)
write(2, "Connection refused\n", 19) = 19
connect(3, {sa_family=AF_INET, sin_port=htons(544), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 ECONNREFUSED (Connection refused)
write(2, "Connection refused\n", 19) = 19
質問
- 何がこれの原因ですか
port 544: Connection refused
? - エラーが表示されるのはなぜですか
rcmd: socket: Permission denied
?一部の整数値を表示する必要があります(ulimit -n
リモートシステムの出力)。
答え1
rsh サーバーの標準ポートは 514 です。あなたのrshクライアントは以下をサポートします。ケルベロス、Kerberos サポート rsh サーバーは通常、ポート 544 でリッスンします。 rsh クライアントはまず Kerberos 認証を使用してログインを試みます。まず、Kerberosバージョン5を使用してから、Kerberosバージョン4(省略して「krb4」)を使用することもできます。 「接続が拒否されました」というエラーは、Kerberos rshサーバーがないために発生します(ファイアウォールがユーザーをブロックするなどの他の理由があるかもしれませんが、サーバーがlocalhostにある場合はそうではありません)。 Kerberosを使用する予定がない場合は、このエラーを無視してください。
Kerberos がない場合、rsh は 2 種類の認証を受け入れます。つまり、ユーザーはパスワードを入力する必要があるか、ユーザーが/etc/rhosts
ホワイトリストに登録する必要があります~/.rhosts
。ホワイトリストは、システムMのユーザーUがサーバーのユーザーVにログインできるようにするファイル宣言を表します。サーバーは、要求が実際にシステムMのユーザーUから来たことをサーバーが信頼できる場合にのみ許可します。要求がマシンMのIPアドレスから来る場合、サーバーは要求がマシンMから来たと信じます(1980年代の標準による有効な仮定)。クライアントがそう言ったので、リクエストがユーザー U から来たと信じています。
しかし、客がそう言うから1980年代基準でも、これは顧客を信頼する理由にはなりませんでした。したがって、追加の条件があります。つまり、rsh要求の送信元ポートは1024未満でなければなりません。 Unixシステムでは、ルートのみが1024未満のTCPまたはUDPポートをバインドできます。したがって、rsh クライアントは root として実行されます。すべてのユーザーがこれを実行できる必要があるため、rshバイナリは次のようになります。設定値root: どのユーザーが呼び出しても、root 権限で実行されます。
strace でプログラムを実行すると、高い権限ではなく呼び出し側のユーザー権限でのみ実行されます。これは、追跡によって機密データが明らかになる可能性があるためです。実際、同じメカニズムを使用すると、プロセスを完全にハイジャックできます。したがって、実行すると、strace rsh …
1024未満のソースポートで接続を開こうとすると失敗しますrcmd: socket: Permission denied
。
を追跡するには、rootとして実行する必要がrsh
あります。 rootとしてstrace
実行するか、rsh
この-u
オプションを渡して、プログラムがアカウントから起動したときに通常持つ権限で実行するようにします。
strace -o rsh.strace -s9999 -u jhamb rsh localhost pwd