﻿# 介紹 IIS 7.5 的應用程式集區與新增的「虛擬帳戶」特性

從 Windows 7 與 Windows Server 2008 R2 開始，新增了兩種特殊的帳戶類型，分別是「受管理的服務帳戶(Managed service accounts)」與「虛擬帳戶(virtual accounts)」，可有效隔離各種網路服務以提升安全性，我今天會集中在講解 IIS 7.5 與虛擬帳戶之間的實際運用與範例。

要學會設定 IIS 一定要熟悉應用程式集區(Application Pool)與身份識別(Identity)的關係，我們都知道 IIS6 與 IIS7 預設的應用程式集區身份識別都是 NETWORK SERVICE 這個系統帳戶，不過 NETWORK SERVICE 這個帳戶可不是只有 IIS 在用而已，還有許多其他系統中與網路有關的服務程序也是用 NETWORK SERVICE 這個身份在運作，例如：SQLEXPRESS 服務。

![SQL Server (SQLEXPRESS) Properties](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ea29ceb78f1e064a2ee3-image.png "SQL Server (SQLEXPRESS) Properties")

這也代表著就算 IIS 沒有淪陷，只要有其他使用 NETWORK SERVICE 的網路服務淪陷的話，也會有可能連帶影響 IIS 的運作。這樣說你可能沒感覺，我反過來說，如果 IIS 被植入木馬程式，駭客可以大搖大擺的利用 NETWORK SERVICE 下載你的 SQLEXPRESS 資料庫備份檔、刪除備份檔、刪除或下載你暫時卸離的資料庫、甚至於偷天換日將另一組資料庫上傳上去，讓你完全不知發生何事。

礙於時間與篇幅我沒辦法說太多，如果有機會我可以做很多現場的展示，包你大開眼界，**資訊安全**這檔事真的是博大精深，不瞭解各種細節與原理的人永遠是在霧裡看花。

有了「虛擬帳戶」的概念，各種不同的網路服務不需要再共用同一組 NETWORK SERVICE 身份識別，甚至於同一個 IIS 下個別不同的應用程式集區也可以用完全區隔開來的「虛擬帳戶」執行 Web 應用程式，除了**工作處理程序** (Worker Process) (w3wp.exe) 執行的身份可以完全切開外，對於不同站台所操作的檔案或目錄也可以將 NTFS 權限的設定做有效區隔，讓不同**工作處理程序**之間對系統或檔案安全性的影響降至最低，非常的有意義！

首先，我們先來看看 IIS 7.5 內建的 DefaultAppPool 應用程式集區的 \[進階設定\]

![IIS 7.5 :: Application Pools](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/92458388ad0fca2ddb82-image.png "IIS 7.5 :: Application Pools")

![IIS 7.5 :: Application Pools :: Advanced Settings](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/57367fe4c47f9a5dae42-image.png "IIS 7.5 :: Application Pools :: Advanced Settings")

在這裡你會看到 IIS 7.5 這次才新增的 ApplicationPoolIdentity 內建帳戶，而這就是為 IIS 7.5 特別訂製的「虛擬帳戶」。

![IIS 7.5 :: Application Pools :: Advanced Settings :: Application Pool Identity](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/52a5b9e2b49d4f415cf2-image.png "IIS 7.5 :: Application Pools :: Advanced Settings :: Application Pool Identity")

當我們的 ASP.NET 程式需要上傳或寫入檔案到 Web Server 時，就必須要設定目錄的 NTFS 權限讓**工作處理程序**能夠寫入檔案，在以往我們要設定的是 NETWORK SERVICE 帳戶，但現在要輸入的卻是一組特殊的「虛擬帳戶」，我們在檔案總管設定權限時「虛擬帳戶」是無法被**選取**的，只能手動輸入這組特殊的帳戶名稱，IIS 應用程式集區的虛擬帳戶名稱表示方式為：【IIS AppPool\\應用程式集區名稱】，例如內建的應用程式名稱就稱為: 【IIS AppPool\\DefaultAppPool】，如果你新增了一個應用程式集區名為 MyAppPool 的話，虛擬帳戶的表示法就是：【IIS AppPool\\MyAppPool】。

如下圖示，在設定 NTFS 權限選取使用者時需先手動輸入虛擬帳戶帳號

![Select Users or Groups](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/96c2a00fad726b3464a8-image.png "Select Users or Groups")

當按下 \[檢查名稱\] 或 \[Check Names\] 時，名稱若出現「底線」就代表該「虛擬帳戶」是有效的：

![Select Users or Groups](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/08a0a2e95b5e762d5040-image.png "Select Users or Groups")

最後，我們看一下 \[工作管理員\] 中呈現的**工作處理程序** (w3wp.exe) 的執行身份也是虛擬帳戶DefaultAppPool 這個身份。

![Windows Task Manager](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/09c14daef660743d612d-image.png "Windows Task Manager")

我覺得**虛擬帳戶**這個概念實在是太棒了，以後在設定多個站台時也不需要新增一堆無意義的系統帳戶或人工管理這堆系統帳戶的密碼與到期日，對於系統的可管理性也增強了，當你不需要虛擬帳戶時，也可以選擇原本的 NetworkService 或自行指定帳戶執行。

\---

**虛擬帳戶**雖然在 Windows 7 與 Windows Server 2008 R2 才出現，但 Windows Server 2008 在更新到 [Service Pack 2](http://technet.microsoft.com/en-us/windowsserver/dd262148.aspx) (SP2) 之後也會支援虛擬帳戶的設定，只是經我實測後發現 Windows Server 2008 SP2 雖然有支援虛擬帳戶，在 IIS 7 的應用程式集區 \[進階設定\] 視窗中也會看到 ApplicationPoolIdentity 的選項，但在**檔案總管**中設定 NTFS 權限時卻無法透過 \[檢查名稱\] 或 \[Check Names\] 按鈕進行名稱檢查，因此你將無法透過 GUI 介面設定授權給虛擬帳戶，只能透過 [icacls](http://technet.microsoft.com/en-us/library/cc753525\(WS.10\).aspx) 工具設定檔案或目錄權限，使用範例如下：

‧設定 UploadFiles 目錄授予 IIS AppPool\\DefaultAppPool 虛擬帳戶擁有**完全控制**(Full)權限

```
icacls C:\Inetpub\wwwroot\UploadFiles /grant "IIS AppPool\DefaultAppPool":F
```

![icacls C:\\Inetpub\\wwwroot\\UploadFiles /grant "IIS AppPool\\DefaultAppPool":F](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/2c14cbf619263125030f-image.png "icacls C:\Inetpub\wwwroot\UploadFiles /grant \"IIS AppPool\DefaultAppPool\":F")

**相關連結**

-   [Service Accounts Step-by-Step Guide](http://technet.microsoft.com/en-us/library/dd548356\(WS.10\).aspx)
-   [Application Pool Identities](https://learn.microsoft.com/en-us/iis/manage/configuring-security/application-pool-identities)
-   [IIS7 in Windows Server 2008 R2](https://web.archive.org/web/20090115202056/http://blogs.iis.net:80/mailant/archive/2009/01/11/iis7-in-windows-server-2008-r2.aspx)
-   [Service Pack 2 for Windows Server 2008 and Windows Vista](http://technet.microsoft.com/en-us/windowsserver/dd262148.aspx)
-   [IIS 7 技術文章列表](https://web.archive.org/web/20100419220705/http://www.goodman-lai.idv.tw:80/2006/09/iis-7.html)
-   [New in IIS 7 - App Pool Isolation](https://learn.microsoft.com/en-us/iis/manage/configuring-security/ensure-security-isolation-for-web-sites)
-   [What account is your AppPool running as?](https://blogs.iis.net/thomad/what-account-is-your-apppool-running-as/)
-   [Display Virtual User Accounts in permission dialog | Microsoft Connect](http://connect.microsoft.com/WindowsServerFeedback/feedback/ViewFeedback.aspx?FeedbackID=466502)
