カーネルモードWebサーバー:巧妙な最適化またはセキュリティの悪夢?


28

私は、1人のユーザーが2011年からリンクを投稿し、IISが他のほとんどの(* nix)Webサーバーよりはるかに速いことを説明するHacker Newsスレッドを読んでいまし。別のユーザーは、HTTP.sysというカーネルモジュールを持つことでIISがその利点を得ると説明します。私の知る限り、2015年に他のほとんどの一般的なWebサーバーはこれを行いません。

カーネルモードのWebサーバーを作成したくありません。セキュリティエクスプロイト(低い保護リングでの実行はそれほど深刻ではない)から解放されると自分を信頼することはできません。

ソフトウェアエンジニアの観点から(Webサーバーの顧客とは対照的に)、カーネルモードで実行するのは賢明なパフォーマンス決定ですか?カーネルモードサーバーを消費者の純利益にするという点まで、アプリケーション開発でセキュリティの懸念を緩和できますか?


5
「サーバー障害は、システムおよびネットワーク管理者向けの質問と回答サイトです。」システム管理者とネットワーク管理者はWebサーバーを作成しません。それらをインストールして保守します。カーネルモード/ユーザーモードの問題は、インストール時よりも開発時のほうがはるかに重要だと思います。質問をもっと関連性のある場所に移動させても構いませんが、Server Faultはトピックでもそれを見つけられないと感じています。
ジェームズミシュラ

質問をもう一度読み直すと、既存のWebサーバーの長所と短所についての質問としてではなく、一般的なソフトウェアアーキテクチャの質問として解釈できると思います。ただし、一般的なソフトウェアアーキテクチャの側面を強調するために質問を編集することを検討してください。
ドックブラウン

2
カーネルモードWebサーバーはコンテキストスイッチを必要としないため、パフォーマンスを向上できると考えている人は誰でも読んでください。Linuxでのフルコンテキストスイッチのコストは約3000ns(source)ですが、多くのシステムコールは実際にはフルコンテキストスイッチを必要としません。これは、2/3列のどこかにあります。結論:ネットワーク要求とディスクを最小限に抑え、コンテキストの切り替えを心配しないでください。
ライライアン

回答:


24

Http.sysはWebサーバーではなく、プロキシフォワーダーです。Windowsボックスに多くのWebサーバーが共存できるように設計されているため、Webサイトを実行するIISだけでなく、http / RESTまたはSOAPインターフェイスで実行されるいくつかのWCFサービスをすべて標準ポート80で実行できます(これが理由です少し揺れずにWindowsでApacheを実行することはできません。Apacheはこの登録システムで動作するように変更ていません。アプリケーションに対して透過的でなく、フックするにはかなり複雑な変更が必要です。

それが機能する方法は、それと対応するアプリケーションでURLを登録することです.httpリクエストがポート80で行われると、http.sysはそれを受け入れますが、そのURLターゲットを処理するために登録されているアプリケーションにリクエストを渡します。


カーネルモードのWebサーバーが意味をなさないことを疑います-この方法でソケットのパフォーマンスを改善できたとしても、有用な作業を実行するために、アプリケーションロジックはユーザースペースで実行されるため、常に移行が行われます- veはコールスタックに沿って少しシフトしました。


11
カーネルモードのフルサーバーの主な利点は、静的ファイルを提供することです。これは、ユーザーモードに切り替えることなく実行できます。キャッシュも可能です。
ジュール

3
HTTP.sysはCPUサイクルがはるかに少ない時代のものだと思います...小さな静的ファイル(HTTP.sysの最も有利なケース)を提供する場合でも、完全ユーザーモードのHTTPサーバーはおそらくほとんどのネットワークを最大限に活用できます。 。
usr

4
@usr Http.sysはWindows Server 2003で導入された比較的新しいものです。ポート80でリッスンしている多くのWeb APIサービスを同時に実行できるようになっていると確信しています。
gbjbaanb

2
@gbjbaanbユーザーモードサーバーもそれを許可できます。Windowsには、メモリ(バッファ用)を共有し、ソケットハンドルを別のプロセスに渡す機能があります。
usr

1
@JamesMishra私の考えでは、はい。当時のCPUはおそらく10倍以上強力ではありませんでした。また、セキュリティの考え方は実際にはありませんでした。今日それはただの悪い電話です。
usr

14

Http.sysは、利用可能な唯一のカーネルモードWebサーバーではありません。Linuxではtuxあります。正しく特定したように、セキュリティはこれらの種類のサーバーの懸念事項であり、メインラインLinuxカーネルにtuxが含まれていないことにつながります(最新のカーネルバージョンでは更新されていないと思います)。

より良い解決策は、ハードウェア保護に依存しないオペレーティングシステムを使用してプロセスのセキュリティを実施することです。たとえば、Microsoftの特異性:このようなシステムは、セキュリティリスクなしでカーネルモードサーバーの効率向上を可能にします。残念ながら、2015年の時点では、この原則に基づくプロダクション対応のオペレーティングシステムは利用できず、AFAIKでも真剣に取り組んでいる人はいません(Singularityプロジェクトはキャンセルされました)。


Singularityアプローチの大きな問題は、それがJITter内では権限昇格に簡単につながる可能性があることを意味することです。
CodesInChaos

2
Tuxウィキペディアの記事は興味深い読み物です。Tuxは、静的でないコンテンツのHTTPリクエストをApacheなどの「実際の」Webサーバーに転送できます。これは、Http.sysが使用されているように聞こえます。TuxがHttp.sysほどの性能を備えているかどうかはわかりませんが、私が読んだことからすると、Linuxカーネル開発者はMicrosoftの決定に鋭く異論を唱えるようです。
ジェームズミシュラ

10

Http.sysは、サードパーティが提供するコープを実行できないため、リスクが低いです。

Http.sysはいくつかのタスクを実行します。

  • プロキシフォワーダとして機能するため、複数のプロセスがHTTPネームスペースのさまざまな部分への要求に応答できます。gbjbaanbの答えはこれをうまくカバーしています。

  • Windowsファイルキャッシュから直接静的ファイルを提供します。これにより、コンテキストの切り替えがないため、小さなファイルの静的ファイルの速度が大幅に向上します。

  • HTTP要求を転送するアプリケーションからの出力をキャッシュし、キャッシュされた結果を返します。アプリケーションは、キャッシングの持続時間(存在する場合)を完全に制御します。

Http.sysは、他のすべてをユーザー空間のプロセスに渡しながら、単純なタスクを非常に高速に実行するように設計されています。

コメントに応えて

「サードパーティが提供するコードを実行できないため、リスクが低い」-彼らは常にそう言っており、ほとんど真実ではありません。

問題は、Microsoftがこの質問をする複雑なカーネルコードを書くことを信頼する必要があることです。そうしないと、WebホスティングにWindowsをまったく使用しないことにします。Http.sysは、カーネルの複雑さを考えると、カーネルバグのリスクをほとんど追加しません。

「低レベル」のWebサービスとアプリケーションコードの間に明確な分離があるため、Http.sysがリスクを軽減します。

適切に設計されたセットアップでは、Webサーバーを実行するマシン(または仮想サーバー)は、リスクの高いターゲットであるため、ネットワークの他の部分へのアクセスが非常に制限されます。カーネルまたはユーザーモードのWebサーバーがハッキングされても、サーバーにネットワーク上の「権利」はないはずなので、Webサーバーのユーザーモードプロセスがその作業を行う必要があるため、ほとんど違いはありません。


1
ユーザーモードアプリケーションは、ほとんどのメモリ破損に基づくバグを排除するタイプセーフ言語で書かれていることがよくあります(通常、これらはリモートコード実行につながるバグです)。
CodesInChaos

3
マイクロソフトがカーネルコードを書くことを信頼するなら、カーネルモードのWebサーバーコードを書くことを信頼するのは小さなジャンプであるという議論を買うかどうかはわかりません。情報セキュリティの観点からはかなり単純ですが、Http.sysのバッファオーバーフローを武器にする方が、デバイスドライバーやインターネットから離れたカーネルの他の部分よりもはるかに簡単だと思います。
ジェームズミシュラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.