深入剖析IIS 6.0(下)

发表于:2007-05-25来源:作者:点击数: 标签:
前文介绍了IIS 6.0的安装和Web服务器的新型体系结构。IIS 6.0新特性的数量多得令人惊奇,其中一些特性是如此引人注目,以至于人们的大部分注意力都被它们吸引。在这第二篇介 绍IIS 6.0的文章中,我们不仅将了解这些已成为“明星”的特性,还将关注一下IIS 6.

  前文介绍了IIS 6.0的安装和Web服务器的新型体系结构。IIS 6.0新特性的数量多得令人惊奇,其中一些特性是如此引人注目,以至于人们的大部分注意力都被它们吸引。在这第二篇介 绍IIS 6.0的文章中,我们不仅将了解这些已成为“明星”的特性,还将关注一下IIS 6.0各种较少有人注意却同样重要的改进之处。

  一、安全

  微软一次又一次地做着同样一件事情——某个软件产品出了问题,饱受人们诟病,于是赶紧发布新的版本将问题解决。例如,发布Windows NT 4.0之后,因稳定性问题而饱受批评;于是微软发布了Windows 2000,新操作系统的稳定性颇受好评,但Win 2K服务器默认安装的IIS 5.0却成了巨大的安全隐患,需要下大力气加以整治才能解决问题。IIS 6.0默认不安装,如果按照缺省方式安装,Web服务器只能提供静态内容服务。因此,从这个角度看,即使以后IIS 6.0应用引擎和组件突然出现了问题,IIS 6.0还是极大地降低了安全风险。另外,Windows Server 2003还有一个新的组策略“禁止安装IIS”,有了该组策略,我们就可以禁止Windows 2003在活动目录(AD)森林中禁止不准备作Web服务器用的机器上安装IIS 6.0,防止网络上出现根本无用的、不安全的IIS 6.0服务器。不过,目前这个组策略只对Windows 2003服务器有效,不能防止Windows XP Pro和Win 2K的机器安装IIS 5.0。

  当然,由于刚刚安装好的IIS 6.0不支持动态内容,所以出现了第二个人们经常会问的问题:“为什么我的服务器不能运行ASP?”(前文提到,第一个人们经常会问的问题是:“IIS 6.0可以在Win 2K服务器上运行吗”?答案是“不”)。要想在IIS 6.0上运行程序,必须使用IIS 6.0的一种新特性,即Web服务扩展,或Web Service Extension(这个名字似乎意味着它与XML Web服务有某种关系,实际情况并非如此。)

  如果要为某个程序启用Web服务扩展,首先打开IIS管理器(在“控制面板”→“管理工具”中。以前叫做Internet服务管理器或ISM),如图一,点击“添加一个新的Web服务扩展”,启动向导创建一个新的规则。为规则指定一个名字,然后找到想要启用的执行文件。另外,\system32\inetsrv下有一个iisext.vbs脚本,它也能够配置并管理运行带有IIS 6.0的Windows Server 2003的Web服务扩展、应用程序和单独的文件。管理员可以使用此脚本来启用和列出应用程序;添加和删除应用程序依赖性;启用、禁用和列出 Web 服务扩展;添加、删除、启用、禁用和列出单独文件。



图一



  在图一中,注意“所有未知ISAPI扩展”和“所有未知CGI扩展”这两种Web服务扩展。默认情况下,这两种扩展是禁用的,意味着除非明确地允许一个应用在IIS 6.0上运行,否则它就不能运行。如果一个用户请求了某个没有启用的文件,IIS 6.0将向用户返回404错误——文件或目录没有找到,同时在W3SVC日志中记录“404.2文件或目录无法找到:锁定策略禁止该请求”。在IIS 6.0中,404.2和其他子状态代码是W3SVC日志文件的一项可选功能,用来帮助排解故障、疑难(IIS 5.0和IIS 4.0中也有子状态代码,不过不会在日志文件中记录,但可以将它们转到定制的错误页面,便于根据子状态代码执行特殊的处理)。IIS 6.0的子状态代码很有用,它们提供了描述问题的详细信息,例如:403.20,禁止访问:Passport登录失败;403.18,禁止访问:无法在当前应用程序池中执行请求的URL;404.3,文件或目录无法找到:MIME映射策略禁止该请求;500.19,服务器错误:该文件的数据在配置数据库中配置不正确。所有这些错误和其他错误都映射到定制的错误页面,错误页面不会把子状态代码发送给用户,攻击者无法获知具体的错误信息。

  另一个安全方面的改进之处是IIS 6.0允许指派一个加密服务提供者(Cryptographic Service Provider,CSP),能够将基于硬件的安全套接字层(SSL)加速器集成到IIS 6.0,从而把加密任务从服务器的通用CPU转移到了专门为加密操作而优化的专用设备,有利于提高性能可靠性

  二、配置数据

  在IIS 5.0和IIS 4.0中,配置数据库采用二进制文件结构,但IIS 6.0放弃了这一做法。IIS 6.0的配置数据由两个XML文件构成:一个是Metabase.xml,包含IIS 6.0服务器的配置信息;另一个是mbschema.xml,包含配置数据的模式定义。IIS管理器提供了一项新的功能,允许保存配置数据副本,只要右击Web网站,然后选择“所有任务”→“将配置保存到一个文件”,然后指定配置数据副本的文件名字和保存路径即可。按照这种方式保存配置数据时,IIS 6.0利用系统的机器码(Machine Key)加密配置数据的某些部分,因此,配置数据的副本只对创建该副本的机器有用。

  不过,在“将配置保存到一个文件”对话框中,我们可以选中“用密码对配置进行加密”选项,然后指定密码,用密码来保护导出的配置文件。如果提供了密码,IIS 6.0将用密码来替代机器码,以后只要提供同一个密码,就可以将配置数据导入到另一个服务器。另外,我们可以使用命令行脚本iisback.vbs(在systemroot\System32中)创建和管理远程或本地计算机的IIS配置的备份副本,管理员可以使用此脚本工具创建其IIS配置的备份副本,从备份副本还原IIS配置以及列出和删除备份副本。

  有些时候,我们只要保存某个应用程序池、Web网站或虚拟目录的配置,而不是保存全部的配置信息,这时可以按照如下步骤操作:右击要保持配置信息的对象,选择菜单“所有任务”→“将配置保存到一个文件”,如图二所示,如果准备将配置数据导入到另一个服务器,必须提供加密文件的密码。



图二


  如果右击一个应用程序池、Web网站组或单个网站,然后选择“新建”→“应用程序池(来自文件)”,或者“新建”→“网站”→“来自文件”,或者“新建”→“虚拟目录(来自文件)”,就可以从保存的配置文件创建新的应用程序池、Web网站或虚拟目录。因此,必要的时候,我们可以只创建和配置一个对象,利用“将配置保存到一个文件”功能导出对象的配置信息,然后利用“新建”→“虚拟目录(来自文件)”等功能将配置信息导入到多个Web网站。这就是说,我们可以先精心配置一个模板,然后用它来创建和配置新的网站。当然,出现问题时,配置信息副本还可以用来恢复网站的设置。

  由于IIS 6.0配置信息是可移植的,它还有另外一个好处,这就是方便了升级。假设我们升级时不能直接在Win 2K/IIS 5.0上安装Windows 2003/IIS 6.0,必须换一台机器,这时就要解决如何将IIS 5.0不可移植的配置数据转移到新的IIS 6.0服务器的问题。利用IIS 6.0配置数据的可移植性,解决办法是:首先安装好新的Windows 2003服务器,为原来的Win 2K服务器做一个完整的备份,然后在Win 2K服务器上安装第二个Windows 2003服务器将它升级,导出第二个Windows 2003服务器的配置数据(用密码加密),然后将配置数据导入到新的Windows 2003服务器。新安装的Windows 2003服务器必须作一些调整,例如允许IUSR帐户等,但至少现在不必重新执行全部配置操作了。

  IIS 6.0的配置数据是标准的文本文件(XML文件),所以可以用记事本之类的文本编辑器打开和编辑。如果修改了IIS 5.0或IIS 4.0的配置数据,有时必须重新启动IIS,如果系统上网站的数量很多,可能需要不少时间,例如ISP的服务器就属于这类情况。为了解决这个问题,IIS 6.0支持一种“运行时允许编辑”功能。“运行时允许编辑”功能按照如下方式启用:在IIS管理器中,右击服务器,选择菜单“属性”,然后选中“允许直接编辑配置数据库”选项,如图三所示。启用了这个功能之后,如果我们用记事本打开配置数据文件,插入一个虚拟目录的配置,然后保存并关闭配置文件,IIS 6.0几乎立即就能根据配置文件的设置作相应的修改,根本无需重新启动。



图三

  既然允许直接编辑配置文件,因配置文件不合法造成的服务器、应用程序故障也必然增多。为此,IIS 6.0提供了配置文件历史版本目录,即\system32\inetsrv\history,每次修改配置数据或重新启动IIS 6.0,IIS 6.0都会在该目录中保存一份原有的配置数据。
  三、IIS管理器

  每次产品重大升级,人们都会试图从用户界面寻找令人激动的新功能。IIS 6.0的管理器确实有了变化,不过改动之处出乎意料地少。

  其中一个改动之处虽小,但很实用。如果在IIS管理器中右击一个文件夹,现在可以选择“权限”菜单打开文件夹的“安全”对话框。在这个对话框中可以设置文件夹的NTFS授权,不必再离开IIS管理器。虽然这是一个小小的改动,也许它今年会为全世界所有的IIS管理员总共节省数千小时的工作时间。

  右击一个Web网站,选择“属性”,转到“目录安全性”页,点击“安全通信”下面的“编辑”按钮,在这里可以找到另一个重要的改动之处——安全通信属性页允许配置SSL、证书信任列表(CTL)、客户证书。在IIS 5.0和IIS 4.0中,除非在Web网站上安装一个证书,否则不能访问该属性页,这一限制令人不快,因为从技术上看,配置CTL、客户证书并不要求服务器上安装了证书,换句话说,在IIS 5.0中我们安装证书的唯一用途可能就是因为用户界面需要它。IIS 6.0改正了这一多余的要求,现在我们不必在Web服务器上安装证书也可以访问和使用该属性页了。

  四、通配符应用程序

  如果你熟悉IIS 5.0和IIS 4.0的ISAPI筛选器,可能也熟悉它们的缺点。ISAPI筛选器不仅编写困难,而且由于它们在Inetinfo进程内运行,如果编写时不小心留下了一点错误,很容易导致灾难性的后果,出错的代码可能造成整个IIS崩溃。另外,ISAPI筛选器不能拥有常规ISAPI DLL拥有的功能。当然,不管怎样,在IIS 5.0和IIS 4.0中,ISAPI筛选器仍是一种非常有用的组件,是唯一可以针对所有进入Web服务器或Web网站的请求执行操作的代码。

  IIS 6.0提供了一种更加灵活的新型机制来提供通常由ISAPI筛选器提供的服务,它就是ISAPI截取器(Interceptor),或者称为通配符应用程序(Wildcard Application)。通配符应用程序的配置方式是:在IIS管理器中右击Web网站,选择菜单“属性”,转到“主目录”页面,点击“应用程序设置”下面的“配置”按钮,出现“应用程序配置”对话框,如图四所示。在对话框的“映射”页中,我们可以将一个或多个ISAPI DLL配置成通配符应用程序。对于每一个接收到的请求,IIS 6.0将调用这里列出的各个通配符应用程序。除了针对所有网站配置通配符应用程序,还可以针对单个网站或在目录层次上配置通配符应用程序。由于这些ISAPI截取器是标准的ISAPI应用程序,它们具有普通ISAPI应用程序具备的所有功能,包括访问消息正文的能力,而不仅仅象ISAPI筛选器那样访问消息头。



图四


  通配符应用程序可以做到开发者要做的任何事情,诸如URL定制、验证身份、记录特殊的日志信息、检测攻击企图、创建内容,等等。通配符应用程序结束处理后,它把请求转交给适当的处理引擎(例如处理ASP页面的asp.dll),由处理引擎进一步处理请求。另外,通配符应用程序还可以通过调用为ISAPI应用程序新增的ExecuteURL功能,将请求传递到同一个应用程序池中的任意页面。

  新增的ISAPI通配符应用程序为创造性的应用程序设计大开方便之门。例如,IIS 6.0的URL授权功能就是作为一个ISAPI通配符应用程序(urlauth.dll)实现。URL授权功能允许IIS 6.0根据一系列的规则授予对某个URL的访问权,例如用户是否为某个组的成员、地理位置,以及其他在数据库或AD中与用户有关的信息。有关ISAPI通配符应用程序和URL授权的更多信息,请参见IIS 6.0的帮助文档。

  五、日志功能

  服务器的日志功能很少成为首要的关注对象,但却是日复一日的服务器管理和监视工作不可或缺的助手。IIS 6.0在日志功能方面有许多重大的改进,但遗憾的是,W3SVC日志事件仍不能以本地时间记录。

  在IIS 6.0中,记录日志的功能已经改为由http.sys实现,http.sys在内核模式下运行。这一改进加快了日志写入速度,同时避免了多个工作进程争用同一日志文件。某些特殊的情况下,http.sys会遇到错误,这时它应该但却不能将日志信息写入Web网站的日志,例如,工作进程正在被回收,禁止http.sys处理用户请求,或者用户试图连接到服务器,但请求中只提供了IIS所需信息的一部分。如果出现这类情况,http.sys将把事件写入一个新的日志文件httperr.log。

  在排解故障、优化IIS 6.0的过程中,httperr.log日志文件是十分重要的。默认情况下,httperr.log文件保存在\system32\logfiles目录,但可以修改,修改方法是找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters注册子键,在它下面添加一个名为ErrorLoggingDir的字符串值,在ErrorLoggingDir中设置保存日志文件的完整路径。在httperr.log日志文件中可以找到的信息包括:所有的503(服务不可用)错误,空闲连接超时,解析URL时出现的各种错误,最后10个提交给失败的应用程序池的请求。

  IIS 6.0还拥有一种称为二进制日志的功能,启用这个功能后,IIS 6.0将把Web网站的所有日志信息写入一个二进制格式的日志文件,日志文件的扩展名是.ibl。要启用二进制日志功能,只要把配置文件的W3SVCC/CentralBinaryLoggingEnabled条目设置成ture(1)即可。对于ISP来说,这个功能应该非常有用。ISP的每台机器上可能有1000甚至更多的Web网站,如果每个Web网站每天生成一个日志文件,日志文件的总数很快会达到一个天文数字。微软最近发布的Log Parser 2.0工具能够读取二进制日志文件并生成报告,这个工具可以从http://download.microsoft.com/download/iis50/utility/2.0/nt5xp/en-us/setup.exe下载。Log Parser 2.0还能够读取前面介绍的httperr.log文件并生成报告。

  从很久以前开始,IIS就允许指定本地服务器上保存日志文件的目录了。不过,虽然IIS 5.0和IIS 4.0的IIS管理器允许在指定日志文件路径的时候输入一个远程服务器的通用命名规范(UNC)的路径,但Web服务器实际上不会把日志保存到远程服务器。只有IIS 6.0才真正支持日志文件路径的UNC路径名。
  六、网站ID

  对于IIS服务器来说,唯一标识一个网站的不是网站的名称,而是网站的ID数值。当我们在IIS 5.0和IIS 4.0中创建一个新的网站,Web服务器将下一个可用的数字顺序号指定给网站(即,Web服务器给默认站点指定的数字是1,下一个网站是2,接下来是2、3、4,等等),这个数字就是网站的唯一ID。如果要访问一个网站的日志文件,首先必须知道该网站的ID,因为日志文件保存在\W3SVC\<网站的ID编号>目录。如果Web服务器上运行着一个以上的网站,仅仅依靠日志文件的路径名称根本无法判断哪一个日志目录属于哪一个网站。另外,无论是在编写管理脚本时,还是在修改配置数据文件时,网站ID都是必不可少的,例如,在IIS配置数据文件中指定ADSI(活动目录服务接口,Active Directory Service Interface)路径时往往要指定正确的网站ID。

  尽管如此,在IIS 5.0和IIS 4.0中,从IIS管理器无法直接找到网站的ID编号。为此,IIS 6.0的管理器在网站清单中增加了一个新的“标识符”列,该列的内容就是网站的ID编号。不过,即使IIS 6.0 Web服务器上只有二三个网站,网站的ID也可能很大,例如387660891(因此该网站的日志文件路径是\W3SVC\387660891),不必奇怪,IIS 6.0不再按照顺序指定网站的ID了——它根据网站的名字计算出网站的ID。

  如果你编写了一些脚本程序辅助管理,这些脚本要求使用原有的网站ID顺序生成方式,可以禁用IIS 6.0新式的ID生成方式,具体的操作步骤是:找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetMgr\Parameters注册子键,创建一个REG_DWORD值IncrementalSiteIDCreation,将它设置为2(注意,默认情况下,该键不存在)。

  七、异步CGI处理

  IIS 5.0和IIS 4.0以同步方式运行CGI(Common Gateway Interface,通用网关接口)进程,这实际上意味着每次只有一个线程能够访问一个CGI进程,所以IIS 5.0和IIS 4.0对CGI支持的可伸缩性不佳。IIS 6.0能够异步运行CGI进程,所以如果一个线程调用了一个CGI应用程序,它不必再等待CGI进程处理完毕和返回信息。异步CGI改善了IIS服务器运行CGI Web应用程序的性能,使得IIS能够运行更多执行关键任务的基于CGI的应用程序。

  当Web服务器接收到包含CGI程序名和程序所需参数的URL时,CGI程序开始执行。如果将CGI程序编译为可执行 (.exe)文件,则必须提供包含程序执行权限的目录,以便用户可以运行程序。如果CGI程序以脚本形式(例如Perl脚本)编写,则既可为目录提供执行权限,也可为其提供脚本权限。另外,如果要使用脚本权限,必须将脚本解释程序标记为脚本引擎。

  必须注意的是,默认情况下,IIS_WPG组不具备启动CGI进程的权限。如果创建了新帐户并将其添加到IIS_WPG组,还必须授予此帐户两种启动CGI进程的用户权限,即“调整进程的内存配额”和“替换进程级令牌”。

  八、带宽限制

  在IIS 5.0和IIS 4.0中,Web网站属性对话框的“性能”页允许启用带宽限制功能,指定允许网站占用的最大带宽。不过,这个功能不一定起作用,因为IIS 5.0和IIS 4.0不能直接操作服务器的网卡。

  IIS 6.0则不同,第一次启用带宽限制功能时,Windows 2003自动安装QoS数据包计划程序供IIS服务器调用。QoS数据包计划程序使得服务器能够控制服务质量(即QoS),因此安装期间Windows 2003将临时地停止所有网络服务。配置好QoS数据包计划程序后,IIS才真正有了担负起控制网站带宽限制所需的驱动程序——对于ISP来说,这无疑是一个好消息。允许设置的最小带宽限制值是1024 Byte/秒。不要忘了检查一下网卡是否在Windows 2003硬件兼容清单(HCL)中,因为只有最新的网卡才支持QoS功能。
  要配置QoS数据包计划程序,首先必须创建一个组策略控制台。点击“开始”→“运行”,输入“mmc”,然后点击“确定”。在控制台窗口中,选择菜单“文件”→“添加/删除管理单元”,点击“添加”,在“添加独立管理单元”对话框中,选择“组策略对象编辑器”,然后依次点击“添加”、“完成”、“关闭”、“确定”。现在依次扩展控制台中的“本地计算机策略”、“计算机配置”、“管理模板”、“网络”,显示出“QoS数据包计划程序”,如图五所示。



图五

  启用带宽限制之前,请使用系统监视器检查“网络接口”对象中的总字节数/秒或当前带宽计数器。如果希望比较传入和传出流量,请检查发送的字节数/秒和接收的字节数/秒,再比较“网络接口”对象的值和网络连接的总带宽。对于“正常”的负载,服务器使用的带宽不应超过其全部可用带宽的50%。如果服务器有较大的高峰负载,请将正常负载保持在50%以下,剩下的带宽可在高峰期使用。

  带宽限制可以是针对全局WWW服务的(即对所有网站都有效),也可以是针对单个网站的。设置全局WWW服务最大带宽不会替代已为服务器上的单个网站设定的最大带宽。单个站点根据已设置的最大值来限制带宽,而全局设置限制所有其他未限制带宽的网站。另外,全局WWW服务带宽限制设置不会影响FTP站点或FTP服务。

  九、默认设置的变化

  在IIS 6.0中,许多配置项目的默认值已经与IIS 5.0或IIS 4.0的不同。例如,默认的连接超时时间已经从900秒减少到120秒,另外,EnableParentPaths设置默认关闭。还有其他一些新的设置项目也会影响服务器的性能和行为,包括:

  ⑴ 如果某种文件类型没有在MimeMap配置属性中映射,所有对该类文件的请求将被拒绝。

  ⑵ 默认情况下,所有工作进程会在1740分钟后自动回收,回收期间会话信息可能丢失。

  ⑶ 运行CGI应用程序的用户上下文必须是一个IIS_WPG组的成员。

  ⑷ Windows 2003不安装Collaboration Data Objects for Windows NT Server(CDONTS)。微软建议开发者改用CDO for Windows 2000(CDOSYS)对象。

  ⑸ ASP请求默认限制在204800字节之下,每一个域限制在100 KB之下。IIS 5.0和IIS 4.0没有这方面的限制。

  ⑹ 默认情况下,http.sys仅接受标题小于16 KB的请求。

  本文关于IIS 6.0的介绍就到这里结束,虽然文章很长,但还是不可能做到面面俱到,例如,还没有提及受到广泛关注的Passport验证和摘要验证方面的改进,本文的重点放在一些具有突破性意义的IIS 6.0新特性以及几种较少有人提及的功能,以此证明IIS 6.0改进的广泛性、深入性。从许多方面来看,IIS 6.0的风头甚至盖过了Windows 2003——而且许多人认为,IIS 6.0确实有资格占据舞台的中央。

原文转自:http://www.ltesting.net