The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

IIS應用程式集區自訂身份識別後如何讓 ASP.NET 正常執行

我們都知道 ASP.NET 在 IIS 6.0 中運行的時候,真正的執行權限使用者是應用程式集區(Application Pool)的身份識別(Identity)頁籤中定義的那位使用者,預設的使用者是「網路服務(NETWORK SERVICE)」,而且實際在執行的程序名稱(Process Name)為 w3wp.exe,各位可以從工作管理員中看到。

我們先設定一種情境,如果一台 IIS 中有兩個 ASP.NET 網站,分別由不同的開發團隊或客戶所管理,而兩個網站都有設定檔案上傳的功能,因此兩個網站一定會有特定目錄需要賦予 ASP.NET 可寫入權限,因為在 IIS 中 ASP.NET 的預設權限使用者就等於應用程式集區中定義的身份識別使用者,也就是所謂的 NETWORK SERVICE 系統使用者。

如果當其中第一個網站被入侵或值入後門程式時,也代表著這些後門程式正以 NETWORK SERVICE 的身份在你的主機中肆虐,攻擊的���象即便僅限於「網站」,但當然也包括第二個網站的部分可寫入路徑。

若要增強網站間的安全性與隔離性,我們這時就會需要修改應用程式集區(Application Pool)的身份識別設定,讓兩個 ASP.NET 網站個別使用不同的身份識別來執行所有的程式。

---

我想應該也有人試過修改 IIS 中應用程式集區(Application Pool)的身份識別:

  1. 先在系統中新增一位新的使用者 (假設叫做 User1 )
  2. 修改 IIS 中應用程式集的身份識別設定 (如下圖)

修改 IIS 中應用程式集區(Application Pool)的身份識別設定

但很不幸的, 如果你真的這麼做的話,ASP.NET 網站就會掛給你看,並出現 Service Unavailable 的錯誤訊息。

 Service Unavailable

如果你在事件檢視器中查詢錯誤紀錄,你就會查到以下訊息:

應用程式集區,'DefaultAppPool' 的識別項無效。當處理應用程式集區的第一個要求時,如果它仍然無效,那麼應用程式集區將被停用。資料欄位含有錯誤號碼。

以及

應用程式集區 'DefaultAppPool' 的識別項無效,因此 World Wide Web Publishing 服務無法建立工作者處理序,以處理應用程式集區。所以已停用應用程式集區。

所以光是這樣設定是不行的,以下就是正確設定的標準作業流程(SOP):

  1. 新增使用者
  2. 將該使用者加入 IIS_WPG 群組
  3. 修改系統暫存目錄 ( C:\WINDOWS\Temp ) 權限,讓該使用者可讀、可寫
  4. 修改應用程式集區身份識別設定,並設定為該使用者
  5. ASP.NET 若需用非預設帳號執行,必須妥善設定相關權限 ( 請跳過上述 3, 4 兩個步驟,直接參考第5個步驟所示文章操作 )

備註一:IIS_WPG 群組是從 IIS 6.0 才加入的,最主要的目的就在於提供一個最小的執行權限,專門用來啟動工作處理程序(Worker Process)用的,所以如果你新建立的使用者不屬於 IIS_WPG 群組的話,工作者處理序就會無法啟動,這也是因為 ASP.NET 會回應 Service Unavailable 的主因。

備註二:關於系統暫存目錄 ( C:\WINDOWS\Temp ) 權限應該是不用設定到可讀、可寫這麼大,因為我查詢我的伺服器上的 C:\WINDOWS\Temp 目錄對於 NETWORK SERVICE 的預設設定,原來只要有「列出資料夾/讀取資料」與「刪除」兩種權限就可以正常運行 ASP.NET 了。

檢視/設定使用者詳細權限(進階安全性設定)的方法如下:

C:\WINDOWS\Temp 內容

C:\WINDOWS\Temp 的進階安全性設定

 C:\WINDOWS\Temp 的權限項目

備註三:預設 IIS_WPG 群組可對 Temporary ASP.NET Files 進行讀寫,所以無須修改此目錄的權限。
    預設路徑為 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files

預設 IIS_WPG 群組可對 Temporary ASP.NET Files 進行讀寫

---

今天是 2008 年的最後一天,我今年共發表了 368 篇文章,部落格一整年的瀏覽人次也突破 35 萬人次,感覺還蠻不錯的。我這一整年的收穫,除了自己的技術不斷精進外,也幫助不少人充實技術觀念、開發技巧或實務經驗,當然也認識了一堆未曾蒙面的技術同好,這些對我來說都是無價之寶。

接下來幾天難得的年假我會好好休息(不碰電腦),所以可能會有幾天沒有文章,期望沈澱之後能夠繼續堅持下去,不斷的透過部落格激勵自己成長茁壯。

在此也預祝各位 2009 新年快樂! ^_^

相關連結