特定のip:portでWebサーバーを起動するためにsudoが必要なのはなぜですか?


9

DebianボックスにPythonベースのウェブサーバーをセットアップしています。

セットアップ:

  • Debian OSはVMベースですが、VirtualBoxをNATからブリッジに切り替えました。
  • VMセットアップのIP = 192.168.1.7(ルーターの管理画面またはごとifconfig)。
  • ルーターのポート転送をsshとHTTPの両方に正常に設定しました。
  • dyndns.comを使用してルーターの動的DNSを正常に設定しました。

私が使用している特定のPython Webサーバー(Django、CherryPy、標準ライブラリ)に関係なく、を使用してWebサーバーを192.168.1.7:80で起動する必要がありsudoます。そうしないと、ポートにアクセスする権限がないというエラーが発生します。sudoip:portを指定するときに使用する必要があると言及しているWebサーバーチュートリアルはありません。

質問:sudoこれらのウェブサーバーを起動するのになぜ使用する必要があるのですか?使用してはいけないということ192.168.1.7ですか?または、どこかに設定ファイルを正しく設定していないのですか?

回答:


11

root権限を持つプロセスだけが特権ポートで待機できます。これは標準のUnixセキュリティ規約です。


80でsudoを使用してWebサーバーを起動することは一般的ですか?または、1024を超えるポート(8000、8080など)を使用する他の戦略はありますか?
Begbie00

@ Begbie00はい、より高いポートでWebサーバーを実行することは非常に一般的です。ただし、主にインターネット上で一般公開されていないWebサーバー、またはユーザーにroot権限がないマシンで実行されているWebサーバーに使用されます。開発およびテストに使用されるWebサーバーは、ほとんど特権のないポートでのみ実行されます。
サイモン・トス

2
残念ながら、この説明は最近のUNIXシステムには完全には当てはまりません。詳細については私の回答を参照してください。たとえば、最新のLinuxでは、CAPABILITIESを使用してよりきめ細かい権限制御が可能です。また、SolarisはRBACと呼ばれるきめ細かなセキュリティシステムを備えています。これらのメカニズムにより、特権ポートへのバインドなどのアクセス許可を特定のユーザーまたはプログラムに割り当てることができます。
SkyBeam、

14

非特権ユーザーが特権ポート(1024未満のポート番号)へのバインドを許可されないのは、標準的な動作です。したがって、たとえばポート80にバインドするアプリケーションは、このポートにバインドするために、特権付きで実行する必要があります(通常、これはルートとして実行することを意味します)。

一般的なアプローチは、接続を受け入れ、次に非特権プロセスを生成して要求を処理する特権ユーザーで小さな「リスナー」プロセスを実行することです。セキュリティ上の理由から、リクエスト処理の権限の削除は行われます。誰かがリクエストを処理するプロセスを悪用できる場合、通常は侵入者が処理プロセスと同じ特権を使用してコマンドを実行できるようにします。したがって、特権プロセスを使用してリクエスト全体を処理するのは良くありません。

ただし、多くのアプリケーションでは、現在、非ルートとして実行するのが一般的です。ただし、このようなプロセスは、標準構成では特権ポートにバインドできません。したがって、TomcatやJBossなどのサーバーは、代わりに8080などのハイポートにバインドするため、特権リスナーは必要ありません。

もちろん、このようなプロセスをインターネットに公開すると、HTTPプロトコルが使用されている場合、各ブラウザが最初にポート80に接続しようとするため、ポート80でアクセスを提供する可能性があります。これを実現するための一般的な回避策は、アプリケーションとパブリックインターネットの間にファイアウォールまたはポートトランスレータを使用することです。したがって、リクエストはポート80をリクエストするファイアウォールにヒットしますが、ファイアウォールはポート8080の一部の内部ホストにリクエストを転送します。このようにして、実際のWebサーバーはポート80で公に利用可能でありながらハイポートで動作できます。

- (internet request) ----> (port 80)[Firewall] ------> (port 8080)[Webserver]

時々、このリダイレクトは単にiptablesNATルールを使用して行われます:

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

これにより、ポート8080でリッスンしている非特権アプリケーションを実行できますが、ポート80に対するすべての着信要求はポート8080にリダイレクトされます。

ただし、最新のLinuxカーネルを使用すると、別の可能性があります。機能を使用することです。

setcap CAP_NET_BIND_SERVICE=+ep /some/webserver/binary

これによりbinary、非rootユーザーから起動した場合でも、特権ポートにバインドできます。詳細についてはman capabilities、を参照してください。


機能はPOSIXの一部ですか、それともLinux固有ですか?
サイモン・トス

@Let_Me_Be en.wikipedia.org/wiki/Capability-based_securityから理解できるように、POSIXは機能ベースの概念を定義していますが、これはLinuxに実装されているものとは異なります。したがって、CAP_NET_BIND_SERVICEなどのLinux機能はLinux固有のみであると思います。
SkyBeam、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.