共用方式為


建置自定義 IIS 7.0 伺服器

邁克·沃洛達爾斯基

簡介

IIS 6.0 和舊版實作伺服器本身內大部分廣泛使用的伺服器功能。 相反地,IIS 7.0 和更新版本的網頁伺服器引擎提供模組化架構,其中幾乎所有的伺服器功能都提供為可插式元件。 這可全面改善,包括:

  • 能夠精確控制伺服器上所載入/使用的一組功能,移除不需要的功能,以減少伺服器的攻擊面區/記憶體使用量
  • 能夠將每項功能取代為第三方或自定義實作
  • 能夠根據其在伺服器拓撲中的角色來特製化伺服器
  • 進階控制伺服器的功能集,無論是精細的粒度還是 application-delegatable 層級

這些伺服器元件稱為模組,會在應用程式集區背景工作進程初始化期間載入,並在伺服器上提供要求處理服務。 每個 IIS 7.0 和更新版本應用程式都是針對應用程式啟用的模組所提供的服務,以及這些服務所使用的相關聯內容的組合。 伺服器提供模組所扮演的兩個主要角色:

  • 提供要求服務,例如驗證或輸出快取(類似於 IIS 6.0 中的 ISAPI 篩選器)
  • 提供要求處理,例如靜態檔案處理、CGI 或 ASP.NET 頁面處理(類似於 IIS 6.0 中的 ISAPI 延伸模組)

藉由啟用不同的模組,可以將伺服器設定為提供伺服器上應用程式所需的服務。

本文說明的工作包括:

  • 檢閱伺服器組態、預設和伺服器上載入的模組集
  • 拿掉所有模組以將伺服器縮減到其最小設定,並檢查使用量的影響
  • 藉由以累加方式新增模組來支援特定案例來建置自定義伺服器

檢閱預設模組組態

主要伺服器組態包含在位於 IIS 組態目錄 %windir%\system32\inetsrv\config\的 applicationHost.config 檔案中。 我們會查看區段群組中包含的 <system.webServer> 下列組態:

<globalModules> 部分。 此伺服器層級區段包含伺服器背景工作進程所載入的模組清單,以及實作其功能的相關聯原生 DLL。

<modules> 部分。 此應用層級區段包含針對特定應用程式啟用的模組清單。 本節可用來選取應用程式中應作用中之已載入模組的子集,以及載入其他應用層級模組。

<handlers> 部分。 此 URL 層級區段包含處理程式對應,伺服器用來將連入要求對應至將處理它的特定模組。 這類似於 IIS 6.0 腳本對應或 ASP.NET,並且提供原生和 Managed 內容類型處理程式要求的統一對應。

IIS 7.0 和更新版本的模組概觀提供 所有 IIS 模組的完整描述。

建立組態備份

首先,我們會備份伺服器組態,以便在必要時加以還原。 從以 管理員 istrator 身分執行的命令提示字元執行下列命令:

%windir%\system32\inetsrv\appcmd add backup initial

然後,我們可以執行下列命令,將伺服器組態還原至初始狀態:

%windir%\system32\inetsrv\appcmd restore backup initial

檢查模組的預設清單

流覽至 <system.webServer>/<globalModules 區> 段。 本節只能在伺服器層級上設定,其中包含每個伺服器背景工作進程所載入的模組。 每個項目都會使用特定名稱和實作該模組功能的 DLL 來設定模組:

<globalModules>

    <!--several modules omitted -->

    <add name="BasicAuthenticationModule" image="…\authbas.dll" />

    <add name="WindowsAuthenticationModule" image="…\authsspi.dll" />

</globalModules>

檢視預設伺服器組態中各種模組的名稱 – 我們看到在 IIS 6.0 中作為伺服器一部分提供的熟悉服務:

Windows 驗證模組,NTLM 要求驗證

<add name="WindowsAuthenticationModule" image="…\authsspi.dll" />

靜態檔案處理程式模組,提供靜態檔案

<add name="StaticFileModule" image="…\static.dll" />

動態壓縮模組,回應的壓縮

<add name="DynamicCompressionModule" image="…\compdyn.dll" />

流覽至 <system.webServer>/<modules> 區段。 此區段可在伺服器或應用層級設定,指定特定應用程式已啟用 globalModules> 區段中載入<的模組。 在大部分情況下,我們看到本節列出我們在 區段中看到的模組名稱,預設會為所有應用程式啟用它們。

注意

清單結尾有一些額外的專案 – 這些是使用 ASP.NET 擴充性模型開發的 Managed 模組。 在使用 .NET 開發模組逐步解說中深入瞭解建置Managed模式。

流覽至 <system.webServer>/<handlers 區> 段。 本節可在伺服器、應用程式或URL層級設定,指定處理要求的方式。 模組通常會參與每個要求,而處理程式只會取得特定URL的要求。

模組的良好範例是壓縮模組。 壓縮模組會查看每個回應,並視需要壓縮它。 ASP.NET 頁處理程式是處理程式的良好範例。 它只會接收對應至它的要求,例如具有擴充功能.aspx的要求。 此 <handlers> 清單會根據 URL 和動詞定義要求之間的對應,以及將用來處理此要求的處理模組。 另外還有一些額外的資訊可用來設定每個對應,這不是本主題的焦點。

<handlers>
    <!-- certain details omitted -->
    <add name="CGI-exe" path="*.exe" verb="*" modules="CgiModule" ... />
    <add name="ISAPI-dll" path="*.dll" verb="*" modules="IsapiModule" ... />
    <add name="ASPClassic" path="*.asp" verb="GET,HEAD,POST"  modules="IsapiModule" ... />
</handlers>

檢查伺服器使用量

  1. 開啟 Internet Explorer,並藉由指定下列 URL 並按 Enter,向伺服器提出要求:

    http://localhost/iisstart.htm
    

    這會啟動伺服器應用程式集區,並提供iisstart.htm檔。

  2. 啟動任務管理員,然後移至 [行程] 索引標籤。因為 IIS 背景工作進程在不同的使用者帳戶下執行,您必須檢查 「顯示所有用戶的進程」。 請注意w3wp.exe伺服器背景工作進程的大小。
    顯示 Windows 任務管理器的螢幕快照。已選取 [行程] 索引標籤。
    圖 1:顯示 IIS 背景工作進程的工作管理員

  3. 現在執行下列命令列:

    TASKLIST /fi "imagename eq w3wp.exe" /m
    

    我們看到背景工作進程已載入超過90個 DLL。 其中大部分都位於 ...\intersrv\ 目錄中– 其中許多是查看 <globalModules> 區段時,我們在第一個工作中看到的模組 DLL,以及一些支援 .NET Framework 和伺服器運行時間本身的其他 DLL。

拿掉伺服器

在上一個工作中,我們檢查了伺服器載入的預設元件清單,其中包含超過 35 個模組,這些模組提供各種服務,範圍從驗證到靜態檔案服務。 伺服器中載入的每個元件都會對伺服器使用量、其受攻擊面區、運行時間效能以及啟用的功能集產生影響。

在建置只有下一個工作所需功能的自定義伺服器之前,我們會藉由移除所有模組並執行空白伺服器,來建置快速、小型且安全的網頁伺服器。

如果我們在上一個工作期間變更了 applicationHost.config 檔案,我們可以從命令行執行 %windir%\system32\inetsrv\appcmd restore backup initial ,將它還原至原始狀態。

現在,若要移除伺服器。

  1. 使用文字編輯器開啟 %windir%\system32\inetsrv\config\applicationHost.config

  2. 流覽至 區 <system.webServer>/<globalModules> 段。

  3. 移除集合中的所有專案,只保留空白區段定義:

    <globalModules> 
        <!—Remove Everything --> 
    </globalModules>
    
  4. 將專案貼到臨時記事本視窗中,以供稍後使用。 使用 <system.webServer>/<modules> 區段重複相同。 拿掉本節下的所有專案,並將其貼到臨時記事本以供稍後使用。 這可確保我們不會再啟用任何模組。 將這些剪下的專案貼到臨時記事本視窗中,以供稍後使用。

  5. 使用 <system.webServer>/<handlers> 區段重複相同。 拿掉本節下的所有專案,以確保我們不會在停用的模組中指定任何處理程序對應。 將專案貼到臨時記事本,以供稍後使用。 儲存 applicationHost.config 檔案以影響變更。

檢查已移除的伺服器使用量

此時,我們已準備好載入已移除的伺服器 – 我們將重複上述步驟來檢查伺服器的新使用量。

  1. 開啟 Internet Explorer,並藉由指定下列 URL 並按 Enter,向伺服器提出要求:

    http://localhost/iisstart.htm
    

    這應該會啟動伺服器應用程式集區,並傳回錯誤給瀏覽器,因為未註冊任何處理程式來提供您要求的資源。

  2. 執行任務管理員,然後移至 [行程] 索引標籤。請注意w3wp.exe伺服器背景工作進程的大小。

  3. 執行下列命令列:

    TASKLIST /fi "imagename eq w3wp.exe" /m
    

    觀察伺服器使用量已縮減為約 8Mb。 在伺服器時間範圍內,空伺服器的使用量將會進一步降低。

    與 90 個以上的 DLL 相比,只會載入 50 個 DLL , 這表示伺服器未載入任何模組 DLL,而 DLL 計數差異則直接或間接地考慮到了 DLL 計數差異。 不僅伺服器上的服務已停用,而且程式中甚至不會載入這些功能的程式代碼。 優化之後,空伺服器的 DLL 計數將會明顯降低。

在下一個工作中,我們將只使用我們想要的功能來建置自定義伺服器。

建置自定義伺服器

在上一個工作中,我們已將伺服器移除為最低設定,只有核心伺服器引擎正在執行,而且不會載入其他模組。 現在,我們會建置自定義伺服器,以作為公司網路上的 Web 文件伺服器。 若要這樣做,我們會讓伺服器只提供下列服務:

  • 提供靜態檔案
  • 提供目錄清單
  • 使用基本身份驗證和 URL 型授權規則來保護內容

讓伺服器提供靜態檔案

若要執行這項工作,假設我們已遵循上一個工作,並移除它執行的所有模組來移除伺服器。 在此狀態下,伺服器一律會傳回空的 401 錯誤回應給所有要求,因為沒有任何模組載入以提供任何類型的要求處理。

  1. 使用文字編輯器開啟 %windir%\system32\inetsrv\config\applicationHost.config

  2. 流覽至 <system.webServer>/<globalModules 區> 段。 在集合內以粗體新增 2 行 – 從先前用來儲存預設集合專案的臨時板複製它。 這會載入靜態檔案處理程式模組,負責處理靜態檔案的要求,以及匿名驗證模組,這會產生要求的默認驗證令牌:

    <globalModules>
        <add name="StaticFileModule" image="%windir%\System32\inetsrv\static.dll" />
        <add name="AnonymousAuthenticationModule" image="%windir%\System32\inetsrv\authanon.dll" />
    </globalModules>
    
  3. 流覽至 <system.webServer>/<modules> 區段。 藉由在下方以粗體新增這一行,以啟用靜態檔案處理程式和匿名驗證模式:

    <modules>
    
        <add name="AnonymousAuthenticationModule" />
    
        <add name="StaticFileModule" />
    
    </modules>
    
  4. 流覽至 <system.webServer>/<handlers 區> 段。 將靜態檔案處理程式對應至所有檔案要求,方法是在下方以粗體新增這一行:

    <handlers>
        <add name="StaticFile" path="*" verb="GET,HEAD"  modules="StaticFileModule" resourceType="Either" requireAccess="Read"/>
    </handlers>
    
  5. 儲存 applicationHost.config 檔案。

  6. 開啟 Internet Explorer,然後向下列 URL 提出要求:

    http://localhost/iisstart.htm
    

    這會提供所要求的檔。 我們已成功在伺服器上啟用靜態檔案服務功能。

  7. 接下來,向下列 URL 提出要求來要求目錄清單:

    http://localhost
    

    由於目前沒有載入、啟用和對應至進程目錄清單的處理程式,因此我們會收到空的回應,因此會傳送空白回應 (200 OK)。 在下一個工作中,我們將新增 處理程式。

啟用伺服器提供目錄清單

若要執行這項工作,假設我們已執行先前的工作、將伺服器移除為無專案,並新增檔案服務功能。

  1. 使用文字編輯器開啟 %windir%\system32\inetsrv\config\applicationHost.config

  2. 如前所述,新增下列組態以啟用目錄瀏覽模組,並將其對應至提供目錄要求(累積組態看起來與此步驟之後的指定完全相同,建置在上一個步驟之上):

    <globalModules>
        <add name="AnonymousAuthenticationModule" image="%windir%\system32\inetsrv\authanon.dll" />
        <add name="StaticFileModule" image="%windir%\system32\inetsrv\static.dll" />
        <add name="DirectoryListingModule" image="%windir%\System32\inetsrv\dirlist.dll" />
    </globalModules>
    
    <modules>
        <add name="AnonymousAuthenticationModule" />
        <add name="StaticFileModule" />
        <add name="DirectoryListingModule" />
    </modules>
    
    <handlers>
        <add name="StaticFile" path="*" verb="GET,HEAD" modules="StaticFileModule,DirectoryListingModule"  resourceType="Either" requireAccess="Read" />
    </handlers>
    

    此時,我們已在伺服器上啟用目錄清單功能。 不過,基於安全性考慮,此功能會公開其他設定,以控制是否允許目錄清單。 此組態是在 system.webServer>/directoryBrowse> 區段中指定<<。

  3. 將項目變更為 <directoryBrowse enabled=“true” />

  4. 儲存 applicationHost.config 檔案。

  5. 開啟 Internet Explorer,並藉由要求下列 URL,對目錄重複要求:

http://localhost

這會提供所要求目錄的清單。 我們已成功在伺服器上啟用目錄清單功能。

接下來,我們會新增驗證和授權服務,以保護伺服器上的內容不受未經授權的存取。

使用 URL 授權保護資源

若要執行這項工作,假設我們已遵循先前的工作、將伺服器移除為無專案,並新增檔案服務與目錄清單功能。

  1. 使用文字編輯器開啟 %windir%\system32\inetsrv\config\applicationHost.config

  2. 這次,我們會新增兩個模組:

    • 基本身份驗證模組,可針對伺服器 Windows 認證支援透過 HTTP1.1 的基本驗證配置
    • 支援使用者和角色規則型訪問控制的 URL 授權模組
  3. 若要新增這些模組,請將模組載入專案新增至 <system.webServer/<globalModules> 區段,然後在 system.webServer>>/<modules> 區段中啟用模組<,如同我們稍早針對靜態檔案處理程式和目錄瀏覽器所做的一樣。

    注意

    這次我們不需要將任何專案新增至 <system.webServer>/<handlers 區> 段,因為這些模組不會提供要求處理 –它們只會為所有要求提供要求服務。 在以粗體新增下列項目之後,您的最終設定看起來會像這樣:

    <globalModules>
        <add name="AnonymousAuthenticationModule" image="%windir%\system32\inetsrv\authanon.dll" /> 
        <add name="StaticFileModule" image="%windir%\system32\inetsrv\static.dll" /> 
        <add name="DirectoryListingModule" image="%windir%\system32\inetsrv\dirlist.dll" /> 
        <add name="UrlAuthorizationModule" image="%windir%\System32\inetsrv\urlauthz.dll" />      
        <add name="BasicAuthenticationModule" image="%windir%\System32\inetsrv\authbas.dll" /> 
    </globalModules> 
    
    <modules> 
        <add name="AnonymousAuthenticationModule" /> 
        <add name="StaticFileModule" /> 
        <add name="DirectoryListingModule" /> 
        <add name="BasicAuthenticationModule" /> 
        <add name="UrlAuthorizationModule" /> 
    </modules>
    

    為了使用新增的功能,我們需要進行設定。

  4. 啟用基本身份驗證服務。 流覽至 <basicAuthentication> 元素,並將 enabled 屬性設定為 true:

    <basicAuthentication enabled="true" />
    
  5. 停用匿名驗證。 流覽至 <anonymousAuthentication> 元素,並將 enabled 屬性設定為 false:

    <anonymousAuthentication enabled="false" userName="IUSR" />
    

    這會停用匿名驗證,並要求基本身份驗證模組在授與存取權之前成功驗證使用者。

  6. 儲存 applicationHost.config 檔案。

  7. 開啟 Internet Explorer,並藉由要求下列 URL,對目錄重複要求:

    http://localhost
    

    這會要求目錄清單。 由於瀏覽器尚未驗證我們,因此 URL 授權模組會拒絕要求。 基本身份驗證模組會攔截拒絕,並觸發基本身份驗證挑戰回到瀏覽器,導致瀏覽器顯示基本身份驗證登入對話方塊。

  8. 使用無效的認證登入。 要求遭到拒絕,要求會再次提示輸入認證。

  9. 使用您用來登入計算機的 管理員 istrator 帳戶登入。 目錄清單隨即顯示,表示您已成功將驗證和授權功能新增至伺服器。

摘要

本文涵蓋伺服器的元件化本質、檢查所提供的 IIS 功能,並說明如何只使用使用者可能需要的服務來建置自定義網頁伺服器。

再次使用伺服器之前,請先復原在本逐步解說中執行之伺服器組態的變更。 如果您稍早建立備份,請從命令行執行 %windir%\system32\inetsrv\appcmd restore backup initial 來還原備份。

如需詳細資訊,請參閱下列連結: