| 1. 前言
隨著.NET技術(shù)日新月異的發(fā)展和Windows2003的推出,越來越多的人開始熟悉和使用.NET開發(fā)的產(chǎn)品。我們的程序員在開發(fā).NET的程序的過程中往往忽略了安全的重要性,認為只要能運行就是好產(chǎn)品,或者盲目的把安全推給.NET環(huán)境來解決。這是完全錯誤的。.NET環(huán)境提供了一整套安全防護措施,我們必須合理的運用這些安全措施并貫穿于開發(fā)和部署的每一個環(huán)節(jié),才能達到所預(yù)期的安全效果。
本文中我們所提到的安全主要是針對于利用.NET技術(shù)開發(fā)的、基于三層架構(gòu)的應(yīng)用程序(3-tier application)。先簡單介紹一下利用三層架構(gòu)開發(fā)的應(yīng)用程序。
本文適合于熟悉.NET開發(fā),熟悉SQL Server 2000,并裝配Windows 2003的讀者。 2. 三層架構(gòu)應(yīng)用
三層架構(gòu)的全稱是“Three-Tier Application Using an XML Web Service”詳情請見MSDN。究竟三層是指哪三層?第一層:客戶端應(yīng)用層(包括瀏覽器頁面)。第二層:Web Service層。第三層:數(shù)據(jù)庫層。詳見圖一。 (圖1) ???這樣做的好處是: ???1.開發(fā)者可以快速簡單的開發(fā)程序。 ???2.使用者可以在任何可以連接到Internet的地方適用應(yīng)用程序。 ???3.數(shù)據(jù)訪問層集中在Web Service上便于更新維護,不用升級客戶端。 ???4.數(shù)據(jù)訪問與前臺實現(xiàn)隔開。 3. 本文演示程序簡述 由于本文講述的是如何安全的部署.NET三層應(yīng)用,而不是如何開發(fā)。所以這個演示程序就不做詳細介紹了。這是從數(shù)據(jù)庫中列出所有顧客并能查詢每個顧客訂單的小演示程序。 文件目錄: 根目錄 \demo 子目錄 \demo\demo_Client Application 客戶端應(yīng)用 ??????????????\demo\demo_Database 數(shù)據(jù)庫 ??????????????\demo_WebService Web 服務(wù) 注:由于強調(diào)安全性,所以與數(shù)據(jù)庫的交互全部由存儲過程實現(xiàn)。點擊此處下載演示程序。 客戶端如下圖二: (圖2) 4. 配置你的系統(tǒng) 4.1. 總述 安全的體系結(jié)構(gòu),訪問權(quán)限要責(zé)任明確,盡量使用專用身份進行訪問,而且應(yīng)該將權(quán)限設(shè)置為“恰好夠用”的最小授權(quán)。主要從四個方面考慮。 ???(1).客戶端匿名用戶以IUSR_MACHINENAME的身份訪問IIS。 ???(2).IIS以Application Pool設(shè)定的身份(默認情況下,NT AUTHORITY\Network Service)的身份執(zhí)行Web Service。 ???(3).如果沒有發(fā)生新的角色扮演,或者在web.config中進行配置,則Web Service以執(zhí)行它的身份訪問SQL Server。 ???(4).SQL Server以某個特定的受限用戶身份(在我們的例子中,_SQLSERVER_)訪問資源。
4.2. 為SQL Server 2000單獨建一個用戶 4.2.1. 原因 在Windows中系統(tǒng)為IIS建了兩個帳戶,IUSR_MACHINENAME(Internet 來賓帳戶)、IWAM_MACHINENAME(啟動IIS進程帳戶)。這樣做的好處是,由于這兩個帳戶的權(quán)限很低(通常只能訪問IIS)所以即使IIS被入侵,可以把損失降到最低。
在SQL Server中卻沒有類似的專用帳戶,在安裝SQL Server的時候通常設(shè)定SQL Server的訪問資源的帳戶是以本地系統(tǒng)(NT AUTHORITY\LOCAL SYSTEM)身份,這一身份擁有比Administrator更多的特權(quán)。這樣給SQL Server的權(quán)限實在太高了,一旦被攻陷,后果不堪設(shè)想。
我們可以手動為SQL Server建立一個用戶并給它最低的權(quán)限(指給它訪問數(shù)據(jù)庫文件的權(quán)限)。現(xiàn)在我將從頭開始建立。 4.2.2. 新建用戶 新建用戶如圖三所示: (圖3) ???注: ???1. 這是標(biāo)準(zhǔn)的Windows 2003 的新建用戶對話框 ???2. 用戶名可以隨便起,這里用_SQLSERVER_,全稱是SQL Server Jail User意思是這個專用用戶被關(guān)進了“監(jiān)獄”。 ???3. 密碼應(yīng)該盡量長(64字節(jié)以上),盡量復(fù)雜(包含大小寫、數(shù)字、特殊符號等,最好是隨機生成)。Don’t panic這個密碼一共只用一次,所以最好先記在文檔里。 ???4. 同時選擇用戶不能更改密碼和密碼永不過期兩項。 4.2.3. 給這個用戶配權(quán)限 修改權(quán)限如圖四:
(圖4) ???注: ???1.右鍵點擊_SQLSERVER_用戶,選擇屬性。 ???2.進入“隸屬于”頁,將Users組刪除。這樣_SQLSERVER_就不屬于任何組了,這個用戶沒有任何權(quán)限。注意:對于Windows 2000來說,由于所有驅(qū)動器上默認的Everyone完全控制授權(quán),需要進行一些額外的配置。 4.3. 建議重裝你的SQL Server 4.3.1. 原因 重新建立安全的SQL Server。確保SQL Server以SQL Server Jail User 身份訪問計算機資源。確保SQL Server只信任命名管道等。所以建議重裝SQL Server。 4.3.2. 修改SQL Server服務(wù)帳戶 在安裝SQL Server的過程中有一步是指定SQL Server 服務(wù)是以什么身份運行。如圖五: (圖5) ???注: ???1.這里把我們剛才添加的SQL Server Jail User 添加為Services Accounts。 ???2.在Username中填入“_SQLSERVER_”;在Password中將密碼復(fù)制過來。 ???3.徹底刪除記錄密碼的文件,這個密碼只用一次。這個用戶就像被關(guān)進了SQLSERVER監(jiān)獄中了,除了SQL Server沒有程序可以使用它。 ???4.點擊Next 4.3.3. 指定SQL Server登錄驗證模式和網(wǎng)絡(luò)連接方式 如圖六、圖七所示: (圖6) ???注: ???1.我們不信任SA的登錄模式,只信任windows身份驗證模式 ???2.SA身份有很多缺點:(1).SA身份沒有過期時效。(2).SA身份沒有用戶鎖定,這樣SA口令最終總能被窮舉出來。(3).SA身份的權(quán)限太高,一但SA密碼被獲取,則可以以SQL Server的身份運行任何程序。 (圖7) ???注: ???1.不信任除命名管道以外的任何網(wǎng)絡(luò)連接 ???2.將默認選中的TCP/IP Sockets取消(如果需要在分布式環(huán)境中運行,則應(yīng)配置Active Directory域)。 ???3.原則是除非必須需要其他的連接,否則請不要選 4.3.4. 安裝SQL Server SP3 在安裝SP3的時候有一步會提示你必須指定SA密碼,因為在安裝SQL Server的時候不允許以SA身份登錄,所以SA密碼為空。SP3認為SA密碼為空是不安全的(即使SA不能用作登錄)。我們要做的就是輸入一串盡可能長且復(fù)雜的密碼。 5. 開始部署demo程序(將權(quán)限配的最小)
5.1. 部署之前
5.1.1. 將demo目錄復(fù)制到“C:\sample\”目錄下
5.1.2. 先配最小權(quán)限 修改sample目錄的安全,使sample目錄及所有子目錄和文件只能被administrators組的成員完全控制。其他默認訪問控制刪除。如圖八。 (圖8) ???注: ???1.右鍵單擊sample文件夾,點“屬性”;選擇“安全”頁。默認有四種身份可以訪問該文件夾。再點擊“高級”如圖八。 ???2.將“允許父項的繼承權(quán)…… ……”復(fù)選框的勾取消。這樣會彈出一個對話框,點擊“刪除”按鈕。 ???3.這樣就將所有從父目錄繼承的權(quán)限刪除了。只剩Administrators組有訪問權(quán)限。
如圖九: (圖9) 5.1.3. 附加數(shù)據(jù)庫(attach database) 在SQL Server企業(yè)管理器中附加數(shù)據(jù)庫,在選擇數(shù)據(jù)庫的時候會發(fā)現(xiàn),File Browser無法遍歷進Sample文件夾。這是由于SQL Server 是以_SQLSERVER_身份運行的,而_SQLSERVER_身份無法訪問Sample文件夾和數(shù)據(jù)庫文件,接下來要給_SQLSERVER_遍歷文件夾的權(quán)限和完全控制數(shù)據(jù)庫文件的權(quán)限。
同樣,在sample“屬性”的“安全”中,點擊“高級”,彈出“Sample的高級安全設(shè)置”的對話框,點擊“添加”,輸入“_SQLSERVER_”點擊“確定”按鈕 ,在權(quán)限項目表中選擇“_SQLSERVER_”,點擊“編輯”按鈕,彈出“權(quán)限項目”設(shè)置對話框。在“應(yīng)用到”下拉框中選擇“只有該文件夾”;在“列出文件夾/讀取數(shù)據(jù)”復(fù)選框后選擇“允許”。按“確定”退出。如圖十。
按照此方法依次將sample,demo,demo_Database文件夾配權(quán)限。
最后給數(shù)據(jù)庫文件“demo_DB_Data.MDF”和“demo_DB_Log.LDF”配權(quán)限,在這里由于SQL Server需要對這兩個文件進行各種操作,所有應(yīng)給_SQLSERVER_身份配完全訪問權(quán)。與上述分配權(quán)限方法雷同,在最后一步選擇“完全控制”。如圖十一。
回到SQL Server 企業(yè)管理器中就可以附加數(shù)據(jù)庫了。將Special Database Owner設(shè)為_SQLSERVER_。如圖十二。
(圖10) (圖11) (圖12) 5.2. 部署Web Service 5.2.1. 為Web Service新建一個應(yīng)用程序池(application pool) 我推薦至少為每一個Web Service建立一個應(yīng)用程序池。在IIS 6.0中建立一個應(yīng)用程序池非常簡單。啟動IIS6.0,右鍵單擊“應(yīng)用程序池”,選擇“新建”“應(yīng)用程序池”,則彈出添加應(yīng)用程序池對話框,輸入應(yīng)用程序池名稱。如圖十三。 (圖13) 給AppPool-Demo應(yīng)用程序池配權(quán)限,右鍵單擊“AppPool-Demo”選“屬性”彈出屬性對話框。在這里可以設(shè)置一些應(yīng)用屬性。我們關(guān)心的是“標(biāo)識”頁,確保應(yīng)用程序池安全帳戶的預(yù)定義帳戶是“網(wǎng)絡(luò)服務(wù)”(即Network Service帳戶)。如圖十四。 (圖14) 5.2.2. 給Web Service添加虛擬目錄 虛擬目錄名為demo,對應(yīng)的路徑是“C:\sample\demo\demo_Webservice”。新建虛擬目錄就不再詳述了。
現(xiàn)在給虛擬目錄配權(quán)限,由于IIS以Application Pool 設(shè)定的身份(Network Service)的身份執(zhí)行Web Service。所以應(yīng)該給Network Service訪問和運行虛擬目錄的權(quán)限。
在IIS中右鍵單擊demo虛擬目錄,選擇“權(quán)限”,則彈出該目錄的安全設(shè)置對話框。添加“Network Service”帳戶。并選擇“讀取和運行”的權(quán)限。如圖十五。
給Web Service一個應(yīng)用程序池,右鍵單擊demo虛擬目錄,選擇“屬性”。在“應(yīng)用程序池”下拉框選擇剛才建立的應(yīng)用程序池(AppPool-Demo)。
現(xiàn)在試試Web Service是否可以正常工作了。在IIS中單擊“demo”虛擬目錄,在右邊的文件列表中,右鍵單擊“demo.asmx”選擇“瀏覽”。檢查Web Service是否正常。如圖十六表示W(wǎng)eb Service正常。若不正常請檢查上述的每一步。
(圖15) (圖16) 5.3. 配置數(shù)據(jù)庫 5.3.1. 添加訪問數(shù)據(jù)庫用戶 打開SQL Server企業(yè)管理器,展開Demo_DB樹,右鍵點擊“User”。選擇“New Database User”,則彈出新建用戶對話框,在“Login Name”下拉框中選擇“New”,則又彈出一個對話框,手動向“Name”下拉框中填入“NT Authority\Network Service”。(說明:在SQL Server中必須手動填寫全稱,不能搜索此用戶。對此,我也表示不解)。選擇數(shù)據(jù)庫為“demo_DB”。點擊“確定”按鈕。如圖十七
則退到第一個對話框中,在“Login Name”下拉框中選擇“NT Authority\Network Service”并給與“Public”權(quán)限。點擊“確定”按鈕。 (圖17) 5.3.2. 為這個用戶配權(quán)限 在SQL Server 企業(yè)管理器中展開“demo”數(shù)據(jù)庫目錄,點擊“Users”,在右邊的用戶列表中右鍵單擊“NT Authority\Network Service”,選擇“屬性”彈出對話框,點擊“Permissions”按鈕,則彈出權(quán)限對話框,將程序的兩個用戶定義的存儲過程的“EXEC”權(quán)限點成“允許”。如圖十八。
說明:一個安全的應(yīng)用程序,所有對數(shù)據(jù)庫表和視圖的訪問都應(yīng)該由存儲過程來處理。所以我們在設(shè)置權(quán)限的時候應(yīng)該只給訪問存儲過程的權(quán)限,不給訪問表和視圖的權(quán)限。在數(shù)據(jù)庫中認為只要不畫勾,就認為沒有權(quán)限訪問,所以,只給兩個存儲過程畫勾。 (圖18) 6. 運行客戶端程序 6.1. 運行
這個時候會發(fā)現(xiàn)程序無法運行,彈出一個error對話框,如圖十九。 (圖19) 這是由于客戶端程序是以IUSR_MACHINENAME的身份訪問的網(wǎng)絡(luò)資源,在Web Server以Application Pool所指定的身份運行前,IIS是以IUSR_MACHINENAME的身份讀取服務(wù)器資源的,直到IIS發(fā)現(xiàn)所請求的資源是Web Server程序,便以Application Pool所指定的身份執(zhí)行Web Server。所以我們要向Web Server加入IUSR_MACHINENAME的可讀取權(quán)限。如圖二十。 (圖20) ???注: ???1.在IIS中右鍵單擊demo虛擬目錄,選擇“權(quán)限”,則彈出該目錄的安全設(shè)置對話框。添加“IUSR_MACHINENAME”(每臺計算機的名稱會有所不同,一般是IUSR_加上主機名)帳戶。并選擇“讀取”的權(quán)限 ???2.運行客戶端。看看是不是可以運行了,若有錯誤,請詳細檢查上述的每一步。 |