Serveurs web en mode noyau: une optimisation intelligente ou un cauchemar de sécurité?

28

Je lisais un fil de discussion Hacker News où un utilisateur publie un lien de 2011 expliquant que IIS est beaucoup plus rapide que la plupart des autres serveurs Web (* nix). Un autre utilisateur répond, expliquant que IIS obtient cet avantage en ayant un module de noyau appelé HTTP.sys . À ma connaissance, la plupart des autres serveurs Web populaires en 2015 ne le font pas.

Je ne voudrais jamais écrire un serveur Web en mode noyau, car je ne pourrais jamais me faire confiance pour le rendre exempt d'exploits de sécurité (ce qui serait moins grave en cours d'exécution dans un anneau de protection inférieur).

Du point de vue de l'ingénieur logiciel (par opposition à un client pour les serveurs Web), l'exécution en mode noyau est-elle une décision de performance intelligente? Les problèmes de sécurité peuvent-ils être atténués dans le développement d'applications au point de faire d'un serveur en mode noyau un bénéfice net pour le consommateur?

James Mishra
la source
5
"Server Fault est un site de questions et réponses pour les administrateurs système et réseau." Sysadmins et les administrateurs réseau n'écrire des serveurs Web; ils les installent et les entretiennent. Je pense que la question du mode noyau / mode utilisateur est beaucoup plus pertinente au moment du développement qu'au moment de l'installation. Cela ne me dérange pas que la question soit déplacée dans un endroit plus pertinent, mais je pense que Server Fault ne le trouvera pas non plus sur le sujet.
James Mishra
Ok, relisant la question à nouveau, je suppose qu'elle peut être interprétée comme une question générale sur l'architecture logicielle, et non pas comme une question sur les avantages et les inconvénients des serveurs Web existants, alors j'ai retiré mon vote serré. Mais vous pourriez envisager de modifier votre question pour mettre en évidence l'aspect général de l'architecture logicielle.
Doc Brown
2
Quiconque pense que le serveur Web en mode noyau pourrait améliorer les performances car il n'a pas à changer de contexte devrait lire: Les nombres de latence que tous les programmeurs devraient connaître . Le changement de contexte complet sous Linux coûte environ 3000 ns ( source ), mais de nombreux appels système n'ont pas réellement besoin d'un changement de contexte complet et peuvent descendre jusqu'à 50 ns, je n'ai pas de chiffres pour Windows. C'est quelque part le long de la 2e / 3e colonne. Conclusion: minimisez la demande réseau et le disque, ne vous inquiétez pas des changements de contexte.
Lie Ryan

Réponses:

24

Http.sys n'est pas tant un serveur Web qu'un proxy-forwarder. Il est conçu pour permettre à de nombreux serveurs Web de coexister sur une boîte Windows, vous pouvez donc avoir IIS exécutant un site Web, mais aussi plusieurs services WCF fonctionnant avec des interfaces http / REST ou SOAP, le tout sur le port standard 80. (c'est pourquoi vous ne peut pas exécuter Apache sur Windows sans un peu de malaise, Apache n'a pas été modifié pour fonctionner avec ce système d'enregistrement, dommage qu'il n'ait pas été rendu plus transparent pour les applications et nécessite des modifications assez complexes pour s'y connecter).

La façon dont cela fonctionne est que vous enregistrez une URL avec elle et l'application correspondante, et lorsqu'une demande http est effectuée sur le port 80, http.sys l'accepte mais transmet ensuite la demande à l'application enregistrée pour gérer cette cible URL.


Je doute qu'un serveur Web en mode noyau ait un sens - même si les performances du socket peuvent être améliorées de cette manière, afin d'effectuer tout travail utile, la logique d'application va toujours être exécutée dans l'espace utilisateur, donc il y a toujours une transition - vous '' Je l'ai juste déplacé un peu le long de la pile d'appels.

gbjbaanb
la source
11
Le principal avantage d'un serveur complet en mode noyau est de servir des fichiers statiques: cela peut être fait sans passer en mode utilisateur. Le cache est également possible.
Jules
3
Je pense que HTTP.sys est d'une époque où les cycles du processeur étaient beaucoup plus rares ... Même lorsqu'il sert de petits fichiers statiques (ce qui est le cas le plus avantageux pour HTTP.sys), un serveur HTTP en mode entièrement utilisateur maximiserait probablement la plupart des réseaux .
usr
4
@usr Http.sys est une chose relativement nouvelle, introduite dans Windows Server 2003. Je suis sûr que c'est là pour que vous puissiez exécuter de nombreux services d'API Web en écoutant sur le port 80 simultanément.
gbjbaanb
2
@gbjbaanb, un serveur en mode utilisateur pourrait également permettre cela. Windows a la possibilité de partager la mémoire (pour les tampons) et de passer un handle de socket à un processus différent.
usr
1
@JamesMishra Dans mon esprit, oui. À l'époque, les processeurs étaient probablement 10 fois moins puissants. De plus, l'état d'esprit en matière de sécurité n'était pas vraiment là. Aujourd'hui, c'est juste un mauvais appel.
usr
14

Http.sys n'est pas le seul serveur Web en mode noyau disponible: sous Linux, il y a aussi tux . Comme vous l'avez correctement identifié, la sécurité est un problème avec ces types de serveurs, ce qui a conduit à ce que tux ne soit pas inclus dans le noyau Linux principal (et je ne pense pas qu'il soit mis à jour pour les versions de noyau plus récentes).

Une meilleure solution consisterait à utiliser un système d'exploitation qui ne repose pas sur la protection matérielle pour assurer la sécurité des processus, par exemple la singularité de Microsoft: un tel système permettrait les gains d'efficacité d'un serveur en mode noyau sans les risques de sécurité. Malheureusement, aucun système d'exploitation prêt à la production basé sur ce principe n'est disponible à partir de 2015, et AFAIK personne n'y travaille sérieusement non plus (le projet Singularity a été annulé).

Jules
la source
Le gros problème avec l'approche de la singularité est qu'elle signifie qu'un mais dans le JITter peut facilement conduire à une escalade de privilèges.
CodesInChaos
2
L'article de Tux Wikipedia est une lecture intéressante. Tux peut transmettre des requêtes HTTP pour du contenu non statique à un "vrai" serveur Web comme Apache, ce qui ressemble à ce à quoi Http.sys est utilisé. Je ne peux pas dire si Tux était aussi performant que Http.sys, mais d'après le peu que j'ai lu, il semble que les développeurs du noyau Linux seraient en désaccord avec la décision de Microsoft.
James Mishra
10

Http.sys est à faible risque, car il ne peut exécuter aucune copie fournie par un tiers.

Http.sys effectue quelques tâches.

  • Il agit comme un proxy-forwarder, permettant ainsi à plusieurs processus de répondre à la demande de différentes parties de l'espace de noms HTTP. La réponse gbjbaanb couvre bien cela.

  • Il sert des fichiers statiques, directement depuis le cache des fichiers Windows. Cela fournit une grande accélération pour les petits fichiers statiques, car il n'y a pas de changement de contexte.

  • Il mettra en cache la sortie de toute application vers laquelle il transmettra une demande HTTP et retournera le résultat encaissé. L'application contrôle totalement la durée (le cas échéant) de la mise en cache.

Http.sys est conçu pour effectuer les tâches simples TRÈS rapidement, tout en passant tout le reste à un processus dans l'espace utilisateur.

En réponse au commentaire

"faible risque, car il ne peut exécuter aucun code fourni par un tiers" - c'est ce qu'ils disent toujours, et ce n'est presque jamais vrai.

Le problème est que vous devez faire confiance à Microsoft pour écrire du code de noyau complexe pour poser cette question, sinon vous décidez de ne pas utiliser Windows pour l'hébergement du tout . Http.sys ajoute très peu au risque de bogues du noyau, étant donné la complexité du noyau de toute façon.

Si quelque chose Http.sys réduit le risque, car il y a une telle séparation claire sous le service Web et le code d'application «bas niveau».

Dans une configuration bien conçue, la machine (ou le serveur virtuel) qui exécute le serveur Web a un accès très limité au reste du réseau, car il s'agit d'une cible à haut risque. Cela fait très peu de différence si le noyau ou un serveur Web en mode utilisateur est piraté, car le serveur ne devrait plus avoir de «droits» sur le réseau, alors le processus en mode utilisateur du serveur Web doit faire son travail.

Ian
la source
1
Les applications en mode utilisateur sont souvent écrites dans des langages sécurisés qui excluent la plupart des bogues basés sur la corruption de mémoire (ce sont généralement ceux qui conduisent à l'exécution de code à distance).
CodesInChaos
3
Je ne sais pas si j'achète l'argument selon lequel si je fais confiance à Microsoft pour écrire du code noyau, que c'est un petit saut de leur faire confiance pour écrire du code de serveur web en mode noyau. Je suis assez naïf du point de vue de la sécurité de l'information, mais j'imagine qu'il serait beaucoup plus facile d'armer un débordement de tampon dans Http.sys que dans un pilote de périphérique ou une autre partie du noyau plus éloignée d'Internet.
James Mishra