C で独自の Web サーバーを作成しました。セキュリティが侵害されないように (バッファー オーバーフローなど)、root にならずにポート 80 にバインドするにはどうすればよいですか?
ポート 80 で動作する別の「安定した」サーバーからのトラフィックを単純に転送する必要がありますか?
フォワードプロキシを使用することは、確かに最も簡単で最も推奨されるソリューションです。また、自分で作成したサーバーに到達する前に、ひどく無効なリクエストをフィルタリングするという利点もあります。
アプリケーションがユーザーのIPアドレスを何かに使用する場合は、Webサーバーが使用するヘッダー(X-Client-IP
など)からIPアドレスを取得することを忘れないでください。ただし、実際にWebサーバーから送信されたリクエストに対してのみ実行してください。そうしないと、ユーザーがIPをスプーフィングする可能性があります。これを行うには、リクエストがIPから送信されたかどうかを確認し、この場合はヘッダーのみを確認するか、アプリケーションをローカルホストにバインドします。
CAP_NET_BIND_SERVICE
別の解決策は、プログラムに機能を付与することです。これを使用するにはrootが必要setcap cap_net_bind_service=ep /path/to/the/executable
です-フラグはファイルシステム属性に格納されているため、ファイルを別のシステムにコピーしたり、アプリケーションを再コンパイルしたりすると、フラグは失われます。
もちろん、プログラムをsetuid rootにして、を呼び出した直後に非特権ユーザーに切り替えることもできますbind()
。ただし、プログラムの動作と動作によっては、これは適切ではない場合があります。たとえば、何らかの理由でリスニングソケットを閉じて再度開く必要がある場合は、プロセスを完全に再起動する必要があります。
root として呼び出してからbind()
特権を削除する代わりに、ソケットを作成してバインドし、メッセージを使用して UNIX ドメイン ソケット接続を介してリッスンしているソケットを特権のないプロセスに渡す root プロセスを用意することもできSCM_RIGHTS
ます。
ご存じのように、Unix の 1024 未満のすべてのポートを開くには root 権限が必要です。Unix システムでは、root 権限で実行するアプリケーションをできるだけ少なくしたくありません。それは常に大きな安全上のリスクです。
別の方法として、iptables を使用して、ポート 80 のトラフィックを 8080 などのより無害なポートにリダイレクトする方法があります。設定方法は次のとおりです。
iptables はセットアップが最も簡単なツールではありませんが、一度マスターすれば、非常に便利で強力な (そして安全な) ツールです。