我们在使用ASP.NET平台做web开发的时候,经常会接触到IIS(Internet Information Services 互联网信息服务)。这篇文章主要来介绍IIS7.0+的架构。IIS的安全脆弱性曾长时间被业内诟病,一旦IIS出现远程执行漏洞威胁将会非常严重。远程执行代码漏洞存在于 HTTP 协议堆栈 (HTTP.sys) 中,当 HTTP.sys 未正确分析经特殊设计的 HTTP 请求时会导致此漏洞。 成功利用此漏洞的攻击者可以在系统帐户的上下文中执行任意代码,可以导致IIS服务器所在机器蓝屏或读取其内存中的机密数据。微软的技术更新相对较快,IIS7相比较之前的IIS5,IIS6有了很大的改进,解决了IIS5的一些不足,也使用了一些新的结构来提升了性能和安全性。
Internet Information Services(IIS)7及以后的版本提供了一套请求处理机制主要又三大功能:
1.Windows Process Activation Service(WAS),Windows进程激活服务,主要用来支持HTTP/HTTPS之外的控制协议。
2.一个可以通过增加/删除模块来自定义的引擎。
3.集成了IIS和ASP.NET的请求处理管道。
我们主要通过以下及部分来分解IIS的结构:
* IIS的组成组件
* 协议监听器
* 超文本传输协议堆栈(HTTP.sys)
* Word Wide Web Publishing Service(www Service)
* IIS 模块化
* 本地化模块
* 托管模块
* IIS中请求的处理
* IIS中的应用程序池
* IIS中HTTP请求的处理
1. IIS 的组成组件
在Windows Server® 2008 (IIS 7.0) 和Windows Server 2008 R2 (IIS 7.5)中IIS包含了很多的组件来完成应用程序和Web server的重要功能。每一个组件都有自己的职责,比如请求的监听、进程的管理、配置文件的读取等等。这些组件主要包括以下三个:
* 协议侦听器(protocol listeners) 比如 HTTP.sys
* 服务组件 比如www service(World Wide Web Publishing Service)
* Windows 进程激活服务(Windows Process Activation Service WAS).
后面我们会对这些相关的组件做一些说明。
2.协议监听器
协议侦听器是一个可以侦听预定义通信通道(端口),传递数据(请求的数据)和参与服务和客户端通信的程序。IIS7包含5个默认的协议侦听器:Http.sys, Net.tcp, Net.pipe,
Net.p2p 和 Net.msmq; 此外,也可以穿件和使用自定义侦听器。IIS6只有一个:Http.sys。其它的新的侦听器用来支持微软新的Windows Communication Foundation服务。除了
Http.sys,其它侦听器需要安装.NET Framework和Windows激活服务(Windows Process Activation Service ,简称WAS),它们和WWW服务一样运行在相同的服务宿主进程。
但是,协议侦听器可以通过WAS托管而不需要使用IIS。
每个侦听器,运行在内核模式,直接与操作系统交互。微软为了安全隐患考虑已经充分测试过每个侦听器,尽全力保证他们不会缓存溢出和出现其它安全问题。尽管微软知道发生安
全问题的可能性很小,但是还是在过去的4年里一直防御II6的Http.sys抵御每次攻击,所以他们树立了良好的榜样。协议侦听器可以在一个叫做ApplicationHost.config的XML 配置
文件里激活。为了减少可能的攻击,只有需要的侦听器才会被激活。
当客户端浏览器通过Internet请求一个page页面,这个时候首先被HTTP协议监听器HTTP.sys监听到,经过检查之后将请求发送给IIS来处理请求。一旦IIS处理完请求之后,
HTTP.sys就会将请求的响应结果输送到客户端。
默认的IIS提供了HTTP.sys作为协议侦听器来侦听HTTP/HTTPS的请求,因为我们web大部分通过HTTP/HTTPS协议作为请求协议。HTTP.sys组件在IIS6就已经存在了,IIS7以上
仍然在使用,并且在IIS7中HTTP.sys包含了对SSL(Secure Sockets Layer)的支持。
为了支持Services和应用程序对HTTP/HTTPS之外的协议的使用,你可以通过使用WCF(Windows Communication Foundation)相关的技术来实现对HTTP/HTTPS之外的协议的
使用。WCF可以通过监听适配器来提供对协议的监听和监听适配。详细的了解可以通过
WCF来学习。
3.超文本传输协议堆栈(HTTP.sys)
HTTP 侦听器是 Windows 操作系统的网络子系统的一部分,HTTP.sys作为默认的侦听组件,通过内核模式设备驱动程序来实现。HTTP.sys通过侦听网络的HTTP/HTTPS协议的请求,然后传送给IIS来进行请求处理,IIS处理完之后响应给HTTP.sys,然后HTTP.sys将响应传输给客户端。IIS6.0开始HTTP.sys代替了Winsock(Windows Sockets API)来实现请求的侦听和响应的传送。IIS7中仍然是这样做的。
HTTP.sys有很多优点:
* 内核模式缓存。如果某个资源被频繁请求,HTTP.sys会把响应的内容进行缓存,缓存内同可以直接响应后续请求,由于这是基于内核模式缓存,不存在内核模式和用户模式的切换,响应速度得到了极大的改进。
* 内核模式请求队列。请求的上下文切换,因为内核将直接向正确的辅助进程的请求转发导致开销也更少。如果没有工作进程可用来接受请求,内核模式请求队列保存请求,直到工作进程拾了起来。
* 请求前处理和安全筛选。
4.Word Wide Web Publishing Service(W3SVC)
IIS7之前WWW service的全部功能,在IIS7被拆分成了两个服务: W3SVC和WAS服务。这样www service的责任就减轻了,但是HTTP请求的监听任务仍然在W3SVC头上。WAS的引入为IIS提供了非HTTP协议的支持,它通过监听适配器接口,抽象出针对不同协议的监听器。具体来说,除了专门用于监听HTTP请求的HTTP.sys 之外, WAS 利用TCP 监听器,命名管道监听器和MSMQ监听器提供基于TCP、命名管道和MSMQ传输协议的支持。W3SVC和WAS这两个服务作为本地系统运行在相同的 Svchost.exe 进程,和共享相同的二进制文件。
W3SVC在IIS6中的主要作用是什么呢?
在IIS6中主要承载着如下三大功能:
* HTTP请求的接收和配置管理,接收HTTP.sys监听到的请求,从元数据库中加载配置信息对相关组件进行相关配置。
* 进程管理:创建、回收、监听工作进程。管理应用程序池。
* 性能的监测。
在IIS7中WAS承担了 W3SVC的部分责任,主要进行进程的管理和应用程序池的管理。这表明你可以对http和非http请求使用相同的配置和模块。
除此之外,如果你不需要监听HTTP请求,你可以只启动WAS服务,而不需要启动W3SVC服务。
WAS中配置文件的管理:
在WAS启动时,WAS读取ApplicationHost.config文件中的信息,把这些信息传递给监听适配器,监听适配器组件主要作用就是建立WAS和协议侦听器(例如:http.sys)之间的通信。一旦监听适配器接收到了配置信息,适配器就会根据配置信息配置好相应的协议监听器准备好对请求协议的监听。
下面这些信息就是WAS主要从配置文件中需要获取的信息:
*全局配置信息。
*HTTP和非HTTP协议的配置信息。
*应用程序池的配置 比如进程账号信息。
*网站的配置信息。
*应用程序的配置信息比如应用程序采用的协议和应用程序属于哪一个应用程序池。
如果ApplicationHost.config改变了,WAS就会接收到通知来更新监听适配器的信息。
WAS的进程管理:
WAS管理着HTTP和非HTTP请求的应用程序池和工作进程。当一个协议监听器监听到一个客户端请求的时候,WAS来决定工作进程是否启动。如果应用程序池已经有一个工作进程,监听适配器就会把请求发送给该工作进程来处理。如过应用程序池 中没有可用工作进程,WAS就会启动一个新的工作进程来让监听适配器传送请求来进行处理。
由于WAS管理着http和非http请求协议,所以你可以在同一个应用程序池里面运行不同协议的请求的应用程序。
5.IIS 模块化
IIS7提供了新的与之前的IIS版本不同的架构。为了保留服务器自身的主要功能,IIS 提供一个 Web 服务器引擎,用来根据你的需求来增加/删除组件和模块的调用。
模块是服务器用来处理请求的单独的功能组件。比如IIS 使用身份验证模块来验证客户端凭据,用缓存模块来管理缓存活动。
新的架构相对于之前有如下优点:
* 你可以控制任何一个你服务器上需要的模块。
* 在你的环境中你可以给服务指定任意角色。
* 你可以用自己开发的模块来代替已存在的模块来实现更多的扩展。
新的体系结构也提高了安全性,并简化管理。通过删除不必要的模块,可以减少服务器的受攻击面和 server 辅助进程的计算机使用的内存内存占用。