非特権ユーザーが特権ポート(1024未満のポート番号)へのバインドを許可されないのは、標準的な動作です。したがって、たとえばポート80にバインドするアプリケーションは、このポートにバインドするために、特権付きで実行する必要があります(通常、これはルートとして実行することを意味します)。
一般的なアプローチは、接続を受け入れ、次に非特権プロセスを生成して要求を処理する特権ユーザーで小さな「リスナー」プロセスを実行することです。セキュリティ上の理由から、リクエスト処理の権限の削除は行われます。誰かがリクエストを処理するプロセスを悪用できる場合、通常は侵入者が処理プロセスと同じ特権を使用してコマンドを実行できるようにします。したがって、特権プロセスを使用してリクエスト全体を処理するのは良くありません。
ただし、多くのアプリケーションでは、現在、非ルートとして実行するのが一般的です。ただし、このようなプロセスは、標準構成では特権ポートにバインドできません。したがって、TomcatやJBossなどのサーバーは、代わりに8080などのハイポートにバインドするため、特権リスナーは必要ありません。
もちろん、このようなプロセスをインターネットに公開すると、HTTPプロトコルが使用されている場合、各ブラウザが最初にポート80に接続しようとするため、ポート80でアクセスを提供する可能性があります。これを実現するための一般的な回避策は、アプリケーションとパブリックインターネットの間にファイアウォールまたはポートトランスレータを使用することです。したがって、リクエストはポート80をリクエストするファイアウォールにヒットしますが、ファイアウォールはポート8080の一部の内部ホストにリクエストを転送します。このようにして、実際のWebサーバーはポート80で公に利用可能でありながらハイポートで動作できます。
- (internet request) ----> (port 80)[Firewall] ------> (port 8080)[Webserver]
時々、このリダイレクトは単にiptables
NATルールを使用して行われます:
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
、を参照してください。