web-dev-qa-db-ja.com

ルートアクセスなしで1024未満のポートにバインドする

ルートアクセスを必要とせずに、1000未満のポート番号にバインドする、現在取り組んでいるアプリケーションを実行したいと思います。

私はLinux Mintを使用しており、それをセットアップするためのrootアクセス権を持っています。 SSHで実行できるようにしたいのですが。

それが可能である場合、それが不可能であるか、私がそれを行うべきではないかどうかも聞いてください。

編集:主に開発用により大きいポート番号を使用して満足していますが、Flashはポート843でソケットポリシーを想定しています。現在、ルートとしてアプリを実行する必要があるため、PITAであるMakefileから実行できません。

44
tarn

デーモンが小さいポート番号からのリクエストに応答するようにするもう1つの方法は、iptablesなどを使用して、小さい番号のポートを、デーモンがリッスンしている大きい番号のポートにリダイレクトすることです。

Sudo iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 8080

80を公開するポートに置き換え、8080をアプリケーションリスナーポートに置き換えます。

37
James C

もちろんこれは可能です。バイナリCAP_NET_BIND_SERVICEを指定するだけです。

Sudo setcap cap_net_bind_service=ep some-binary

Linuxでは、rootが実行できることは、一連の機能に分割されています。 CAP_NET_BIND_SERVICEは、1024以下のポートにバインドする機能です。

AppArmor、SELinux、または別のLinuxセキュリティモジュール(LSM)を使用して、その1つのポートを具体的にバインドするアクセス権をプログラムに付与することもおそらく可能ですが、これは時間の無駄だと思います。セキュリティは、実際にははるか昔のポート番号に基づいていません。

OSXがポート80および443を非特権ポートに転送するためのスクリプトは次のとおりです。

echo " 
rdr pass inet proto tcp from any to any port 80 -> 127.0.0.1 port 8080
rdr pass inet proto tcp from any to any port 443 -> 127.0.0.1 port 8443
" | Sudo pfctl -ef -
37
joeforker

私はそれを行う方法があると思いますが、これがうまくいくかどうかは100%わかりません。

アプリケーションがそれを使用するのではなく、ルートを必要とするポートのバインディングなので、以下の方法は機能する可能性がありますが、最初にSudoアクセスが必要です。

最初に、Sudo myAppを使用してrootユーザーとしてプロセスを開始します。ポートがバインドされたら、プロセスの所有者を非特権ユーザーに切り替えることができます。

8
RobertPitt

Bind()システムコールを(LD_PRELOADライブラリを介して)ラップすることにより、必要なことを実行する「authbind」と呼ばれるライブラリをわずかに覚えています。特権ポートが要求された場合は、次に、ファイル記述子は、アプリケーションが実際にポートへのバインドを許可されていることを確認し、bind()を実行して終了します。

プロジェクトのステータスについては不明ですが、必要に応じて、このメソッドは(再)実装するのがかなり簡単なはずです。

6
Simon Richter