さて、機能システムと CAP_NET_BIND_SERVICE
を指摘してくれた人々に感謝します 容量。最近のカーネルを使用している場合、これを使用してサービスを非ルートとして開始し、低ポートをバインドすることが実際に可能です。短い答えは、あなたがそうするということです:
setcap 'cap_net_bind_service=+ep' /path/to/program
そしていつでも program
その後は CAP_NET_BIND_SERVICE
が実行されます 容量。 setcap
debian パッケージ libcap2-bin
にあります .
ここで注意事項:
<オール>program
で LD_LIBRARY_PATH を無効にします setcap
のように昇格した権限を持つ または suid
. program
の場合 独自の .../lib/
を使用 、ポート転送などの別のオプションを検討する必要がある場合があります。リソース:
- capabilities(7) のマニュアル ページ。本番環境で機能を使用する場合は、これを長く一生懸命読んでください。 exec() 呼び出し間で機能がどのように継承されるかについては、ここで詳しく説明する非常に注意が必要な詳細があります。
- setcap のマニュアル ページ
- 「GNU/Linux で root なしで 1024 未満のポートをバインドする」:
setcap
を最初に指摘したドキュメント .
注:RHEL はこれを v6 で初めて追加しました。
ポートリダイレクトを行うことができます。これは、Linux ボックスで実行されている Silverlight ポリシー サーバーに対して私が行っていることです
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 943 -j REDIRECT --to-port 1300
標準的な方法は、それらを「setuid」にして root として起動し、ポートにバインドするとすぐにその root 権限を破棄しますが、ポートへの接続を受け入れ始める前です。 Apache と INN のソース コードで、その良い例を見ることができます。 Lighttpd も良い例だと言われています。
もう 1 つの例は Postfix です。これは、パイプを介して通信する複数のデーモンを使用し、そのうちの 1 つまたは 2 つ (バイトの受け入れまたは送信以外はほとんど何もしません) のみが root として実行され、残りはより低い特権で実行されます。