我们在使用ASP.NET平台做web开发的时候,经常会接触到IIS(InternetInformationServices互联网信息服务)。这篇文章主要来介绍IIS7.0+的架构。IIS的安全脆弱性曾长时间被业内诟病,一旦IIS出现远程执行漏洞威胁将会非常严重。远程执行代码漏洞存在于HTTP协议堆栈(HTTP.sys)中,当HTTP.sys未正确分析经特殊设计的HTTP请求时会导致此漏洞。成功利用此漏洞的攻击者可以在系统帐户的上下文中执行任意代码,可以导致IIS服务器所在机器蓝屏或读取其内存中的机密数据。微软的技术更新相对较快,IIS7相比较之前的IIS5,IIS6有了很大的改进,解决了IIS5的一些不足,也使用了一些新的结构来提升了性能和安全性。
一、IIS的组成组件
在WindowsServer®2008(IIS7.0)和WindowsServer2008R2(IIS7.5)中IIS包含了很多的组件来完成应用程序和Webserver的重要功能。每一个组件都有自己的职责,比如请求的监听、进程的管理、配置文件的读取等等。这些组件主要包括以下三个:
1、协议侦听器(protocollisteners)比如HTTP.sys
2、服务组件比如wwwservice(WorldWideWebPublishingService)
3、Windows进程激活服务(WindowsProcessActivationServiceWAS).
后面我们会对这些相关的组件做一些说明。
二、协议监听器
协议侦听器是一个可以侦听预定义通信通道(端口),传递数据(请求的数据)和参与服务和客户端通信的程序。IIS7包含5个默认的协议侦听器:Http.sys,Net.tcp,Net.pipe,Net.p2p和Net.msmq;此外,也可以穿件和使用自定义侦听器。IIS6只有一个:Http.sys。其它的新的侦听器用来支持微软新的WindowsCommunicationFoundation服务。除了Http.sys,其它侦听器需要安装.NETFramework和Windows激活服务(WindowsProcessActivationService,简称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(SecureSocketsLayer)的支持。为了支持Services和应用程序对HTTP/HTTPS之外的协议的使用,你可以通过使用WCF(WindowsCommunicationFoundation)相关的技术来实现对HTTP/HTTPS之外的协议的使用。WCF可以通过监听适配器来提供对协议的监听和监听适配。详细的了解可以通过WCF来学习。
三、超文本传输协议堆栈(HTTP.sys)
HTTP侦听器是Windows操作系统的网络子系统的一部分,HTTP.sys作为默认的侦听组件,通过内核模式设备驱动程序来实现。HTTP.sys通过侦听网络的HTTP/HTTPS协议的请求,然后传送给IIS来进行请求处理,IIS处理完之后响应给HTTP.sys,然后HTTP.sys将响应传输给客户端。IIS6.0开始HTTP.sys代替了Winsock(WindowsSocketsAPI)来实现请求的侦听和响应的传送。IIS7中仍然是这样做的。
四、WordWideWebPublishingService(W3SVC)
IIS7之前WWWservice的全部功能,在IIS7被拆分成了两个服务:W3SVC和WAS服务。这样wwwservice的责任就减轻了,但是HTTP请求的监听任务仍然在W3SVC头上。WAS的引入为IIS提供了非HTTP协议的支持,它通过监听适配器接口,抽象出针对不同协议的监听器。具体来说,除了专门用于监听HTTP请求的HTTP.sys之外,WAS利用TCP监听器,命名管道监听器和MSMQ监听器提供基于TCP、命名管道和MSMQ传输协议的支持。W3SVC和WAS这两个服务作为本地系统运行在相同的Svchost.exe进程,和共享相同的二进制文件。
五、IIS模块化
IIS7提供了新的与之前的IIS版本不同的架构。为了保留服务器自身的主要功能,IIS提供一个Web服务器引擎,用来根据你的需求来增加/删除组件和模块的调用。模块是服务器用来处理请求的单独的功能组件。比如IIS使用身份验证模块来验证客户端凭据,用缓存模块来管理缓存活动。
新的架构相对于之前有如下优点:
1、你可以控制任何一个你服务器上需要的模块。
2、在你的环境中你可以给服务指定任意角色。
3、你可以用自己开发的模块来代替已存在的模块来实现更多的扩展。
六、本地化模块
以下各节描述了可用的完整安装的IIS7+的本机模块。您可以根据您的需要删除它们或将它们替换成自定义模块。
1、HTTP模块:IIS7之后部门模块主要用来处理HTTP请求。HTTP模块能够将响应信息输出到客户端,返回HTTP错误,重定向请求等。
2、安全模块:在IIS中的几个模块执行请求处理管线中的安全相关的任务。除此之外,每个验证机制都有独立的模块,可供你自己选择自己需要的验证模块。还有一些模块用来过滤请求和URL授权。
3、内容模块:在IIS中的几个模块执行请求处理管道中的内容相关的任务。内容模块包括模块来处理请求的静态文件,当客户端没有指定具体页面时,以返回一个默认的页面,列出一个目录,和更多的内容中指定的资源。
4、压缩模块:在IIS中的两个模块在请求处理管道中执行压缩。
5、缓存模块:网站或应用程序中通过存储网页之类的处理信息来提高性能和可重用性。
6、日志记录和诊断模块:日志记录模块支持加载自定义模块,并将信息传递给HTTP.SYS.诊断模块用来在处理请求过程中关注和报告事件。
七、托管模块
除了本地化模块以外,IIS允许你使用托管代码模块来扩展IIS功能。部分托管模块,比如UrlAuthorization,有一个相对应的本地化模块来替换托管模块。
值得注意的是托管模块依赖于ManagedEngine模块。下面列出了完整的IIS7的托管模块,有关托管模块的详细信息请参阅MSDN上的.NET框架2.0.
八、IIS中请求的处理
在IIS7中,IIS和ASP.NET请求管道通过集成方式组合来处理I请求。新的请求架构包括执行特定的任务以响应请求的本地化和托管模块列表。这种设计相对于以前的版本有以下几大好处:
1、所有的文件类型可以使用最初仅提供给托管代码的功能。比如你现在可以为静态页面,活动服务器页面以及你的网站和应用程序中其他类型的文件使用ASP.NETForm身份认证和统一资源定位器授权。
2、这种设计消除了IIS和ASP.NET中相互重复的几个功能。比如:当客户端请求一个托管文件时,服务器在集成管道中通过调用适当的认证模块来对客户端进行认证。但是在之前的IIS版本中,这种授权会在IIS和ASP.NET中都进行验证。
3、你可以在同一个地方管理所有的模块,而不是去管理一部分在IIS里配置一部分在ASP.NET里的配置。这简化了站点和应用程序服务器上的管理。