開發人員和管理員通常不斷地考慮程式安全問題的策略──添加安全措施不再是一個可以完全接收的方法。程式的安全問題必須從設計的開始就得考慮,並貫穿開發的整個過程。以後如果要開發一個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下載頁,查看當前最新的程式補丁。 結論 程式安全機制是每一個開發人員都必須面臨的問題。不要等到資料庫開發過程中和使用中才考慮到安全問題──安全是設計過程中的重要組成部分。除此之外,不要隨意地應用安全設定而希望達到最佳的效果,應該學會選擇安全模式並正確地應用。 |