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