web-dev-qa-db-ja.com

rshでstraceを使用できないのはなぜですか?

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

質問

  1. port 544: Connection refusedの原因は何ですか?
  2. なぜエラーrcmd: socket: Permission deniedが表示されるのですか?整数値(リモートマシンでのulimit -nの出力)が表示されるはずです。
2
devsda

Rshサーバーの通常のポートは514です。rshクライアントは Kerberos をサポートし、Kerberos対応のrshサーバーは通常ポート544でリッスンします。rshクライアントは最初にKerberos認証でログインを試みます。おそらく最初にKerberosバージョン5、次にKerberosバージョン4(略して「krb4」)を使用します。 「接続が拒否されました」というエラーは、Kerberos rshサーバーがないことが原因です(ファイアウォールがブロックしているなどの他の理由がある可能性がありますが、サーバーがローカルホスト上にある場合はほとんど発生しません)。 Kerberosを使用するつもりがない限り、このエラーは無視してください。

Kerberosがない場合、rshは2つの形式の認証を許可します。ユーザーがパスワードを入力するか、ユーザーが/etc/rhostsまたは~/.rhostsにホワイトリストに登録されている必要があります。ホワイトリストとは、マシンMのユーザーUがサーバーのユーザーVとしてログインできることをファイルが宣言していることを意味します。サーバーは、要求が実際にマシンMのユーザーUからのものであると信頼できる場合にのみ、これを許可します。サーバーは、要求がマシンMのIPアドレスからのものである場合、マシンMからのものであると信頼します(1980年代の標準による有効な仮定)。 )。クライアントがそう言うので、要求がユーザーUから来ることを信頼します。

しかし、クライアントがそう言っているのでは、1980年代の基準によってさえも、クライアントを信頼する理由ではありません。したがって、追加の条件があります。rsh要求の送信元ポートは1024未満である必要があります。Unixマシンでは、rootのみがバインドできますTCPまたは1024未満のUDPポート。したがって、rshクライアントはrootとして実行されます。すべてのユーザーが実行できる必要があります。rshバイナリは setuid rootです。どのユーザーが呼び出したかに関係なく、root権限で実行されます。

Straceでプログラムを実行すると、昇格された特権では実行されず、呼び出し元のユーザーの特権のみで実行されます。これは、トレースによって機密データが明らかになる可能性があるためです(実際、同じメカニズムにより、プロセスを完全に乗っ取ることができます)。したがって、strace rsh …を実行すると、1024未満の送信元ポートで接続を開こうとした時点で、失敗します:rcmd: socket: Permission denied

rshをトレースする場合は、rootとしてstraceを実行する必要があります。 rshをrootとして実行するか、-uオプションを渡して、アカウントから起動したときに通常持っている特権でプログラムを実行します。

strace -o rsh.strace -s9999 -u jhamb rsh localhost pwd