web-dev-qa-db-ja.com

ユーザーが1024未満のポートをリッスンできるようにする

(ルートとは異なる)ユーザーがポート80でリッスンするサーバーを実行できるようにする必要があります。

これを行う方法はありますか?

65
peoro

setcap 'cap_net_bind_service=+ep' /path/to/program

これは特定のプロセスで機能します。ただし、特定のユーザーが1024未満のポートにバインドできるようにするには、そのユーザーをsudoersに追加する必要があります。

詳細はこちら ディスカッション をご覧ください。

53
Rohan Monga

(これらの方法のいくつかは他の回答で言及されています;私はおおまかな順序でいくつかの可能な選択肢を与えています)

低いポートを高いポートにリダイレクトし、高いポートでリッスンできます。

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 1080

Rootとしてサーバーを起動し、特権ポートでのリッスンを開始した後で特権を削除できます。できれば、自分でコーディングするのではなく、ジョブを実行するラッパーからサーバーを起動してください。サーバーが接続ごとに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_servicecapability を与えることができます。機能はまだ比較的新しく、 まだいくつかのねじれがあります であることに注意してください。

setcap cap_net_bind_service=ep /path/to/server/executable

簡単に言えば、これは設計では不可能です。

長い答えは、オープンソースの世界では、デザインを試し、別の方法を考え出す人がたくさんいるということです。一般に、これは不可能であるべきであることが広く受け入れられている慣行です。試行しているという事実は、おそらくシステムに別の設計上の欠陥があることを意味し、* nixのベストプラクティスとセキュリティへの影響を考慮して、システムアーキテクチャ全体を再検討する必要があります。

そうは言っても、低ポートへの非rootアクセスを許可する1つのプログラムは authbind です。 selinuxgrsecurity の両方も、このような微調整された認証用のフレームワークを提供します。

最後に、特定のユーザーに特定のプログラムをrootとして実行させたい場合、本当に必要なのは、Apacheなどを再起動できるようにすることだけであれば、Sudoがお勧めです。

4
Caleb

netcatまたはxinetd またはiptablesポート転送を使用するか、Apacheをフロントエンドプロキシとして使用して、非特権ポートでプロセスを実行できます。

3
jamespo

Iptables PREROUTING REDIRECTメソッドを試しましたが、転送されたパケットにも影響することがわかりました。つまり、マシンがインターフェイス間でパケットも転送している場合(イーサネットネットワークに接続されたWi-Fiアクセスポイントとして機能している場合など)、iptablesルールは、インターネット接続先への接続されたクライアントの接続もキャッチし、リダイレクトします。この機械。それは私が望んでいたことではありません。マシン自体に向けられた接続のみをリダイレクトしたかったのです。

1つの可能性は、TCPポート転送を使用することです。たとえば、socatを使用します:

socat TCP4-LISTEN:www,reuseaddr,fork TCP4:localhost:8080

ただし、この方法の1つの欠点は、ポート8080でリッスンしているアプリケーションが着信接続の送信元アドレスを認識しないことです(たとえば、ログやその他の識別目的のため)。

1
Craig McQueen