セキュリティ機能を意図していると聞いたことがありますが、セキュリティ上の問題のように思えることがよくあります。特権ポートを使用するサーバーを作成したい場合、自分のコードがどれほど安全かを心配する必要があるだけでなく、特にsetuid
特権を正しく使用してドロップしているかどうかを心配する必要があります。
2 に答える
真実。しかし、それはまた、あなたと話している人は、そのサーバーを実行するには root 権限が必要であることを知っていることも意味します. ポート 22 (たとえば) でサーバーにログインすると、root によって実行されたプロセス (セキュリティの問題は別として) と通信していることがわかるので、そのシステムのパスワードやその他の情報でそれを信頼します。そのシステムのユーザー アカウントを持つ人を信頼しないでください。
参照: http://www.w3.org/Daemon/User/Installation/PrivilegedPorts.html。
編集して理由を詳しく説明します。多くの最も重要なネットワーク サービス - telnet (はい、まだ使用されています - 驚くほど頻繁に使用されます)、SSH、多くの HTTP サービス、FTP など - は、パスワードなどの重要なデータをネットワーク経由で送信する必要があります。安全なセットアップでは、プロトコルに固有のもの (SSH) であろうと、プロトコルにラップされているもの (stunnel、IPSec) であろうと、ある種の暗号化によってデータが回線上で詮索されるのを防ぎますが、これらの保護はすべてサーバーで終了します。
データを適切に保護するには、「実際の」サーバーと通信していることを確認する必要があります。今日、安全な証明書は、Web (および他の場所) でこれを行う最も重要な方法です。「実際の」サーバーのみが証明書にアクセスできると想定しているため、通信しているサーバーにその証明書があることを確認すると、信頼するよ。
特権ポートは非常によく似た方法で機能します。root だけが特権ポートにアクセスできるため、特権ポートと通信している場合は、root と通信していることがわかります。これは、最新の Web ではあまり役に立ちません。重要なのは、IP ではなく、サーバーのIDです。他の種類のネットワークでは、これは当てはまりません。たとえば、学術ネットワークでは、サーバーは安全な部屋で信頼できるスタッフによって物理的に制御されることがよくありますが、学生とスタッフはユーザーとして非常に自由にアクセスできます。このような状況では、root は常に信頼できると想定するのが安全な場合が多いため、ログインしてプライベート データを特権ポートに安全に送信できます。通常のユーザーがすべてのポートでリッスンできる場合、特定のプログラムが特定のデータで信頼されていることを確認するために、追加のレイヤー全体が必要になります。
使用しているプラットフォームはわかりませんが、少なくとも Linux では機能 (具体的には CAP_NET_BIND_SERVICE) を使用して、ルート以外のプロセスが 1024 未満のポートでリッスンできるようにすることができます。たとえば、Is there a way for Linuxで「特権」ポートにバインドする非ルートプロセス?
もう 1 つの方法は、特権ポートから非特権ポートにトラフィックを転送するように iptables ルールを設定することです (私はこれを本番環境で使用しましたが、かなりシンプルでうまく機能します)。上のリンク先にも書いてあります。