Linuxがユーザーレベルのネットワークポート権限を許可しないのはなぜですか? [閉鎖]

Linuxがユーザーレベルのネットワークポート権限を許可しないのはなぜですか? [閉鎖]

場合によっては、Linuxでネットワークポートアクセスに対するユーザーレベルの権限を設定する方法を検索するのに、結果はかなり退屈です。たとえば、ポート5080でリッスンする重要なプロセスを実行しているコンピュータがある場合は、他の通常の特権プロセスと同様に、信頼できる特定のユーザーセットのみがそのポートにアクセスできるようにする方法があると思います。ファイルシステム機関と同じです。

ただし、高ポートはすべてのユーザーが使用できるのに対し、低ポートはルートのみを使用でき、authbindやiptables転送などの粗雑なハッカーだけが他のユーザーに低ポートを使用できるようにすることができます。これは非常に奇妙な状況のようです。それで、なぜこのように設計されているのか、人々がこれを変える必要性を感じないのではないかと思います。

答え1

Linuxはネットワークネームスペースをサポートしています。さまざまなプロセスがさまざまなネットワークインターフェイスのセットを表示できるようにすることができます。これは広範なトピックです。

コンピュータ内で特定のユーザーだけがアクセスできる通信ポートが必要な場合は、ファイルシステムスペースに許可された名前を持つ従来のUnixソケットを使用できます。 LinuxはAF_UNIXソケットに対する読み取り/書き込み権限を尊重します。

マシンが他のマシンからの外部TCPまたはUDP要求をポート5080で受信している場合、私たちは実際にこれについて話すことはできません。ユーザーこれ以上権限がありません。認証、暗号化、整合性/スプーフィング防止/サービス拒否防止など、5080を超えるプロトコルにセキュリティを構築する必要があります。

答え2

当初は、初期のUnixシステムの範囲外の複雑なデザインが必要だったためです。

後で一般的なケースに対してユーザーレベルのネットワークポート権限を実装する確立された方法があると推測しました。イントラネット、これは約数年後に現れました(4.3BSD)TCP / IP(4.2BSD)。デーモンはinetdrootとして実行され、その設定ファイルで指定されたポートでリッスンします。着信接続では、inetd構成ファイルで指定された別のプログラムが作成され、inetd構成ファイルで指定されたユーザーとして実行されます。したがって、少なくとも各接続で新しいプロセスを開始できるサービスの問題が解決されました。

答え3

その理由の1つは、ほとんどのユーザーが一時ポートルート以外のサーバーに接続するために使用されます。

TCP / IPv4接続は、それぞれIPアドレスとポート番号で構成される2つのエンドポイントで構成されています。したがって、クライアントユーザーがサーバーコンピュータに接続したときに確立された接続は、(サーバーIP、サーバーポート、クライアントIP、クライアントポート)の4つのタプルと見なすことができます。通常、これら4つのうち3つは簡単にわかります。クライアントコンピュータは独自のIPアドレスを使用し、リモートサービスに接続するときはサーバーコンピュータのIPアドレスとサービスポート番号が必要です。

すぐに明確ではないのは、接続が確立されると、接続クライアントがポート番号を使用することです。クライアントプログラムが明示的に特定のポート番号を要求しない限り、使用されるポート番号は一時ポート番号です。一時ポートは、コンピュータのIPスタックによって割り当てられた一時ポートであり、この目的で指定されたポート範囲で割り当てられます。接続が終了したら、一時ポートを再利用できます。ただし、ほとんどのIPスタックは、一時的なポートプール全体が使用されるまでポート番号を再利用しません。したがって、クライアントプログラムが再接続されると、接続の新しい側に別の一時ポート番号が割り当てられます。

関連情報