web-dev-qa-db-ja.com

1024未満のポートを使用する通常のユーザー

Linux(それが重要な場合はCentOS)で、通常のユーザーが1024未満のポートを使用できるようにする方法はありますか? (オープンリスニングTCPそのポートのソケット)

現在、rootのみがこれらのポートを使用する権限を持っていることを理解しています。

4
user25897

CentOS 3/4/5にはない(ファイルシステム機能の欠如):

このポートを開く必要があるプログラムにCAP_NET_BIND_SERVICE機能を設定できます。ルートは実行可能ファイルに機能を設定し、その後、すべてのユーザーがその実行可能ファイルを実行でき、1024未満のポートを使用できるようになります。

実行可能ファイルに機能を設定するには:

setcap cap_net_bind_service=+ep /path/to/program
10
Juliano

SUIDを実行し、ポートを開いた後に特権を削除するラッパーを作成できます。

4
ko-dos

IIRCこれは不可能です。そうである場合は、セキュリティ上の理由からお勧めしません。

ただし、ユーザーが特定のポートでリッスンできるようにする場合は、いつでもTCP rinetdなどのフォワーダーまたはiptablesルールを使用して、そのポートへの接続をユーザーが可能なポートにリダイレクトできます。リッスンし、その上位ポートでリッスンするようにサービスを設定してもらいます。

たとえば、行

aa.bb.cc.dd    80      127.0.0.1   8000

rinetdの構成では、アドレスaa.bb.cc.ddのポート80への接続を、特権のないユーザーがリッスンできるローカルホストポート8000​​に転送します。同等のiptablesルールは次のようになります

/sbin/iptables -t nat -A PREROUTING -p tcp -d aa.bb.cc.dd --dport 80 -j DNAT --to 127.0.0.1:8000

どちらの方法でも、ユーザーに任意のポートでリッスンさせるよりも、はるかにきめ細かい制御が可能です。

Iptablesアプローチには、リスニングアプリケーションが呼び出し元クライアントのIPアドレスを認識するという利点があります(rinetdメソッドを使用すると、すべての接続がローカルホストからのものであると見なされます)。 iptablesメソッドでは、TCPだけでなくUDPも使用できます。

4
David Spillett

authbind 岩。

機能は素晴らしいものですが、特定のカーネルバージョンを適切に構成する必要があります。 Sun Javaなどの一部のプログラムは、機能を備えていません。 authbindはすべてのLinuxバージョンで機能します。

ただし、authbindはIPv4のみをサポートします。

1
stepancheg