Servidores web en modo kernel: ¿una optimización inteligente o una pesadilla de seguridad?

28

Estaba leyendo un hilo de Hacker News donde un usuario publica un enlace de 2011 explicando que IIS es mucho más rápido que la mayoría de los otros servidores web (* nix). Otro usuario responde, explicando que IIS obtiene esa ventaja al tener un módulo de kernel llamado HTTP.sys . Que yo sepa, la mayoría de los otros servidores web populares en 2015 no hacen esto.

Nunca quisiera escribir un servidor web en modo kernel, porque nunca podría confiar en mí mismo para liberarlo de las vulnerabilidades de seguridad (lo que sería menos serio si se ejecutara en un anillo de protección inferior).

Desde la perspectiva del ingeniero de software (a diferencia de un cliente para servidores web), ¿se está ejecutando en modo kernel una decisión de rendimiento inteligente? ¿Se pueden mitigar las preocupaciones de seguridad en el desarrollo de aplicaciones hasta el punto de hacer que un servidor en modo kernel sea una ganancia neta para el consumidor?

James Mishra
fuente
55
"Server Fault es un sitio de preguntas y respuestas para administradores de sistemas y redes". Los administradores de red y los administradores de sistemas no escriben servidores web; los instalan y mantienen Creo que la cuestión del modo kernel / modo de usuario es mucho más relevante en el momento del desarrollo que en el momento de la instalación. No me importa que la pregunta se traslade a otro lugar más relevante, pero siento que Server Fault tampoco la encontrará en el tema.
James Mishra
Bien, volviendo a leer la pregunta nuevamente, supongo que puede interpretarse como una pregunta general de arquitectura de software, y no como una pregunta sobre los pros y los contras de los servidores web existentes, por lo que retracté mi voto cercano. Pero puede considerar editar su pregunta para resaltar el aspecto general de la arquitectura de software.
Doc Brown
2
Cualquiera que piense que el servidor web en modo kernel podría mejorar el rendimiento ya que no tiene que cambiar de contexto debería leer: Números de latencia que todos los programadores deben saber . El cambio de contexto completo en Linux cuesta alrededor de 3000ns ( fuente ), pero muchas llamadas al sistema en realidad no necesitan un cambio de contexto completo y pueden llegar a 50ns, no tengo números para Windows. Esto está en algún lugar a lo largo de la segunda / tercera columna. Conclusión: minimice la solicitud de red y el disco, no se preocupe por los cambios de contexto.
Lie Ryan

Respuestas:

24

Http.sys no es tanto un servidor web como un reenviador de proxy. Está diseñado para permitir que muchos servidores web coexistan en una caja de Windows, por lo que puede hacer que IIS ejecute un sitio web, pero también varios servicios WCF que se ejecutan con interfaces http / REST o SOAP, todo en el puerto estándar 80. (es por eso que no puede ejecutar Apache en Windows sin un poco de movimiento, Apache no se ha modificado para que funcione con este sistema de registro, lástima que no se haya hecho más transparente para las aplicaciones y requiera algunas modificaciones bastante complejas para conectarlo).

La forma en que funciona es que registra una URL con ella y la aplicación correspondiente, y cuando se realiza una solicitud http en el puerto 80, http.sys la acepta pero luego pasa la solicitud a la aplicación que esté registrada para manejar ese objetivo URL.


Dudo que un servidor web en modo kernel tenga sentido, incluso si el rendimiento del socket se puede mejorar de esta manera, para realizar cualquier trabajo útil, la lógica de la aplicación todavía se ejecutará en el espacio del usuario, por lo que siempre hay una transición: usted ' Lo he desplazado un poco a lo largo de la pila de llamadas.

gbjbaanb
fuente
11
El beneficio principal de un servidor completo en modo kernel es servir archivos estáticos: esto se puede hacer sin cambiar al modo de usuario. El almacenamiento en caché también es posible.
Jules
3
Creo que HTTP.sys es de una época en la que los ciclos de CPU eran mucho más escasos ... Incluso cuando se sirven archivos estáticos pequeños (que es el caso más ventajoso para HTTP.sys), un servidor HTTP en modo de usuario completo probablemente maximizaría la mayoría de las redes .
usr
44
@usr Http.sys es algo relativamente nuevo, introducido en Windows Server 2003. Estoy bastante seguro de que está ahí para que pueda ejecutar muchos servicios de API web escuchando en el puerto 80 simultáneamente.
gbjbaanb
2
@gbjbaanb un servidor en modo de usuario también podría permitir eso. Windows tiene la capacidad de compartir memoria (para buffers) y pasar un controlador de socket a un proceso diferente.
usr
1
@JamesMishra En mi mente, sí. En aquel entonces, las CPU probablemente eran> 10 veces menos potentes. Además, la mentalidad de seguridad no estaba realmente allí. Hoy es solo una mala decisión.
Usr
14

Http.sys no es el único servidor web en modo kernel disponible: en Linux también hay esmoquin . Como ha identificado correctamente, la seguridad es una preocupación con este tipo de servidores, lo que ha llevado a que tux no se incluya en el núcleo principal de Linux (y creo que no está actualizado para las versiones más recientes del núcleo).

Una mejor solución sería el uso de un sistema operativo que no dependa de la protección del hardware para hacer cumplir la seguridad del proceso, por ejemplo, la singularidad de Microsoft: un sistema de este tipo permitiría las ganancias de eficiencia de un servidor en modo kernel sin los riesgos de seguridad. Desafortunadamente, a partir de 2015 no hay sistemas operativos listos para la producción basados ​​en este principio, y AFAIK tampoco está trabajando seriamente en ninguno (el proyecto Singularity fue cancelado).

Jules
fuente
El gran problema con el enfoque de Singularidad es que significa que un pero en el JITter puede conducir fácilmente a la escalada de privilegios.
CodesInChaos
2
El artículo de Tux Wikipedia es una lectura interesante. Tux puede reenviar solicitudes HTTP de contenido no estático a un servidor web "real" como Apache, que suena como para qué se utiliza Http.sys. No puedo decir si Tux fue tan eficiente como Http.sys, pero según lo poco que leo, parece que los desarrolladores del kernel de Linux estarían en total desacuerdo con la decisión de Microsoft.
James Mishra
10

Http.sys es de bajo riesgo, ya que no puede ejecutar ninguna copia proporcionada por un tercero.

Http.sys hace algunas tareas.

  • Actúa como un reenviador de proxy, lo que permite que múltiples procesos respondan a la solicitud a diferentes partes del espacio de nombre HTTP. La respuesta de gbjbaanb cubre esto bien.

  • Sirve archivos estáticos, directamente desde el caché de archivos de Windows. Esto proporciona una gran velocidad para archivos estáticos de archivos pequeños, ya que no hay cambios de contexto.

  • Guardará en caché el resultado de cualquier aplicación a la que reenvíe una solicitud HTTP y devolverá el resultado cobrado. La aplicación tiene el control total sobre cuánto tiempo (si corresponde) dura el almacenamiento en caché.

Http.sys está diseñado para hacer las tareas simples MUY rápido, mientras pasa todo lo demás a un proceso en el espacio del usuario.

En respuesta al comentario

"bajo riesgo, ya que no puede ejecutar ningún código proporcionado por un tercero" - Eso es lo que siempre dicen, y casi nunca es cierto.

El problema es que debe confiar en que Microsoft escribirá un código de kernel complejo para hacer esta pregunta, de lo contrario, decide no usar Windows para el alojamiento web. . Http.sys agrega muy poco al riesgo de errores del núcleo, dado lo complejo que es el núcleo de todos modos.

En todo caso, Http.sys reduce el riesgo, ya que existe una separación tan clara por debajo del código de aplicación y servicio web de "bajo nivel".

En una configuración bien diseñada, la máquina (o servidor virtual) que ejecuta el servidor web tiene un acceso muy limitado al resto de la red, ya que es un objetivo de alto riesgo. Se hace muy poco diferente si el kernel o un servidor web en modo de usuario es pirateado, ya que el servidor no debería tener más "derechos" en la red, entonces el proceso en modo de usuario del servidor web debe hacer su trabajo.

Ian
fuente
1
Las aplicaciones de modo de usuario a menudo se escriben en lenguajes seguros para escribir que descartan la mayoría de los errores basados ​​en la corrupción de memoria (estos son típicamente los que conducen a la ejecución remota de código).
CodesInChaos
3
No estoy seguro si compro el argumento de que si confío en Microsoft para escribir el código del kernel, es un pequeño salto confiar en ellos para escribir el código del servidor web en modo kernel. Soy bastante ingenuo desde la perspectiva de la seguridad de la información, pero imagino que sería mucho más fácil utilizar un desbordamiento de búfer en Http.sys que en un controlador de dispositivo o en alguna otra parte del núcleo más lejos de Internet.
James Mishra