setcap 'cap_net_bind_service=+ep' /path/to/program
これは特定のプロセスで機能します。ただし、特定のユーザーが 1024 未満のポートにバインドできるようにするには、そのユーザーを sudoers に追加する必要があります。
詳細については、このディスカッションをご覧ください。
(これらの方法のいくつかは他の回答で言及されています。いくつかの可能な選択肢を大まかな優先順位で示しています。)
低ポートを高ポートにリダイレクトし、高ポートでリッスンできます。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 1080
特権ポートでリッスンを開始した後、サーバーをルートとして起動し、特権を削除できます。できれば、それを自分でコーディングするよりも、代わりにジョブを実行するラッパーからサーバーを起動してください。サーバーが接続ごとに 1 つのインスタンスを開始する場合は、inetd
から開始します。 (または xinetd
などの同様のプログラム )。 inetd
の場合 、 /etc/inetd.conf
で次のような行を使用します :
http stream tcp nowait username:groupname /path/to/server/executable argv[0] argv[1]…
サーバーが単一のインスタンスでリッスンする場合は、authbind
などのプログラムから起動します .空のファイル /etc/authbind/byport/80
を作成するか サーバーを実行しているユーザーが実行できるようにします。または /etc/authbind/byuid/1234
を作成します 、ここで、1234 はサーバーを実行している UID で、行 0.0.0.0/0:80,80
を含みます .
サーバーの実行可能ファイルが機能をサポートするファイルシステムに保存されている場合は、cap_net_bind_service
を指定できます 容量。機能はまだ比較的新しく、まだいくつかの問題があることに注意してください。
setcap cap_net_bind_service=ep /path/to/server/executable
簡単に言えば、これは設計上不可能です。
長い答えは、オープンソースの世界では、多くの人が設計をいじり、別の方法を考え出すというものです。一般に、これは可能であってはならないという慣行が広く受け入れられています。あなたが試みているという事実は、おそらくシステムに別の設計上の欠陥があることを意味し、*nix のベスト プラクティスとセキュリティへの影響を考慮して、システム アーキテクチャ全体を再検討する必要があります。
そうは言っても、ローポートへの非 root アクセスを許可するプログラムの 1 つが authbind です。 selinux と grsecurity はどちらも、このような微調整された認証のためのフレームワークも提供します。
最後に、特定のユーザーに特定のプログラムを root として実行させたい場合、本当に必要なのは、ユーザーが apache などを再起動できるようにすることだけです。 sudo
あなたの友達です!