|
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.運行用戶端。看看是不是可以運行了,若有錯誤,請詳細檢查上述的每一步。
|