我們都知道 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)的身份識別:
- 先在系統中新增一位新的使用者 (假設叫做 User1 )
- 修改 IIS 中應用程式集的身份識別設定 (如下圖)
但很不幸的, 如果你真的這麼做的話,ASP.NET 網站就會掛給你看,並出現 Service Unavailable 的錯誤訊息。
如果你在事件檢視器中查詢錯誤紀錄,你就會查到以下訊息:
以及
所以光是這樣設定是不行的,以下就是正確設定的標準作業流程(SOP):
- 新增使用者
- 將該使用者加入 IIS_WPG 群組
- 修改系統暫存目錄 ( C:\WINDOWS\Temp ) 權限,讓該使用者可讀、可寫
- 修改應用程式集區的身份識別設定,並設定為該使用者
- 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 了。
檢視/設定使用者詳細權限(進階安全性設定)的方法如下:
備註三:預設 IIS_WPG 群組可對 Temporary ASP.NET Files 進行讀寫,所以無須修改此目錄的權限。
預設路徑為 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files
---
今天是 2008 年的最後一天,我今年共發表了 368 篇文章,部落格一整年的瀏覽人次也突破 35 萬人次,感覺還蠻不錯的。我這一整年的收穫,除了自己的技術不斷精進外,也幫助不少人充實技術觀念、開發技巧或實務經驗,當然也認識了一堆未曾蒙面的技術同好,這些對我來說都是無價之寶。
接下來幾天難得的年假我會好好休息(不碰電腦),所以可能會有幾天沒有文章,期望沈澱之後能夠繼續堅持下去,不斷的透過部落格激勵自己成長茁壯。
在此也預祝各位 2009 新年快樂! ^_^
相關連結