ユーザー(ルートとは異なる)がポート80でリッスンしているサーバーを実行できるようにする必要があります。
これを行う方法はありますか?
ユーザー(ルートとは異なる)がポート80でリッスンしているサーバーを実行できるようにする必要があります。
これを行う方法はありますか?
回答:
(これらの方法のいくつかは他の回答で言及されています;私はいくつかの可能な選択肢を大まかな優先順位で与えています。)
低ポートを高ポートにリダイレクトし、高ポートでリッスンできます。
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
を作成し、サーバーを実行しているユーザーに対して実行可能にします。またはcreate /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
-A INPUT -p tcp --dport 1080 -j ACCEPT
それ以外の場合は機能しないようなフィルタールールも追加する必要がありました(-j DROP
キャッチオールもあります)。したがって、2つのリッスンソケットが残っています。
簡単な答えは、これは設計上不可能だということです。
長い答えは、オープンソースの世界では、多くの人々が設計を試し、別の方法を考え出しているということです。一般に、これは可能ではないことが広く受け入れられている慣行です。あなたがしようとしているという事実は、おそらくあなたのシステムに別の設計上の欠陥があることを意味し、* nixのベストプラクティスとセキュリティの意味に照らしてシステム全体のアーキテクチャを再検討する必要があります。
ただし、低いポートへの非ルートアクセスを許可するプログラムの1つはauthbindです。selinuxとgrsecurityの両方は、このような微調整された認証のフレームワークも提供します。
最後に、特定のユーザーに特定のプログラムをrootとして実行させたい場合、本当に必要なのは、ユーザーにapacheなどを再起動させることだけsudo
です。
あなたは使うことができnetcatをまたはxinetdまたはiptablesのポート転送を、またはフロントエンドプロキシとしてApacheを使用し、非特権ポートでプロセスを実行します。
Authbind、@ Gillesは既に言及しましたが、少し拡張したいと思います。
便利なアクセス制御(マニュアルページの詳細)があります。ポート、インターフェイスアドレス、uid、アドレスまたはポートの範囲、およびこれらの組み合わせでアクセスをフィルタリングできます。
非常に便利なパラメーターがあります--depth
:
-深さレベル
呼び出しグラフの深さのレベルにあるプログラムにauthbindを影響させます。デフォルトは1です。
「レベルの深さ」とは、スクリプト(またはプログラム)がレベルを下る別のスクリプトを実行することを意味します。したがって、--depth 5
レベル1(または0ですか?)から5までを意味する場合、バインドする許可がありますが、レベル6以降ではそうではありません。スクリプトにアクセスさせたいが、知識の有無にかかわらず実行するプログラムにはアクセスさせたくない場合に役立ちます。
たとえば、次のようなものがあります。セキュリティのために、java
javaを実行するだけのユーザーがいて、ポート80へのアクセスを許可したい場合:
echo > /etc/authbind/byport/80
chown root:java /etc/authbind/byport/80
chmod 710 /etc/authbind/byport/80
を作成し../byport/80 file
、java
ユーザーグループに指定し(各ユーザーには独自のグループがあります)、グループごとに実行可能にしました。つまり、ユーザーごとに実行可能java
です。ポートごとにアクセスを許可する場合、ファイルはアクセス権を持つ必要があるユーザーによって実行可能である必要があるため、それを行いました。
これは平均的なJoeには十分かもしれませんが、--depth
パラメーターの使用方法を知っているため、(java
ユーザーとして)実行authbind --depth [depth] my_web_app's_start_script
し--depth 1
、動作する最小の深さを見つけて使用するまで作業を進めます。
iptables PREROUTING REDIRECTメソッドを試しましたが、転送されたパケットにも影響することがわかりました。つまり、マシンがインターフェース間でパケットを転送している場合(たとえば、イーサネットネットワークに接続されたWi-Fiアクセスポイントとして機能している場合)、iptablesルールはインターネット接続先への接続クライアントの接続もキャッチし、それらをリダイレクトしますこの機械。それは私が望んだものではありません。マシン自体に向けられた接続のみをリダイレクトしたかったのです。
1つの可能性は、TCPポート転送を使用することです。例socat
:
socat TCP4-LISTEN:www,reuseaddr,fork TCP4:localhost:8080
ただし、この方法の欠点の1つは、ポート8080でリッスンしているアプリケーションが着信接続の送信元アドレスを認識しないことです(たとえば、ログ記録やその他の識別目的)。