Kernelmodus-Webserver: Eine clevere Optimierung oder ein Sicherheits-Albtraum?

28

Ich habe einen Hacker News-Thread gelesen, in dem ein Benutzer einen Link aus dem Jahr 2011 veröffentlicht und erklärt, dass IIS viel schneller ist als die meisten anderen (* nix) Webserver. Ein anderer Benutzer antwortet und erklärt, dass IIS diesen Vorteil durch ein Kernelmodul mit dem Namen HTTP.sys erzielt . Meines Wissens nach tun dies die meisten anderen beliebten Webserver im Jahr 2015 nicht.

Ich würde niemals einen Kernel-Modus-Webserver schreiben wollen, weil ich mir niemals zutrauen könnte, dass er frei von Sicherheits-Exploits ist (was weniger ernst ist, wenn er in einem niedrigeren Schutzring ausgeführt wird).

Läuft aus Sicht des Software-Entwicklers (im Gegensatz zu einem Kunden für Webserver) im Kernel-Modus eine intelligente Leistungsentscheidung? Können Sicherheitsbedenken bei der Anwendungsentwicklung so weit beseitigt werden, dass ein Kernel-Modus-Server einen Nettogewinn für den Verbraucher darstellt?

James Mishra
quelle
5
"Serverfehler ist eine Frage-und-Antwort-Site für System- und Netzwerkadministratoren." Sysadmins und Netzwerkadministratoren schreiben keine Webserver. Sie installieren und warten sie. Ich denke, die Frage des Kernel- / Benutzermodus ist zur Entwicklungszeit viel relevanter als zur Installationszeit. Es macht mir nichts aus, wenn die Frage an einen relevanteren Ort verschoben wird, aber ich habe das Gefühl, dass Server Fault sie auch nicht zum Thema findet.
James Mishra
Ok, wenn ich die Frage noch einmal durchlese, kann sie vermutlich als allgemeine Frage zur Softwarearchitektur interpretiert werden und nicht als Frage zu den Vor- und Nachteilen bestehender Webserver. Deshalb habe ich meine enge Abstimmung zurückgezogen. Sie können Ihre Frage jedoch bearbeiten, um den allgemeinen Aspekt der Softwarearchitektur hervorzuheben.
Doc Brown
2
Jeder, der der Meinung ist, dass der Kernel-Modus-Webserver die Leistung verbessern könnte, da er nicht den Kontext wechseln muss, sollte lesen: Latenzzahlen, die jeder Programmierer kennen sollte . Ein vollständiger Kontextwechsel unter Linux kostet ungefähr 3000 ns ( Quelle ), aber viele Syscalls benötigen keinen vollständigen Kontextwechsel und können bis zu 50 ns dauern. Ich habe keine Zahlen für Windows. Dies ist irgendwo entlang der 2./3. Spalte. Fazit: Minimieren Sie Netzwerkanfragen und Festplatten, sorgen Sie sich nicht um Kontextwechsel.
Lie Ryan

Antworten:

24

Http.sys ist weniger ein Webserver als ein Proxy-Forwarder. Es ist so konzipiert, dass auf einer Windows-Box viele Webserver gleichzeitig vorhanden sind, sodass IIS eine Website ausführen kann, aber auch mehrere WCF-Dienste, die mit http / REST- oder SOAP-Schnittstellen ausgeführt werden kann Apache unter Windows nicht ohne ein bisschen Wackeln ausführen, Apache wurde nicht für dieses Registrierungssystem modifiziert , schade, dass es für Anwendungen nicht transparenter gemacht wurde und einige recht komplexe Modifikationen erfordert, um es zu verwenden).

Die Art und Weise, wie es funktioniert, ist, dass Sie eine URL mit dieser und der entsprechenden Anwendung registrieren. Wenn eine http-Anfrage an Port 80 gestellt wird, akzeptiert http.sys diese Anfrage, leitet sie dann aber an diejenige Anwendung weiter, die registriert ist, um dieses URL-Ziel zu behandeln.


Ich bezweifle, dass ein Webserver im Kernel-Modus Sinn macht. Auch wenn die Socket-Leistung auf diese Weise verbessert werden kann, wird die Anwendungslogik im Benutzerbereich ausgeführt, sodass es immer einen Übergang gibt. Ich habe es nur ein wenig im Callstack verschoben.

gbjbaanb
quelle
11
Der Hauptvorteil eines vollständigen Servers im Kernelmodus liegt in der Bereitstellung statischer Dateien: Dies kann ohne den Wechsel in den Benutzermodus erfolgen. Cache ist ebenfalls möglich.
Jules
3
Ich denke, HTTP.sys stammt aus einer Zeit, in der die CPU-Zyklen viel seltener waren ... Selbst wenn kleine statische Dateien bereitgestellt werden (was für HTTP.sys am vorteilhaftesten ist), würde ein HTTP-Server im Vollbenutzermodus wahrscheinlich die meisten Netzwerke ausschöpfen .
USR
4
@usr Http.sys ist eine relativ neue Sache, die in Windows Server 2003 eingeführt wurde. Ich bin mir ziemlich sicher, dass es dort vorhanden ist, sodass Sie viele Web-API-Dienste ausführen können, die gleichzeitig auf Port 80 lauschen.
gbjbaanb
2
@gbjbaanb Ein Server im Benutzermodus könnte dies auch zulassen. Windows kann den Speicher (für Puffer) gemeinsam nutzen und ein Socket-Handle an einen anderen Prozess übergeben.
USR
1
@ JamesMishra In meinen Gedanken ja. CPUs waren damals wahrscheinlich> 10x weniger leistungsfähig. Auch das Sicherheitsdenken war nicht wirklich da. Heute ist es nur ein schlechter Anruf.
USR
14

Http.sys ist nicht der einzige verfügbare Kernel-Mode-Webserver: Unter Linux gibt es auch tux . Wie Sie richtig erkannt haben, ist die Sicherheit ein Problem mit diesen Servertypen, was dazu geführt hat, dass tux nicht im Linux-Hauptkernel enthalten ist (und ich glaube, dass es für neuere Kernelversionen nicht aktualisiert wurde).

Eine bessere Lösung wäre die Verwendung eines Betriebssystems, das keinen Hardwareschutz zur Durchsetzung der Prozesssicherheit benötigt, z. B. die Singularität von Microsoft: Ein solches System würde die Effizienzgewinne eines Kernel-Modus-Servers ohne Sicherheitsrisiken ermöglichen. Leider gibt es ab 2015 keine produktionsbereiten Betriebssysteme, die auf diesem Prinzip basieren, und auch an einem arbeitet AFAIK niemand ernsthaft (das Singularity-Projekt wurde abgebrochen).

Jules
quelle
Das große Problem beim Singularity-Ansatz besteht darin, dass ein aber im JITter leicht zu einer Privilegieneskalation führen kann.
CodesInChaos
2
Der Wikipedia-Artikel von Tux ist eine interessante Lektüre. Tux kann HTTP-Anfragen nach nicht statischen Inhalten an einen "echten" Webserver wie Apache weiterleiten, was so klingt, als würde Http.sys verwendet. Ich kann nicht sagen, ob Tux so performant war wie Http.sys, aber nach dem Wenigen, das ich gelesen habe, scheint es, als würden die Linux-Kernel-Entwickler der Entscheidung von Microsoft scharf widersprechen.
James Mishra
10

"Http.sys" weist ein geringes Risiko auf, da keine von einem Drittanbieter bereitgestellten Funktionen ausgeführt werden können.

Http.sys führt einige Aufgaben aus.

  • Es fungiert als Proxy-Weiterleitung, sodass mehrere Prozesse auf Anforderungen an verschiedene Teile des HTTP-Namensraums reagieren können. Die Antwort von gbjbaanb deckt dies gut ab.

  • Es stellt statische Dateien direkt aus dem Windows-Dateicache bereit. Dies bietet eine große Geschwindigkeitssteigerung für statische Dateien mit kleinen Dateien, da es keine Kontextwechsel gibt.

  • Es wird die Ausgabe von jeder Anwendung zwischengespeichert, an die es eine HTTP-Anforderung weiterleitet, und das eingelöste Ergebnis zurückgeben. Die Anwendung hat die vollständige Kontrolle darüber, wie lange (falls vorhanden) das Caching dauert.

Http.sys wurde entwickelt, um die einfachen Aufgaben SEHR schnell zu erledigen und alles andere an einen Prozess im Benutzerbereich zu übergeben.

Als Antwort auf den Kommentar

"Geringes Risiko, da kein Code von Drittanbietern ausgeführt werden kann" - das wird immer gesagt, und es ist fast nie wahr.

Das Problem ist, dass Sie darauf vertrauen müssen, dass Microsoft komplexen Kernel-Code schreibt, um diese Frage zu stellen. Andernfalls entscheiden Sie sich , Windows überhaupt nicht für das Webhosting zu verwenden . Http.sys erhöht das Risiko von Kernel-Fehlern kaum, da der Kernel ohnehin sehr komplex ist.

Wenn überhaupt, reduziert Http.sys das Risiko, da es eine so klare Trennung zwischen "Low Level" Web-Serving und Anwendungscode gibt.

In einer gut konzipierten Konfiguration hat der Computer (oder virtuelle Server), auf dem der Webserver ausgeführt wird, nur sehr eingeschränkten Zugriff auf den Rest des Netzwerks, da dies ein Ziel mit hohem Risiko ist. Es ist kaum anders, wenn der Kernel oder ein Webserver im Benutzermodus gehackt wird, da der Server keine "Rechte" mehr im Netzwerk haben sollte, dann muss der Webserver-Benutzermodusprozess seine Arbeit erledigen.

Ian
quelle
1
Usermode-Anwendungen werden häufig in typsicheren Sprachen geschrieben, die die meisten auf Speicherbeschädigung basierenden Fehler ausschließen (dies sind normalerweise diejenigen, die zur Remote-Codeausführung führen).
CodesInChaos
3
Ich bin mir nicht sicher, ob ich das Argument kaufe, wenn ich Microsoft vertraue, Kernel-Code zu schreiben, dass es ein kleiner Sprung ist, ihnen zu vertrauen, Kernel-Modus-Webserver-Code zu schreiben. Ich bin aus Sicht der Informationssicherheit ziemlich naiv, aber ich stelle mir vor, es wäre weitaus einfacher, einen Pufferüberlauf in Http.sys zu verhindern, als in einem Gerätetreiber oder einem anderen Teil des Kernels, der weiter vom Internet entfernt ist.
James Mishra