内核模式Web服务器:明智的优化还是安全的噩梦?


28

我正在阅读一个黑客新闻主题,其中一个用户发布了2011年的链接,解释说IIS比大多数其他(* nix)Web服务器要快得多。另一位用户回答,解释说IIS通过拥有名为HTTP.sys内核模块而获得了这一优势。据我所知,2015年大多数其他流行的Web服务器都没有这样做。

我永远都不想写一个内核模式的Web服务器,因为我永远不相信自己让它摆脱安全漏洞(在较低防护等级下运行不会那么严重)。

从软件工程师(相对于Web服务器的客户)的角度来看,以内核模式运行是否是明智的性能决策?是否可以在应用程序开发中减轻安全隐患,以使内核模式服务器成为消费者的纯利?


5
“服务器故障是系统和网络管理员的问答站点。” 系统管理员和网络管理员不编写 Web服务器;他们安装并维护它们。我认为内核模式/用户模式在开发时比安装时更重要。我不介意将问题移到更相关的地方,但是我觉得Server Fault也不会在主题上找到它。
詹姆斯·米什拉

好的,再次阅读该问题,我想它可以解释为一个一般的软件体系结构问题,而不是有关现有Web服务器优缺点的问题,因此,我投了反对票。但是您可以考虑编辑您的问题,以突出显示一般的软件体系结构方面。
布朗

2
任何认为内核模式Web服务器可以提高性能的人,因为它不必进行上下文切换,应阅读:每个程序员都应该知道的延迟数。Linux中的完全上下文切换成本约为3000ns(),但是许多系统调用实际上并不需要完全上下文切换,并且可以低至50ns,对于Windows,我没有数字。这是第2 / 3rd列中的某处。结论:最小化网络请求和磁盘,不必担心上下文切换。
Lie Ryan

Answers:


24

Http.sys并不是Web服务器,而是代理转发器。它的设计允许Windows箱上共存许多Web服务器,因此您可以让IIS运行一个网站,但也可以在标准端口80上运行多个以http / REST或SOAP接口运行的WCF服务。不能在Windows上运行Apache而不会有任何麻烦,Apache尚未进行修改以与该注册系统一起使用,可惜它没有对应用程序变得更加透明,并且需要进行一些相当复杂的修改才能加入)。

它的工作方式是在URL和相应的应用程序上注册URL,然后在端口80上发出http请求时,http.sys接受它,然后将请求传递给注册的任何应用程序以处理该URL目标。


我怀疑内核模式的网络服务器是否有意义-即使可以通过这种方式提高套接字性能,为了执行任何有用的工作,应用程序逻辑仍将在用户空间中执行,因此总会有过渡-您ve只是沿着调用栈移动了一点。


11
处于内核模式的完整服务器的主要好处是可以提供静态文件:无需切换到用户模式即可完成此操作。缓存也是可能的。
Jules

3
我认为HTTP.sys是从CPU周期更加稀缺的时代开始的...即使在提供小型静态文件(这是HTTP.sys的最大优势)的情况下,完全用户模式的HTTP服务器也可能会占用大多数网络的资源。
usr 2015年

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。正如您已经正确地确定的那样,安全性是这类服务器的关注点,这导致Tux不包含在主线linux内核中(而且我相信对于最新的内核版本不会进行更新)。

更好的解决方案是使用不依赖硬件保护来强制执行过程安全性的操作系统,例如Microsoft的奇异之处:这样的系统可以在不增加安全性风险的情况下提高内核模式服务器的效率。不幸的是,截止到2015年,没有基于此原理的可用于生产的操作系统,并且AFAIK都没有认真地开发一个操作系统(Singularity项目已取消)。


奇异性方法的最大问题在于,这意味着JITter中的a可以轻易导致特权升级。
CodesInChaos

2
Tux Wikipedia文章很有趣。Tux可以将对非静态内容的HTTP请求转发到诸如Apache之类的“真实” Web服务器,这听起来像Http.sys的用途。我不能说出Tux是否像Http.sys一样出色,但是根据我的读物,听起来Linux内核开发人员会强烈反对Microsoft的决定。
James Mishra 2015年

10

Http.sys的风险低,因为它无法运行第三方提供的任何应对措施。

Http.sys完成一些任务。

  • 它充当代理转发器,因此允许多个进程响应对HTTP名称空间不同部分的请求。gbjbaanb的答案很好。

  • 它直接从Windows文件缓存中提供静态文件。由于没有上下文切换,因此可以大大提高小型文件静态文件的速度。

  • 它将缓存将HTTP请求转发到的任何应用程序的输出,并返回兑现的结果。该应用程序可以完全控制缓存的持续时间(如果有)。

Http.sys旨在非常快速地完成简单任务,同时将其他所有内容传递给用户空间中的进程。

回应评论

“低风险,因为它无法运行第三者提供的任何代码” –这就是他们总是说的,而且几乎从来都不是真的。

问题是您必须信任Microsoft编写复杂的内核代码来询问此问题,否则您决定根本不使用Windows进行虚拟主机。不管内核多么复杂,Http.sys几乎不会增加内核错误的风险。

如果Http.sys降低了风险,则因为“低级” Web服务和应用程序代码之间存在明显的分隔。

在设计良好的设置中,运行Web服务器的计算机(或虚拟服务器)对网络其余部分的访问非常有限,因为它是高风险目标。如果内核或用户模式的Web服务器被黑客入侵,则几乎没有什么不同,因为服务器不应在网络上拥有更多的“权利”,因此Web服务器用户模式进程需要完成其工作。


1
用户模式应用程序通常以类型安全的语言编写,可以排除大多数基于内存损坏的错误(通常是那些导致远程代码执行的错误)。
CodesInChaos

3
我不确定是否要接受这样的论点,即如果我相信Microsoft可以编写内核代码,相信他们可以编写内核模式Web服务器代码只是一个小小的飞跃。从信息安全的角度来看,我还是很幼稚的,但是我认为在Http.sys中配置缓冲区溢出的武器要比设备驱动程序或远离Internet的内核的其他部分容易得多。
詹姆斯·米什拉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.