瞭解 IIS 中的身分識別

本文提供 Internet Information Services (IIS) 中身分識別的背景資訊。

原始產品版本: Internet Information Services
原始 KB 編號: 4466942

應用程式集區身分識別

若要瞭解應用程式集區身分識別,您必須瞭解身分識別是什麼。 簡單來說,身分識別是 Windows 帳戶。 在 Windows 中執行的每個進程都會在身分識別下執行。 應用程式是由背景工作進程使用 Windows 身分識別來執行。 使用的 Windows 身分識別取決於應用程式集區身分識別,它可以是下列任何一個帳戶:

Windows 身分識別帳戶。

  • 本機系統: 具有高許可權且也可以存取網路資源的信任帳戶。
  • 網路服務: 用來執行標準、最低許可權服務的受限制服務帳戶。 此帳戶的許可權比本機系統帳戶少。 此帳戶可存取網路資源。
  • 本地服務: 受限制或受限的服務帳戶,類似於網路服務,且旨在執行標準、最低許可權的服務。 此帳戶無法存取網路資源。
  • ApplicationPoolIdentity: 建立新的應用程式集區時,IIS 會建立具有新應用程式集區名稱且在此帳戶下執行應用程式集區背景工作進程的虛擬帳戶。 這也是最低許可權的帳戶。
  • 自訂帳戶: 除了這些內建帳戶之外,您也可以藉由指定使用者名稱和密碼來使用自定義帳戶。

應用程式集區身分識別之間的差異

  • 案例 1:事件記錄檔存取

    在此案例中,您有一個 Web 應用程式會 (MyWebAppZone) 建立自定義事件記錄檔,並在運行時間 (MyWebAppZone.com) 事件記錄檔來源。 使用任何身分識別執行的應用程式可以使用現有的事件來源寫入事件記錄檔。 不過,如果它們是在本機系統以外的身分識別下執行,則無法建立新的事件來源,因為登錄許可權不足。

    我的 Web 應用程式區域。

    例如,如果您在 [網络服務] 下執行應用程式,您會收到下列安全性例外狀況:

    伺服器錯誤的螢幕快照。

    當您同時執行 ProcMon 追蹤時,您通常會發現 NT AUTHORITY\NETWORK SERVICE 沒有下列登錄子機碼的必要讀取和寫入存取權限:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\

    這是登錄中儲存事件記錄檔所有設定的位置。

    進程監視器 1 的螢幕快照。

  • 案例 2:登錄存取

    除了本機系統之外,其他應用程式集區身分識別都沒有登錄的寫入許可權。 在此案例中,您已開發簡單的 Web 應用程式,可變更並顯示 Windows 自動同步處理的因特網時間伺服器名稱。 如果您在 [本地服務] 下執行此應用程式,您會收到例外狀況。 如果您檢查 ProcMon 追蹤,您會發現 「NT AUTHORITY\LOCAL SERVICE」 應用程式集區身分識別在下列登錄子機碼中沒有讀取和寫入存取權:

    HKEY_LOCAL_MACHINE** **\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers

    進程監視器 2 的螢幕快照。

    如果您從案例 1) 檢查 MyWebAppZone 事件記錄檔 (,您會發現已記錄下列錯誤事件。 其中包含 Requested registry access is not allowed 錯誤訊息。

    Exception Type: SecurityException  
    Message: Requested registry access is not allowed.  
    Stack Trace  
    at Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable)  
    at Identities.ChangeTimeServer.Page_Load(Object sender, EventArgs e)  
    at System.Web.UI.Control.LoadRecursive()  
    at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)  
    at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)  
    at System.Web.UI.Page.ProcessRequest()  
    at System.Web.UI.Page.ProcessRequest(HttpContext context)  
    at ASP.changetimeserver_aspx.ProcessRequest(HttpContext context) in c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\fd06117a\f8c94323\App_Web_ysqbhk00.2.cs:line 0  
    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()  
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
    
  • 案例 3:Kerberos 驗證和負載平衡環境中的自定義帳戶

    您已在案例 1 和 2 中看到內建帳戶之間的一些差異。 現在,讓我們討論自定義帳戶是什麼,以及當您在負載平衡環境中使用 Kerberos 驗證時,其優於內建帳戶的優點。

    藉由使用此方法,您可以在設定為使用特定 Windows 身分識別執行的應用程式集區中執行應用程式。 請考慮下圖,其中應用程式裝載於包含兩部伺服器的負載平衡環境中,並使用 Kerberos 驗證來識別用戶端。

    負載平衡環境中 Kerberos 驗證的螢幕快照。

    若要讓 Kerberos 驗證能夠運作,您必須使用這兩部伺服器的電腦帳戶來設定 SPN。 如果應用程式集區是在內建帳戶下執行,它會在網路上顯示計算機認證。 例如,如果計算機名稱為 Server1,則會顯示為 'Server1$'。 當計算機加入網域時,會自動建立此電腦帳戶。 因此,如果有 N 部伺服器,您必須設定對應至其個別電腦帳戶的 N 個 SPN 數目。

    向電腦帳戶註冊 SPN:

    setspn -a HTTP/HOSTNAME MachineAccount$
    

    例如:

    setspn -a HTTP/MyWebAppZone.com Server1$
    

    若要克服此缺點,您可以在自定義 Windows (網域) 身分識別下執行應用程式,然後在域控制器中將 SPN 設定為僅限該特定網域帳戶。

    向網域帳戶註冊 SPN:

    setspn -a HTTP/HOSTNAME domain\account
    

    例如:

    setspn -a HTTP/MyWebAppZone.com contoso.com\account_alias
    

wwwroot 中的預設許可權和用戶權力

IIS 7.0 和更新版本也可讓您更輕鬆地設定應用程式集區身分識別,並進行所有必要的變更。 當 IIS 啟動背景工作進程時,它必須建立進程將使用的令牌。 建立此令牌時,IIS 會在運行時間自動將成員資格新 IIS_IUSRS 增至背景工作進程令牌。 以 應用程式集區身分識別執行的 帳戶不再必須是群組的 IIS_IUSRS 明確部分。 如果您建立網站,然後將實體位置 C:\inetpub\wwwroot指向 ,下列使用者和群組會自動新增至網站的訪問控制清單。

使用者 / 群組 允許的權限
CREATOR OWNER 特殊權限
SYSTEM 完全控制
系統管理員 完全控制
使用者 讀 & 執行、列出資料夾內容、讀取
IIS_USRS 讀取與執行
TrustedInstaller 完全控制

如果您想要停用這項功能,並手動將帳戶新增至IIS_IUSRS群組,請在ApplicationHost.config檔案中將manualGroupMembership值設定true。 下列範例示範如何對預設應用程式集區執行這項操作:

<applicationPools> 
    <add name="DefaultAppPool"> 
        <processModel manualGroupMembership="true" />
    </add>
</applicationPools>

瞭解設定隔離

IIS 背景工作進程沒有 ApplicationHost.config 檔案的讀取許可權。 因此,您可能會想知道其如何讀取此檔案中的任何組態集。

答案是在 IIS 7.0 和更新版本中使用設定隔離功能。 Windows Process Activation Service (WAS) 會產生此檔案的篩選複本,而不是讓 IIS 背景工作進程在讀取組態檔階層時直接讀取ApplicationHost.config。 在 IIS 背景工作進程內讀取組態時 每個 IIS 背景工作進程都會使用這些複本來取代ApplicationHost.config。 這些檔案預設會在 目錄中 %SystemDrive%\inetpub\Temp\appPools 產生,並命名為 {AppPoolName}.config。這些檔案會設定為使用 IIS APPPOOL\AppPoolName 應用程式集區安全標識子 (SID) ,只允許存取對應應用程式集區中的 IIS 背景工作進程。

注意事項

若要深入瞭解 SID,請參閱 安全標識符

使用應用程式集區進行設定隔離的螢幕快照。

這麼做是為了防止來自應用程式集區 A 的 IIS 背景工作進程讀取應用程式集區 B 之 ApplicationHost.config 檔案中的組態資訊。

ApplicationHost.config 可能包含敏感性個人資訊,例如自定義應用程式集區身分識別的使用者名稱和密碼,或虛擬目錄的使用者名稱和密碼。 因此,允許所有應用程式集區存取 ApplicationHost.config 會中斷應用程式集區隔離。 如果每個應用程式集區都獲得 ApplicationHost.config 檔案的直接存取權,則這些集區可以執行下列命令,輕鬆地從其他應用程式集區中破解機密資訊:

appcmd list APPPOOL "DefaultAppPool" /text:*

使用 appcmd 命令的螢幕快照。

IUSR - 匿名驗證

匿名驗證可讓使用者存取網站的公用區域,而不會提示您輸入使用者名稱或密碼。 在 IIS 7.0 和更新版本中,內建帳戶 IUSR會用來提供匿名存取。 此內建帳戶不需要密碼。 它將會是啟用匿名驗證時所使用的預設身分識別。 在 ApplicationHost.config 檔案中,您可以看到下列定義:

<authentication>
     <anonymousAuthentication enabled="true" userName="IUSR" />
 </authentication>

這會指示 IIS 針對所有匿名驗證要求使用新的內建帳戶。 這麼做的最大優點如下:

  • 您不再需要擔心此帳戶的密碼即將到期。
  • 您可以使用 xcopy /o ,順暢地將檔案及其擁有權和 ACL 資訊複製到不同的電腦。

您也可以使用特定的 Windows 帳戶或應用程式集區身分識別,而不是 IUSR 帳戶,為您的網站提供匿名驗證。

IUSR 與 Connect 的比較

[連線為 ] 是 IIS 中的選項,可讓您決定要用來存取網站的認證。 您可以使用已驗證的使用者認證或特定的使用者認證。 若要了解差異,請考慮下列案例:

您有設定為使用匿名驗證的預設網站。 不過,您的網站內容位於另一部伺服器上,而您使用 Connect as 區段透過網域使用者存取該資源 Test 。 當使用者登入時,會使用IUSR帳戶來驗證他。 不過,網站內容是透過 Connect as 區段中所述的使用者認證來存取。

簡單來說,匿名驗證是網站用來識別用戶的機制。 但是當您使用這項功能時,使用者不需要提供任何認證。 不過,可能有類似的案例,其中的內容位於網路共用上。 在這種情況下,您無法使用內建帳戶來存取網路共用。 相反地,您必須使用特定帳戶 (網域) 來執行此動作。

ASP.NET 模擬

實際上,模擬表示偽裝成另一個人的動作。 就技術方面而言,這是 ASP.NET 安全性功能,可讓您控制執行應用程式程式碼所用的身分識別。 當 ASP.NET 在已驗證和授權用戶端的內容中執行程式代碼時,就會發生模擬。 IIS 使用帳戶提供資源的 IUSR 匿名存取。 將要求傳遞至 ASP.NET 之後,會使用應用程式集區身分識別來執行應用程式程序代碼。

如果應用程式使用匿名驗證,而且下列其中一個條件成立,則可以透過 IIS 和 ASP.NET 程式代碼啟用模擬:

  • 如果 IMPERSONATION 停用,則會使用應用程式集區身分識別來執行應用程式程序代碼。
  • 如果 IMPERSONATION 已啟用, NT AUTHORITY\IUSR 會用來執行應用程式程式碼。

透過 IIS 啟用時 impersonation ,它會在應用程式的 Web.config 檔案中新增下列卷標,以模擬 IIS 驗證帳戶或使用者: <身分識別 impersonate=“true” />

若要針對 ASP.NET 應用程式所有頁面上的所有要求模擬特定使用者,您可以在該應用程式的 Web.config 檔案標記中 <identity> 指定使用者名稱和密碼屬性。

<identity impersonate="true" userName="accountname" password="password" />

若要透過 ASP.NET 程式代碼實作模擬,請參閱 在 ASP.NET 應用程式中實作模擬

開啟模擬本機使用者之測試網站 Test 的 IIS 背景工作進程,並檢查您是否可以找到應用程式程式代碼執行所在的模擬帳戶。

應用程式的應用程式集區身分識別會設定為 ApplicationPoolIdentity,並使用 IUSR 帳戶提供匿名驗證。 您可以使用 ProcMon 輕鬆地追蹤模擬身分識別。 例如,如果您檢查其中一個對應至所檢查 w3wp.exe 程式的 CreateFile 事件,您可以找到模擬帳戶,如下列螢幕快照所示。

事件屬性中仿真的詳細數據。