Servidores da web no modo kernel: uma otimização inteligente ou um pesadelo de segurança?

28

Eu estava lendo um tópico do Hacker News em que um usuário publica um link a partir de 2011, explicando que o IIS é muito mais rápido que a maioria dos outros servidores da Web (* nix). Outro usuário responde, explicando que o IIS obtém essa vantagem ao ter um módulo de kernel chamado HTTP.sys . Que eu saiba, a maioria dos outros servidores da web populares em 2015 não faz isso.

Eu nunca gostaria de escrever um servidor Web no modo kernel, porque nunca poderia confiar em mim mesmo para libertá-lo de explorações de segurança (o que seria menos sério quando executado em um anel de proteção mais baixo).

Do ponto de vista do engenheiro de software (em oposição a um cliente para servidores da Web), executar no modo kernel é uma decisão inteligente de desempenho? As preocupações com segurança podem ser atenuadas no desenvolvimento de aplicativos a ponto de tornar um servidor no modo kernel um lucro líquido para o consumidor?

James Mishra
fonte
5
"Falha no servidor é um site de perguntas e respostas para administradores de sistemas e redes." Administradores de sistemas e administradores de rede não gravam servidores da Web; eles os instalam e os mantêm. Eu acho que a questão do modo kernel / modo usuário é muito mais relevante no tempo de desenvolvimento do que no tempo de instalação. Não me importo de ter a pergunta movida para algum lugar mais relevante, mas sinto que a Falha do Servidor não a encontrará no tópico.
James Mishra
Ok, relendo a questão novamente, acho que ela pode ser interpretada como uma questão geral de arquitetura de software, e não como uma questão sobre os prós e contras dos servidores da web existentes, então retraí meu voto. Mas você pode editar sua pergunta para destacar o aspecto geral da arquitetura de software.
Doc Brown
2
Qualquer pessoa que pense que o servidor da web no modo kernel pode melhorar o desempenho, pois não precisa alternar entre contextos, deve ler: Números de latência que todos os programadores devem conhecer . A troca de contexto completo no Linux custa cerca de 3000ns ( fonte ), mas muitos syscalls não precisam de troca de contexto completo e podem chegar a 50ns, não tenho números para o Windows. Isso está em algum lugar ao longo da 2ª / 3ª coluna. Conclusão: minimize a solicitação de rede e o disco, não se preocupe com as alternâncias de contexto.
Lie Ryan

Respostas:

24

Http.sys não é tanto um servidor web como um encaminhador de proxy. Ele foi projetado para permitir que muitos servidores da Web coexistam em uma caixa do Windows, para que você possa ter o IIS executando um site, mas também vários serviços WCF executando com interfaces http / REST ou SOAP, tudo na porta padrão 80. (é por isso que você Não é possível executar o Apache no Windows sem tremer, o Apache não foi modificado para funcionar com este sistema de registro, é uma pena que não tenha sido mais transparente para os aplicativos e requer algumas modificações bastante complexas para se conectar a ele).

A maneira como funciona é que você registra uma URL nela e no aplicativo correspondente, e quando uma solicitação http é feita na porta 80, o http.sys a aceita, mas depois passa a solicitação para o aplicativo registrado para lidar com o destino dessa URL.


Duvido que um servidor da web no modo kernel faça algum sentido - mesmo que o desempenho do soquete possa ser melhorado dessa maneira, para executar qualquer trabalho útil, a lógica do aplicativo ainda será executada no espaço do usuário, portanto sempre haverá uma transição - você ' apenas o mudei um pouco ao longo da pilha de chamadas.

gbjbaanb
fonte
11
O principal benefício de um servidor completo no modo kernel é servir arquivos estáticos: isso pode ser feito sem a mudança para o modo usuário. Cache também é possível.
Jules
3
Eu acho que o HTTP.sys é de uma época em que os ciclos da CPU eram muito mais escassos ... Mesmo ao exibir pequenos arquivos estáticos (que é o caso mais vantajoso para o HTTP.sys), um servidor HTTP no modo de usuário completo provavelmente maximizaria a maioria das redes .
usr
4
@usr Http.sys é uma coisa relativamente nova, introduzida no Windows Server 2003. Tenho certeza de que existe para que você possa executar muitos serviços de API da web que escutam na porta 80 simultaneamente.
Gbjbaanb
2
@gbjbaanb um servidor em modo de usuário também pode permitir isso. O Windows tem a capacidade de compartilhar memória (para buffers) e passar um identificador de soquete para um processo diferente.
usr
11
@JamesMishra Na minha opinião, sim. Naquela época, as CPUs provavelmente eram> 10x menos poderosas. Além disso, a mentalidade de segurança não estava lá. Hoje é apenas uma má ligação.
usr
14

O Http.sys não é o único servidor Web em modo kernel disponível: no Linux, também existe o tux . Como você identificou corretamente, a segurança é uma preocupação com esses tipos de servidores, o que levou o tux a não ser incluído no kernel linux da linha principal (e acredito que não seja atualizado para versões mais recentes do kernel).

Uma solução melhor seria o uso de um sistema operacional que não depende da proteção de hardware para reforçar a segurança do processo, por exemplo, a singularidade da Microsoft: esse sistema permitiria ganhos de eficiência de um servidor no modo kernel sem os riscos à segurança. Infelizmente, nenhum sistema operacional pronto para produção com base nesse princípio está disponível a partir de 2015 e o AFAIK também não está trabalhando seriamente em um deles (o projeto Singularity foi cancelado).

Jules
fonte
O grande problema com a abordagem de Singularidade é que isso significa que um mas no JITter pode facilmente levar à escalada de privilégios.
CodesInChaos
2
O artigo da Wikipedia sobre Tux é uma leitura interessante. O Tux pode encaminhar solicitações HTTP para conteúdo não estático para um servidor Web "real" como o Apache, que soa como o Http.sys é usado. Não sei dizer se o Tux foi tão eficiente quanto o Http.sys, mas com base no pouco que li, parece que os desenvolvedores do kernel do Linux discordariam profundamente da decisão da Microsoft.
James Mishra
10

O Http.sys é de baixo risco, pois não pode executar nenhuma cópia fornecida por terceiros.

O HTTP.sys faz algumas tarefas.

  • Ele atua como um encaminhador de proxy, permitindo que vários processos respondam à solicitação de diferentes partes do espaço de nome HTTP. A resposta gbjbaanb cobre isso bem.

  • Serve arquivos estáticos, diretamente do cache de arquivos do Windows. Isso fornece uma grande aceleração para arquivos estáticos de arquivos pequenos, pois não há opções de contexto.

  • Ele armazenará em cache a saída de qualquer aplicativo para o qual encaminhar uma solicitação HTTP e retornará o resultado descontado. O aplicativo está no controle completo sobre quanto tempo (se houver) o cache dura.

O Http.sys foi projetado para executar tarefas simples MUITO rápido, passando todo o resto para um processo no espaço do usuário.

Em resposta ao comentário

"baixo risco, pois não pode executar nenhum código fornecido por terceiros" - é o que eles sempre dizem e quase nunca é verdade.

O problema é que você deve confiar na Microsoft para escrever código complexo do kernel para fazer essa pergunta; caso contrário, você decide não usar o Windows para hospedagem na Web . O Http.sys aumenta muito pouco o risco de erros do kernel, dado o quão complexo é o kernel.

Se algo Http.sys reduz o risco, uma vez que existe uma separação tão clara abaixo do código da aplicação e serviço da web de "baixo nível".

Em uma configuração bem projetada, a máquina (ou servidor virtual) que executa o servidor da Web tem acesso muito limitado ao restante da rede, pois é um destino de alto risco. Isso torna muito pouco diferente se o kernel ou um servidor da web no modo de usuário for hackeado, pois o servidor não deve ter mais “direitos” na rede, o processo no modo de usuário do servidor da web precisará fazer seu trabalho.

Ian
fonte
11
Os aplicativos do modo de usuário geralmente são escritos em linguagens seguras, o que exclui a maioria dos erros baseados em corrupção de memória (geralmente são aqueles que levam à execução remota de código).
CodesInChaos
3
Não tenho certeza se compro o argumento de que, se confiar na Microsoft para escrever o código do kernel, é um pequeno salto confiar neles para escrever o código do servidor da web no modo kernel. Sou bastante ingênuo do ponto de vista da segurança da informação, mas imagino que seria muito mais fácil armar um estouro de buffer no Http.sys do que em um driver de dispositivo ou em alguma outra parte do kernel mais distante da Internet.
James Mishra