我們在使用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里的配置。這簡化了站點和應用程序服務器上的管理。