SQL Server提供了三級安全體系結構,每一級安全結構都是建立在上一層安全驗證的基礎之上的。首先必須擁有登錄賬戶,才可以正常連接SQL Server實例。僅僅依靠一個登錄賬戶,是無法隨心所欲的訪問所有數據庫的,在目標數據庫上必須存在和該登錄賬戶相關的用戶名,即登錄名和數據庫用戶名必須存在映射關系。使用該用戶身份,并非可以隨意訪問目標數據庫中的任意對象,該用戶必須擁有相關的權限才可以對數據庫中的安全對象執行對應操作。這三層安全結構,只要經過精心的配置,可以有力的保護SQL Server的安全。對于訪問者來說,要想連接服務器,必須擁有對應的賬戶名和密碼。通過對登錄名進行控制,就可以確定哪些用戶可以訪問SQL Server,哪些用戶不允許訪問SQL Server。每個SQL Server 實例都擁有獨立的登錄配置信息。在某個SQL Server實例中打開“安全性”、“登錄名”項,在其中顯示所有的登錄名信息。在“登錄名”項的右鍵菜單上點擊“新建登錄名”項,在打開窗口(如圖4)中看到其支持多種登錄方式,包括Windows身份驗證,SQL Server身份驗證,映射到證書,映射到非對稱密鑰等。一般來說使用的是前兩者。選擇“Windows身份驗證”項,點擊“搜索”按鈕,選擇本地賬戶或者域賬戶。之后只要使用該賬戶等系統,就可以順利訪問SQL Server實例。選擇“SQL Server身份驗證”項,需要設置登錄名、登錄密碼。之后在當前SQL Server實例名的屬性窗口左側選擇“安全性”項。在右側選擇“SQL Server和Windows身份驗證模式”項,并且需要重啟SQL Server服務。

圖4 創建SQL Server登錄名
之后在登錄時選擇“SQL Server身份驗證”項,輸入賬戶名和密碼就可以訪問SQL Server實例。當然,登錄名只負責讓用戶登錄到具體的SQL Server實例,至于是否允許訪問哪些數據庫,則由不同數據庫的用戶名來決定。在某個數據庫中選擇“安全性”、“用戶”項,選擇某個登錄名,在其屬性窗口中可以看到其登錄名和用戶名是一對一對應的,這樣的話管理起來就比較方便。賦予登錄名訪問數據庫權限的方法有多種,包括將其加入相應服務器角色,將其映射到相應數據庫角色,創建自定義權限等。
在SQL Server中存在多種角色,包括SysAdmin(可以執行任何操作),ServerAdmin(設置服務器范圍內的配置選項或者關閉服務器),SetupAdmin(管理連接數據庫和啟動過程),SecurityAdmin(創建用戶管理的登錄名,讀取錯誤日志,分配權限等),ProcessAdmin(管理SQL Server中運行的進程),DBCreator(創建,更改,刪除和還原數據庫),DiskAdmin(管理磁盤文件,包括文件組,附加和分離數據 庫 等),BulkAdmin(授權用戶執行Bulk Insert操作)等。所謂角色,類似于Windows中的用戶組,不同的角色擁有不同的權限。在眾多的角色中,Public角色權限擁有最低最基本的權限。
在SQL Server實例中選擇“安全性”、“登錄名”項,選擇某個登錄名,在其屬性窗口(如圖5)左側選擇“服務器角色”項,在右側 默 認選中“public”角色。當然,也可以選擇所需的角色(例如serveradmin),使其擁有該角色對應的權限。例如,執行“EXEC sp_srvrolepermission ‘具體的角色名’”語句,就可以查看該角色擁有的權限信息。例如執行“EXEC sp_srvrolepermission‘DBCreator’”語句,可以查看“DBCreator”角色擁有的權限(即可以執行哪些數據庫操作命令)。當然,如果將某個登錄名加入到某個角色,就意味著其對該SQL Server實例中的所有的數據庫都擁有了相應的權限。此外,在選定的SQL Server實例的屬性窗口左側選擇“高級”項,在右側顯示某個登錄名或者角色,在底部的權限顯示實例級別的各種權限,可以根據需要酌情進行分配。這些權限都比較大,可以對SQL Server實例進行各種控制。

圖5 為用戶分配角色
出于安全性考慮,在分配權限時,應該限制其管理的數據庫范圍,例如只允許其管理某個數據庫等。這就需要將其映射到某個數據庫角色中,常用的角色包括db_owner(可以執行數據庫的所有配置和維護活動,可以刪除數據庫),db_securityadmin(可以修改角色成員身份和管理權限),db_accessadmin(可以為Windows登錄名,Windows組 和 SQL Server登錄名添加或刪除訪問權限),db_backupoperator(可以備份數據庫),db_ddladmin(可以執行任何數據定義語言命令),db_datawriter(可以在所有用戶表中添加,刪除或更改數 據),db_datareader(可以從所有用戶表中讀取所有數 據),db_denydatawriter(不能添加,刪除或修改數據庫內用戶表中的任何數據),db_denydatareder(不能讀取數據庫中用戶表的任何數據)等。
例 如, 執 行“EXEC s p_d bfixe droleper mission"db_security admin"”語句,可以查看指定數據庫角色擁有的權限。例如,在某個數據庫中依次打開“安全性”、“角色”、“數據庫角色”項,在其中可以看到相關的角色項目。在對應的登錄名屬性窗口左側選擇“用戶映射”項,在“映射到此登錄名的用戶”列表中選擇目標數據庫,在“數據庫角色成員身份”列表中選擇需要映射的數據庫角色,就使其擁有了對目標數據庫的相關訪問權限。例如選擇“db_owner”角色,就使其擁有了對數據庫的完全控制權限。如圖6所示。

圖6 查看數據庫角色
當然,固定的數據庫角色有時無法滿足實際的需求,例如Auser賬戶只具有“public”角色功能,只允許其訪問數據庫中XXX的表,可以在該表的屬性窗口左側選擇“權限”項,點擊“搜索”按鈕,將Auser登錄名添加進來。在權限列表中列出所有可用的權限,例如插入、查看定義、更新、更改、控制、接管所有權、刪除、選擇和引用等。例如在“授予”列只選擇“選擇”項,這樣就賦予了該用戶查詢指定數據表的權限。如果點擊“列權限”按鈕,在彈出窗口中顯示該表中的所有字段,在“授予拒絕”列中選擇相關的字段,而不選擇禁止訪問的字段。這樣,該用戶就無法訪問遭到禁用的字段的內容。