IIS7對(duì)于以往是革命性的改變, 不再是以前縫縫補(bǔ)補(bǔ)的破衣裳, 全部重寫的代碼帶來了更為優(yōu)秀的性能與擴(kuò)展能力. 他不再是一個(gè)Web Server了而變成了一個(gè)Application Server能夠承載一切以通訊為基礎(chǔ)的應(yīng)用. 新的變革也帶來了新的知識(shí), 想更好的駕馭IIS7權(quán)限則是最基礎(chǔ)的一部分也是最先需要了解的一部分. 本文讓你初步了解IIS7的權(quán)限應(yīng)用的基本相關(guān)知識(shí), 了解來龍去脈不會(huì)再因應(yīng)用程序突然多出一個(gè)莫名其妙權(quán)限而感到困惑. 雖然下面的內(nèi)容均以Web服務(wù)為例, 但道理同樣適用于以IIS7宿主的其他應(yīng)用如FTP等等.
Worker Process是IIS應(yīng)用程序的宿主, 在任務(wù)管理器中可以看到每一個(gè)Worker Process就是一個(gè)w3wp.exe.
WindowsLiveWriter-429641856/supfiles195C5D69/image7.png" target="_blank">
是Worker Process運(yùn)行時(shí)的身份:
這里并沒有提供一個(gè)直接的手段來設(shè)置Worker Process在什么身份標(biāo)識(shí)下運(yùn)行, 而是通過Application Pool的身份標(biāo)識(shí)設(shè)定來實(shí)現(xiàn)的.
Application Pool包含至少一個(gè)或多個(gè)Worker Process(Web Garden模式). 在運(yùn)行時(shí)會(huì)將Application Pool的身份注入到Worker Process中, 就會(huì)以Application Pool的身份運(yùn)行. 可以認(rèn)為Application Pool與其包含的Worker Process的運(yùn)行身份是一致的.
應(yīng)用程序池標(biāo)識(shí)(Application Pool Identity)是Application Pool運(yùn)行時(shí)的身份:
上面提到的身份標(biāo)識(shí)選項(xiàng)中你可以選擇他, 但他只是一個(gè)統(tǒng)稱, 并不存在實(shí)際的這個(gè)命名. 他依賴你的Application Pool的名稱, 例如我的Application Pool名字叫做: SimonwAppPool, 那么這個(gè)虛擬標(biāo)識(shí)的全名是: IIS AppPool/SimonwAppPool 運(yùn)行在此Application Pool下的Worker Process從任務(wù)管理器中可以看到w3wp.exe是在SimonwAppPool這個(gè)用戶下運(yùn)行的. 可以在文件系統(tǒng)中對(duì)這個(gè)帳戶分配權(quán)限. 這么做的好處是能夠?qū)⒛軌驅(qū)?quán)限分離開來做粒度更細(xì)的配置, 不像是NetworkService有很多應(yīng)用基于此, 設(shè)置一個(gè)權(quán)限影響一大片.
不過有時(shí)候通過UI找不到這個(gè)對(duì)象大約是個(gè)Bug, 通過命令行icacls處理即可.
這可能是一個(gè)讓人容易迷糊的詞匯impersonate - 扮演, 裝扮. 他是指在某個(gè)特定的時(shí)刻以一個(gè)新的身份來代替已有身份來運(yùn)行應(yīng)用程序. 一個(gè)請(qǐng)求來臨時(shí)在IIS處理管道中, 在authentication之前authenticated user的上下文是未知的, 這時(shí)你的應(yīng)用程序以WPI的權(quán)限在運(yùn)行. 在authentication之后authenticated user的上下文被建立, 但依然沒有去扮演, 直至請(qǐng)求被映射到他的handler也就是handler mapping后應(yīng)用程序開始使用扮演則將默認(rèn)的WPI權(quán)限替換為authenticated user的權(quán)限來執(zhí)行應(yīng)用程序.
舉個(gè)例子, php配置fastcgi時(shí)推薦設(shè)置fcgi.impersonate=true, 體現(xiàn)在請(qǐng)求一個(gè)php文件時(shí)
false: 始終使用WPI的權(quán)限, 默認(rèn)權(quán)限是NetworkService
true: 使用authenticated user, 默認(rèn)為IUSR, 也就是說可以讓在站點(diǎn)級(jí)別上設(shè)置的權(quán)限生效.
在IIS7下需要注意2個(gè)特殊的用戶和用戶組, 在IIS6中有著類似的對(duì)應(yīng)關(guān)系
IIS6:IIS_WPG - IIS7:IIS_IUSRS
IIS6:IUSR_MachineName - IIS7:IUSR
最大的改變就是他們都成為了系統(tǒng)內(nèi)置帳戶(built-in account)有著統(tǒng)一的SID, 這樣的好處在于做不同機(jī)器/系統(tǒng)間的拷貝時(shí)可以連帶權(quán)限一同拷貝過去了, 在以往因?yàn)镾ID不同換了機(jī)器權(quán)限是無法有效拷貝的只能挨個(gè)手動(dòng)設(shè)置, 現(xiàn)在方便多了.
默認(rèn)他會(huì)擁有適當(dāng)?shù)臋?quán)限來運(yùn)行Worker Process. 所有的WPI下的運(yùn)行帳戶均被隱式的自動(dòng)加入到這個(gè)組中, 以獲得最小的運(yùn)行權(quán)限. 例如當(dāng)你將SimonwAppPool這個(gè)Application Pool的運(yùn)行身份設(shè)置為Application Pool Identity, 那么IIS AppPool/SimonwAppPool這個(gè)用戶會(huì)被自動(dòng)加入到IIS_IUSRS組中擁有他的全部權(quán)限. 因此對(duì)此組權(quán)限賦值需很小心很容易不知不覺中影響一大片.
特別需要注意的別看他是一個(gè)匿名帳戶并且沒有密碼, 但他屬于authenticated users ,而authenticated users屬于Users組, 因此IUSR默認(rèn)具備了Users組的權(quán)限.
一年總要寫一篇文章(慚愧), 年底再不寫沒機(jī)會(huì)了, 大部分的內(nèi)容都是大半年前總結(jié)的, 今天才寫出來難免錯(cuò)誤與疏漏請(qǐng)及時(shí)指正. 希望能為你的IIS7配置提供有效的參考.
新聞熱點(diǎn)
疑難解答
圖片精選