五步保護(hù)企業(yè)Windows環(huán)境下的Web服務(wù)
大中型企業(yè)有相當(dāng)大部分都在使用Windows Server以及.Net架構(gòu)來(lái)構(gòu)建企業(yè)Web服務(wù)和應(yīng)用,因此Web服務(wù)和Web應(yīng)用程序通常被ASP.NET和IIS主管。保護(hù)Web服務(wù)和Web應(yīng)用程序是一個(gè)配置環(huán)境的問(wèn)題而不是編程問(wèn)題。例如,使用SSL/TLS通過(guò)加密來(lái)確保保密性是最好的實(shí)現(xiàn)方式。為你的應(yīng)用程序激活它,簡(jiǎn)單的方式是對(duì)IIS進(jìn)行恰當(dāng)?shù)呐渲?,然后使用前綴為https的URL進(jìn)行訪問(wèn)。
ASP.NET安全性的配置主要涉及到編輯一個(gè)分級(jí)的XML文檔集合。在這棵樹(shù)的頂部是machine.config,其中運(yùn)行在這臺(tái)機(jī)器上的用于所有ASP.NET應(yīng)用程序的全局設(shè)置被制定好。在全局配置文件的下面是web.config文件,它包含了每個(gè)單獨(dú)的ASP.NET應(yīng)用程序的設(shè)置。本文將討論如何在這些文件中配置CAS、身份認(rèn)證、假冒以及授權(quán)等方面,來(lái)保證Web服務(wù)安全運(yùn)行。
1、為ASP.NET配置CAS
盡管CAS主要作為保護(hù)系統(tǒng)客戶端免受惡意移動(dòng)代碼侵?jǐn)_的一種方式,但它與Web服務(wù)和Web應(yīng)用程序在服務(wù)器端的部署仍有一些關(guān)聯(lián)。例如,一臺(tái)服務(wù)器可能主管不止一個(gè)的個(gè)體,團(tuán)體和組織授權(quán)的ASP.NET應(yīng)用程序;在這種情況下,CAS有助于減少由一個(gè)實(shí)體擁有的應(yīng)用程序被另外一個(gè)實(shí)體擁有的應(yīng)用程序干擾的風(fēng)險(xiǎn),也有助于被服務(wù)器操作系統(tǒng)干擾的風(fēng)險(xiǎn)。
但是,你應(yīng)該注意到:在默認(rèn)情況下,CAS策略授予ASP.NET應(yīng)用程序一套完整的程序集。因?yàn)樗麄儚谋镜貦C(jī)器上運(yùn)行。很顯然,當(dāng)配置你的應(yīng)用程序時(shí),你應(yīng)該修正這一點(diǎn)。.NET框架定義了許多不同的信任級(jí)別:Full, High, Medium, Low和 Minimal,你可以用他們來(lái)確定ASP.NET應(yīng)用程序的特權(quán)授予。除了這些策略中的第一種在配置文件 web_hightrust.config, web_mediumtrust.config等中被指定,其他所有策略位于.NET框架根目錄下的配置子目錄。為了給一個(gè)特殊的ASP.NET應(yīng)用程序授權(quán)一個(gè)medium信任等級(jí),你必須給它的web.config文件如下的結(jié)構(gòu):
<configuration>
<system.web>
<trust level="Medium"/>
</system.web>
</configuration>
2、以最小特權(quán)運(yùn)行
處理單個(gè)ASP.NET請(qǐng)求的“工作進(jìn)程”運(yùn)行在賬戶為ASPNET的Windows環(huán)境中。這個(gè)特殊的賬戶有一個(gè)受限的Windows 特權(quán)集,為了控制這種損害,應(yīng)該讓給ASP.NET應(yīng)用程序。但是,對(duì)于工作進(jìn)程來(lái)說(shuō),在與IIS相同的賬戶——SYSTEM賬戶下執(zhí)行是可能的。如果你想要這種情況發(fā)生,你編寫(xiě)的machine.config文件應(yīng)該像這樣:
<configuration>
<processModel userName="System" password="AutoGenerate"/>
</configuration>
為了讓這樣的更改生效,必須重啟IIS管理服務(wù)和WWW發(fā)布服務(wù)。
這樣做的一個(gè)原因可能是:為了獲得Windows用戶用于假冒目的的訪問(wèn)令牌,允許你的ASP.NET代碼從Win32 API中調(diào)用LogonUser。但是,這違反了最低權(quán)限(least privilege)的基本安全原則,以及顯著增加了成功攻擊所引起的損害。因此在那樣做之前你應(yīng)該仔細(xì)斟酌。
3、身份認(rèn)證
ASP.NET提供了四中典型的身份認(rèn)證:None,Windows,Forms以及Passport。每一種認(rèn)證都是在應(yīng)用程序的根文件web.config中配置的。例如,為了完全禁用ASP.NET身份認(rèn)證——適合于不需要用戶登錄的公共網(wǎng)站,那么你需要這樣的一個(gè)配置文件:
<configuration>
<system.web>
<authentication mode="None"/>
</system.web>
</configuration>
你應(yīng)該牢記IIS身份認(rèn)證和ASP.NET身份認(rèn)證之間的相互作用。兩者都將需要被正確地配置,以達(dá)到預(yù)期的效果。通常情況下,你會(huì)在IIS和ASP.NET兩者之中中使用Windows身份認(rèn)證模式;或者在IIS中以及在ASP.NET中的None,Forms,Passport的某一種使用匿名模式。
在IIS和ASP.NET兩者中使用Windows身份認(rèn)證的優(yōu)點(diǎn)是:密碼不用通過(guò)網(wǎng)絡(luò)發(fā)送,而是客戶端應(yīng)用程序向IIS提供了當(dāng)前登錄用戶身份的相關(guān)信息,那使得這些信息轉(zhuǎn)發(fā)到你的ASP.NET應(yīng)用程序上。這種方法的缺點(diǎn)是:它依賴于客戶端和服務(wù)器端的Windows操作系統(tǒng)。Forms式的身份認(rèn)證對(duì)于基于互聯(lián)網(wǎng)的系統(tǒng)是一種更合適的方法,但是在這種情況下,使用SSL/TLS來(lái)確保用戶提供的憑證是加密的,這非常有必要。
4、假冒
不管Windows身份認(rèn)證是否已經(jīng)選擇,ASP.NET身份認(rèn)證沒(méi)有指明ASP.NET應(yīng)用程序運(yùn)行下的用戶環(huán)境。如果你想要你的應(yīng)用程序在任意賬號(hào),而不僅僅是ASPNET賬號(hào)的環(huán)境中運(yùn)行,你必須要假冒身份。
假設(shè)請(qǐng)求的用戶已經(jīng)被IIS許可為有效的Windows用戶,這是由以下web.config中的內(nèi)容完成的:
<configuration>
<system.web>
<identity impersonate="true"/>
</system.web>
</configuration>
這將導(dǎo)致ASP.NET應(yīng)用程序假冒發(fā)出請(qǐng)求的用戶。然而,如果IIS設(shè)置為匿名身份認(rèn)證,那么在IIS中,ASP.NET應(yīng)用程序假冒任意一個(gè)用戶賬號(hào),這些賬號(hào)已經(jīng)被配置為匿名訪問(wèn)。
如果你想要你的ASP.NET應(yīng)用程序假冒特定的用戶,這是很簡(jiǎn)單的:
<configuration>
<system.web>
<identity impersonate="true" userName="Foo\bar" password="baz"/>
</system.web>
</configuration>
在此很明顯的危險(xiǎn)就是:在web.config中用戶憑證以明文形式存在。避免該危險(xiǎn)是可能的,我們通過(guò)在注冊(cè)表中存儲(chǔ)加密的用戶憑證,并且從web.config的元素來(lái)引用他們。
<identity impersonate="true"
userName="registry:HKLM\Software\MyApp\AspNet,Name",
password="registry:HKLM\Software\MyApp\AspNet,Password"/>
這個(gè)實(shí)用的aspnet_setreg.exe必須被用于加密用戶憑證以及在注冊(cè)表中存儲(chǔ)加密的用戶憑證。
5、授權(quán)
當(dāng)你在ASP.NET中應(yīng)用Windows授權(quán)時(shí),為了訪問(wèn)一個(gè)給定的資源,被授權(quán)的用戶必須有必要的NTFS權(quán)限。這被稱為文件授權(quán)(file authorization)。ASP.NET支持其他的更具靈活性的授權(quán)類型,這被稱為URL授權(quán)(URL authorization)。不像文件授權(quán),這是通過(guò)應(yīng)用程序的web.config文件來(lái)配置的。它主要是基于通過(guò)對(duì)ASP.NET身份認(rèn)證來(lái)對(duì)應(yīng)用程序進(jìn)行分配;而不是基于一個(gè)經(jīng)過(guò)許可的Windows賬戶的權(quán)限上。一個(gè)簡(jiǎn)單URL授權(quán)配置的例子如下:
<configuration>
<authorization>
<allow verbs="GET" users="Fred,Joe"/>
<deny verbs="POST" users="Fred,Joe"/>
<allow roles="Developers"/>
<deny users="*"/>
</authorization>
</configuration>
這個(gè)例子允許用戶Fred和Joe將HTTP GET請(qǐng)求提交到應(yīng)用程序,以求得由web.config文件管理的網(wǎng)站中的任意資源。但是若通過(guò)HTTP POST請(qǐng)求,就會(huì)拒絕他們?cè)L問(wèn)這些資源。擔(dān)任開(kāi)發(fā)者角色的任意人(除了Fred或 Joe)是允許無(wú)限制的訪問(wèn)該網(wǎng)站的,但是其他所有用戶被拒絕訪問(wèn)任何資源。這些元素的順序非常重要,因?yàn)榈谝粋€(gè)匹配將是ASP.NET會(huì)使用到的。最后明確通常需要鎖定網(wǎng)站,因?yàn)槟J(rèn)情況下,machine.config文件包括了這樣的配置:
<authorization>
<allow users="*"/>
</authorization>