IIS 架構解析

  咱們在使用ASP.NET平臺作web開發的時候,常常會接觸到IIS(Internet Information Services 互聯網信息服務)。這篇文章主要來介紹IIS7.0+的架構。IIS的安全脆弱性曾長時間被業內詬病,一旦IIS出現遠程執行漏洞威脅將會很是嚴重。遠程執行代碼漏洞存在於 HTTP 協議堆棧 (HTTP.sys) 中,當 HTTP.sys 未正確分析經特殊設計的 HTTP 請求時會致使此漏洞。 成功利用此漏洞的攻擊者能夠在系統賬戶的上下文中執行任意代碼,能夠致使IIS服務器所在機器藍屏或讀取其內存中的機密數據。微軟的技術更新相對較快,IIS7相比較以前的IIS5,IIS6有了很大的改進,解決了IIS5的一些不足,也使用了一些新的結構來提高了性能和安全性。web

  Internet Information Services(IIS)7及之後的版本提供了一套請求處理機制主要又三大功能:數據庫

  1.Windows Process Activation Service(WAS),Windows進程激活服務,主要用來支持HTTP/HTTPS以外的控制協議。windows

  2.一個能夠經過增長/刪除模塊來自定義的引擎。api

  3.集成了IIS和ASP.NET的請求處理管道。瀏覽器

咱們主要經過如下及部分來分解IIS的結構:緩存

  * IIS的組成組件安全

  * 協議監聽器服務器

  * 超文本傳輸協議堆棧(HTTP.sys)網絡

  * Word Wide Web Publishing Service(www Service)session

  * 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 輔助進程的計算機使用的內存內存佔用。
 
6.本地化模塊
  如下各節描述了可用的完整安裝的 IIS 7 +的本機模塊。您能夠根據您的須要刪除它們或將它們替換成自定義模塊。
HTTP 模塊:
  IIS7以後部門模塊主要用來處理HTTP請求。HTTP模塊可以將響應信息輸出到客戶端,返回HTTP錯誤,重定向請求等。
模塊名稱 描述 資源
CustomErrorModule 錯誤狀態代碼設置響應時,發送默認或已配置的 HTTP 錯誤消息。 Inetsrv\Custerr.dll
HttpRedirectionModule 支持可配置重定向的 HTTP 請求。 Inetsrv\Redirect.dll
ProtocolSupportModule 執行相關協議的操做,例如設置基於配置的響應標頭和重定向標頭。 Inetsrv\Protsup.dll
RequestFilteringModule 在 IIS 7.5 中。篩選器請求,當配置爲控制協議和內容的行爲。 Inetsrv\modrqflt.dll
WebDAVModule 在 IIS 7.5 中。經過在 SSL 上使用 HTTP 發佈更安全的內容。 Inetsrv\WebDAV.dll

安全模塊:

在 IIS 中的幾個模塊執行請求處理管線中的安全相關的任務。除此以外,每一個驗證機制都有獨立的模塊,可供你本身選擇本身須要的驗證模塊。還有一些模塊用來過濾請求和URL受權。

模塊名稱 描述       資源
AnonymousAuthenticationModule 當沒有其餘身份驗證方法時,執行匿名身份驗證。 Inetsrv\Authanon.dll
BasicAuthenticationModule 執行基自己份驗證。 Inetsrv\Authbas.dll
CertificateMappingAuthenticationModule 使用 Active Directory 執行證書映射身份驗證。 Inetsrv\Authcert.dll
DigestAuthenticationModule 執行摘要式身份驗證。 Inetsrv\Authmd5.dll
IISCertificateMappingAuthenticationModule 使用 IIS 證書配置執行證書映射身份驗證 Inetsrv\Authmap.dll
RequestFilteringModule 執行 URLScan 任務,如配置容許的動做和文件擴展名、 設置限制、 和掃描壞字符序列。 Inetsrv\Modrqflt.dll
UrlAuthorizationModule 執行 URL 受權。 Inetsrv\Urlauthz.dll
WindowsAuthenticationModule 執行 NTLM 集成的身份驗證。 Inetsrv\Authsspi.dll
IpRestrictionModule 限制了 IPv4 地址在配置 ip 安全列表中列出。 Inetsrv\iprestr.dll

內容模塊:

  在 IIS 中的幾個模塊執行請求處理管道中的內容相關的任務。內容模塊包括模塊來處理請求的靜態文件,當客戶端沒有指定具體頁面時,以返回一個默認的頁面,列出一個目錄,和更多的內容中指定的資源。

模塊名稱 描述 資源
CgiModule 執行通用網關接口 (CGI) 進程,打造響應輸出。 Inetsrv\Cgi.dll
DefaultDocumentModule 嘗試返回的請求到父目錄的默認文檔。 Inetsrv\Defdoc.dll
DirectoryListingModule 列出目錄的內容。 Inetsrv\dirlist.dll
IsapiModule 主機 ISAPI 擴展 Dll。 Inetsrv\Isapi.dll
IsapiFilterModule 支持 ISAPI 篩選器 Dll。 Inetsrv\Filter.dll
ServerSideIncludeModule 處理服務器端包含的代碼。 Inetsrv\Iis_ssi.dll
StaticFileModule 提供靜態文件。 Inetsrv\Static.dll
FastCgiModule 支持 FastCGI,提供更高的性能替代 CGI。 Inetsrv\iisfcgi.dll

壓縮模塊:

  在 IIS 中的兩個模塊在請求處理管道中執行壓縮。

模塊名稱 描述 資源
DynamicCompressionModule 壓縮的響應和適用 Gzip 壓縮傳輸響應編碼。 Inetsrv\Compdyn.dll
StaticCompressionModule 靜態內容執行預壓縮 Inetsrv\Compstat.dll

緩存模塊:

  網站或應用程序中經過存儲網頁之類的處理信息來提升性能和可重用性。

模塊名稱 描述 資源
FileCacheModule 提供用戶模式緩存的文件和文件句柄。 Inetsrv\Cachfile.dll
HTTPCacheModule 在 HTTP.sys 中提供內核模式和用戶模式緩存。 Inetsrv\Cachhttp.dll
TokenCacheModule 提供用戶模式緩存的用戶名稱和令牌對用於生成 Windows 用戶主體的模塊。 Inetsrv\Cachtokn.dll
UriCacheModule 提供用戶模式緩存的 URL 的信息。 Inetsrv\Cachuri.dll

日誌記錄和診斷模塊:

  日誌記錄模塊支持加載自定義模塊,並將信息傳遞給HTTP.SYS.診斷模塊用來在處理請求過程當中關注和報告事件。

模塊名稱 描述 資源
CustomLoggingModule 裝載用戶定義日誌模塊 Inetsrv\Logcust.dll
FailedRequestsTracingModule 支持請求失敗跟蹤 Inetsrv\Iisfreb.dll
HttpLoggingModule 傳遞信息和請求處理狀態到HTTP.SYS做爲日誌 Inetsrv\Loghttp.dll
RequestMonitorModule 跟蹤請求在工做進程中的執行信息,報告運行時的狀態和控制應用程序接口 Inetsrv\Iisreqs.dll
TracingModule 事件報告給 Microsoft 跟蹤 Windows 事件 (ETW)。 Inetsrv\Iisetw.dll

 託管支持模塊:

模塊名稱 描述 資源
ManagedEngine 提供集成的 IIS 請求處理管線中的託管的代碼模塊。 Microsoft.NET\Framework\v2.0.50727\webengine.dll
ConfigurationValidationModule  system.web驗證配置的問題,例如當應用程序以集成模式運行,但已處理程序或模塊中的聲明。 Inetsrv\validcfg.dll

 

7.託管模塊

  除了本地化模塊之外,IIS容許你使用託管代碼模塊來擴展IIS功能。部分託管模塊,好比UrlAuthorization,有一個相對應的本地化模塊來替換託管模塊。

值得注意的是託管模塊依賴於ManagedEngine模塊。下面列出了完整的IIS7的託管模塊,有關託管模塊的詳細信息請參閱MSDN上的.NET框架2.0.

模塊名稱 描述 資源
AnonymousIdentification  管理由支持匿名標識如 ASP.NET 配置文件功能使用的匿名標識符 System.Web.Security.AnonymousIdentificationModule
DefaultAuthentication  確保身份驗證對象是存在於上下文。 System.Web.Security.DefaultAuthenticationModule
FileAuthorization  驗證用戶具備訪問所請求的文件的權限。 System.Web.Security.FileAuthorizationModule
FormsAuthentication  經過使用窗體身份驗證支持的身份驗證 System.Web.Security.FormsAuthenticationModule
OutputCache  支持輸出緩存 System.Web.Caching.OutputCacheModule
Profile  經過使用ASP.NET身份來管理用戶簡歷,從數據庫存儲和獲取數據源 System.Web.Profile.ProfileModule
RoleManager  管理當前用戶的角色 System.Web.Security.RoleManagerModule   
Session  支持維護session狀態,容許存儲的信息輸出到指定的客戶端 System.Web.SessionState.SessionStateModule
UrlAuthorization  基於用戶名和權限列表決定當前用戶是否有權限訪問URL System.Web.Security.UrlAuthorizationModule
UrlMappingsModule  支持真實的URL映射到一個用戶友好的URL System.Web.UrlMappingsModule
WindowsAuthentication  啓用windows受權就能夠設置ASP.NET用戶認證 System.Web.Security.WindowsAuthenticationModule

 

8.IIS中請求的處理

  在IIS7中,IIS和ASP.NET請求管道經過集成方式組合來處理I請求。新的請求架構包括執行特定的任務以響應請求的本地化和託管模塊列表。這種設計相對於之前的版本有如下幾大好處:

  * 全部的文件類型可使用最初僅提供給託管代碼的功能。好比你如今能夠爲靜態頁面,活動服務器頁面以及你的網站和應用程序中其餘類型的文件使用ASP.NET Form身份認證和統一資源定位器受權。

  *這種設計消除了IIS和ASP.NET中相互重複的幾個功能。好比:當客戶端請求一個託管文件時,服務器在集成管道中經過調用適當的認證模塊來對客戶端進行認證。可是在以前的IIS版本中,這種受權會在IIS和ASP.NET中都進行驗證。

  *你能夠在同一個地方管理全部的模塊,而不是去管理一部分在IIS裏配置一部分在ASP.NET裏的配置。這簡化了站點和應用程序服務器上的管理。

9.在IIS中的應用程序池

  應用程序池經過進程邊界來分割應用程序來阻止服務器上的應用程序之間的相互干擾。IIS7繼續沿用IIS6的工做進程隔離模式。此外,你如今能夠指定一個設置來決定如何處理託管資源請求:集成模式和經典模式。

  IIS6和IIS5的工做進程隔離模式是在服務器層級設置的。這就不可能容許兩個隔離模(集成和經典)式在同一臺服務器上運行。然而在IIS7集成模式和經典模式是在應用程序池級別來設置的。這就容許在同一臺服務器上同時運行不一樣隔離模式的應用程序。

集成應用程序池模式:

  當應用程序池是在集成模式下時,您能夠利用 IIS 和 ASP.NET 的集成請求處理體系結構。在應用程序池中的工做進程接收請求時,該請求將經歷事件的排序列表。每一個事件調用的請求和生成響應的過程部分必要的本機和託管模塊。在集成模式下運行應用程序池有幾個好處。首先, IIS 和 ASP.NET 的請求處理模型被集成到統一的過程模型。這個模型消除了先前重複的 IIS 和 ASP.NET功能,如身份驗證的步驟。另外,集成的模式使託管功能對全部內容類型的可用性。

經典應用程序池模式:

  當一個應用程序池是經典模式的時候,IIS7處理請求的工做進程隔離模式和IIS6的處理方式是同樣的。ASP.NET 請求首先經過在 IIS 中的本機處理步驟,而後將其路由到 Aspnet_isapi.dll 處理的託管運行時中的託管代碼。最後,請求被路由經過 IIS 將響應發送回。這種 IIS 和 ASP.NET 請求處理模型的分離致使工做重複,一些處理步驟,如身份驗證和受權另外,託管的代碼的功能,如窗體身份驗證,只可用於 ASP.NET 應用程序或您有腳本的應用程序映射由 aspnet_isapi.dll 處理的全部請求。

必定要在升級到 IIS 7 及更高版本的生產環境和分配到應用程序池在集成模式下的應用程序以前在集成模式下測試您現有的應用程序的兼容性。若是應用程序將沒法在集成模式下工做,只應在經典模式下添加到應用程序池的應用程序。例如,您的應用程序可能會依賴於從 IIS 傳遞到託管運行時,身份驗證令牌和 IIS 7 和後來的新體系結構,因爲進程中斷您的應用程序。

10.在IIS中處理HTTP請求

  下面的列表描述了請求處理流程:

  1.當客戶端發起你個面向服務器的http請求後,HTTP.sys截獲該請求。

  2.HTTP.sys通知WAS從配置文件中獲取必要的信息。

  3.WAS從applicationHost.config文件中請求配置信息。

  4.W3SVC接收到相應的配置信息:應用程序池,網站配置等信息。

  5.W3SVC使用配置信息來配置HTTP.sys.

  6.WAS爲請求隔離模式相匹配的應用程序池開啓一個工做進程。

  7.工做進程處理請求而且返回響應給HTTP.sys.

  8.客戶端接收響應。

總的請求過程以下圖:

  在工做過程當中,在 Web 服務器核心,HTTP 請求經過幾個有序的步驟,稱爲事間。在每一個事件,本機模塊處理請求,如用戶進行身份驗證或將信息添加到事件日誌的一部分。若是請求須要一個託管的模塊,本機 ManagedEngine 模塊建立的 AppDomain,那裏託管的模塊能夠執行進行必要的處理,如使用 Forms 身份驗證的用戶進行身份驗證。當請求穿過全部的 Web 服務器核心事件時,到 HTTP.sys 會返回的響應。圖 2 所示輸入輔助進程的 HTTP 請求。

關於每一個事件的做用感興趣的同窗能夠自行研究。這裏咱們整個IIS的結構就所有結束了。

相關文章
相關標籤/搜索