開發人員和管理人員通常不斷地考慮程序安全問題的策略──添加安全措施不再是一個可以完全接收的方法。程序的安全問題必須從設計的開始就得考慮,並貫穿開發的整個過程。以後如果要開發一個SQL Server的數據庫,你一定要從開始就遵循這些安全設計規則。
最基本的要點
如果你不能理解SQL Server security基本的概念,就馬上先停止開發並先閱讀這些開發准則,你不可能在不知道這些概念的基礎上就能夠正確地使一個數據庫安全化。程序的安全正如一輛卡車一樣。你具有一個發動機,一把鑰匙,當鑰匙打開發動機即發動機啟動之後,就有可能發生的全部過程。如果你忽略了某些細節,駕駛過程中就會發生很多麻煩。在問題產生之後,你可以將卡車交給一個修理工,然而對於程序的安全問題,你自己將是數據庫的修理工。
開始,你必須選擇以下兩種安全模式:
l Windows 認證模式:用戶通過一個現成的Windows用戶帳號來連接服務器。當一個用戶試圖與一個服務器連接的時候,SQL Server將會認證用戶的Windows帳號的名稱和密碼。用戶不能同時進入網絡和SQL Server,只能進入其中的一個。這一方法也被稱為一個被依賴的連接。
l 混合模式:這一模式將Windows認證模式和SQL Server認證聯接在一起。用戶可以通過一個Windows用戶帳號進行連接,這正如Windows認證一樣。但是,你也可以在SQL Server中直接建立用戶帳號。每一個SQL Server帳號都存儲了一個用戶名和密碼。
我們建議在可能的情況下都使用Windows認證模式。然而,混合模式很可以使用,特別是在SQL Server 7.0(或更早版本)都可以使用。.對於早期的SQL Server版本,SQL Server認證存在一些缺點。Windows認證已經集成了操作系統的安全系統,這就提供了比SQL Server認證更多的安全特性,很容易的使用,效率更加高,安全性更加好。在設計開始的時候,你應該認真考慮選擇哪一種模式最為合適。
密碼
無論采用哪一些模式,你應該記住在SQL Server中為系統管理者(sa)設置一個密碼。當安裝SQL Server時,安裝程序會自動建立一個帶有SQL Server注冊名稱(sa)和一個空白密碼的管理用戶。如果你保持這些用戶設置原樣而使用混合安全模式,任何具備一點SQL Server基礎知識的用戶都可以很容易地進入到你的數據庫中並做任何他想要做的事情。如果你使用的是Windows認證模式,在理論上你無需為sa用戶設置一個密碼,因為SQL Server注冊不會接受這些的設置。但是設置是一個很良好的操作,尤其是當你被迫轉移到將來使用的混合模式的時候。
如果安全模式已經啟動,注冊將成為關鍵。你必須使用正確的方法來啟動程序,注冊也是同樣的,如果你不能正確地輸入用戶名和密碼,程序將不能連接到網絡,同時也不能連接到SQL Server。
作為一個管理者,一旦你已經啟動了程序,你就做好安全管理的准備。可以通過定義以下的特性而實現:
l 用戶(帳號):一個SQL Serve安全帳號代表著一個唯一的用戶。一個用戶也只有一個Windows帳號或者一個SQL Server注冊,這與數據庫中的用戶帳號相統一。
l 組(帳號):每一個用戶都屬於一個或多個組,這由認證模式決定。每一個組都具有特定許可。作為一個組的成員,你將獲得所有組的許可。
l 對象所有權:所有權屬於建立對象的用戶。所有者可以將訪問權限分配給用戶。如果你是一個視的所有者,你還可以決定哪些用戶可以通過視來查看數據。
l 許可:一個許可代表著具有執行某些操作的權利,比如打開一個視或者更改一個存儲程序。SQL Server承認許可的三種狀態:GRANT給你一個用戶訪問;REVOKE刪除訪問;DENY防止用戶訪問對象。
l 任務:這是一個SQL Server安全帳號,可以將帳號的集合作為一個簡單的單元來處理。任務定義在特定數據庫中用戶可以做哪些和哪些不可以做。
從安全的角度而考慮
設計過程應該用效地定義哪些地方需要進行安全設置和如何設置。在這一過程之前你應該從兩個方面考慮:
l 敏感數據;
l 可以查看敏感數據的人。
敏感數據包括所有可能的數據,包括整個數據庫中的所有數據,雖然這樣的安全級別很少存在。你的工作就是定義為敏感數據並進行保護。
你選擇的認證模式和建立的注冊將通過限制哪些用戶可以進入到數據庫而實施第一步安全步驟。
第二步就要列舉可以訪問數據庫的所有用戶,然後決定所有數據是否對所有的用戶都適用。通常,你需要對一些數據進行保護,比如工資或者其他私人數據。這就意味著只有特定的用戶可以訪問和查看數據。你還可以設置哪些用戶更改數據。
始終記住的一條規則是“最小權利”概念。如果有人在他的工作中不需要訪問數據,那即不要給他訪問的權限。應該避免所有的用戶都具有sa用戶的訪問權限。
具體的建議
當進行安全設置的時候,經驗也是一個很好的老師,但通常也會有適用於通用數據庫的設計准則:
l 從開始就獲得數據庫和對象的所有權。當建立一個新的數據庫時,你將會成為數據庫的所有者,並能夠設置數據庫中所有發生一切。你可以以管理者的身份注冊數據庫。然而,對象的所有權屬於建立對象的用戶。雖然這可能造成所有權的轉移,但可以確定這些的注冊能夠被用於建立所有的對象。
l 理解所有權鏈。這一安全特性防止用戶建立自己的視而偷看一些敏感數據。例如,假設你建立一個從兩個表中集中的數據的視,如果你是這兩個表的所有者,當你允許其他用戶使用視的許可時,SQL Server不會檢查表的有關許可。
l 使用視和存儲程序以分配給用戶訪問數據的權利,而不是讓用戶編寫一些直接訪問表格的特別查詢語句。通過這種方式,你無需在表格中將訪問權利分配給用戶。視和存儲程序也可以限制查看的數據。例如,如果你的雇員表格包含一些秘密的工資信息,你可以建立一個省略了工資欄的視。
l 如果用戶從特定程序中進入你的程序,你可以建立程序任務。一個程序任務就是分配到特定程序的用戶,並給予用戶的有關許可。使用程序任務,用戶不能直接地認證數據庫,相反,他們先認證他們自己的程序,這就決定哪些程序任務與服務器相連接。
l 時刻注意程序補丁。不可否認的,程序補丁是一些訣竅的集合。程序的發布,更新等都會引入新的問題,使用程序補丁是防止外界干擾和保護數據的最好和最容易的方法。可以訪問微軟主頁上的SQL Service Pack下載頁,查看當前最新的程序補丁。
結論
程序安全機制是每一個開發人員都必須面臨的問題。不要等到數據庫開發過程中和使用中才考慮到安全問題──安全是設計過程中的重要組成部分。除此之外,不要隨意地應用安全設置而希望達到最佳的效果,應該學會選擇安全模式並正確地應用。