SQL Server提供了三級(jí)安全體系結(jié)構(gòu),每一級(jí)安全結(jié)構(gòu)都是建立在上一層安全驗(yàn)證的基礎(chǔ)之上的。首先必須擁有登錄賬戶,才可以正常連接SQL Server實(shí)例。僅僅依靠一個(gè)登錄賬戶,是無法隨心所欲的訪問所有數(shù)據(jù)庫(kù)的,在目標(biāo)數(shù)據(jù)庫(kù)上必須存在和該登錄賬戶相關(guān)的用戶名,即登錄名和數(shù)據(jù)庫(kù)用戶名必須存在映射關(guān)系。使用該用戶身份,并非可以隨意訪問目標(biāo)數(shù)據(jù)庫(kù)中的任意對(duì)象,該用戶必須擁有相關(guān)的權(quán)限才可以對(duì)數(shù)據(jù)庫(kù)中的安全對(duì)象執(zhí)行對(duì)應(yīng)操作。這三層安全結(jié)構(gòu),只要經(jīng)過精心的配置,可以有力的保護(hù)SQL Server的安全。對(duì)于訪問者來說,要想連接服務(wù)器,必須擁有對(duì)應(yīng)的賬戶名和密碼。通過對(duì)登錄名進(jìn)行控制,就可以確定哪些用戶可以訪問SQL Server,哪些用戶不允許訪問SQL Server。每個(gè)SQL Server 實(shí)例都擁有獨(dú)立的登錄配置信息。在某個(gè)SQL Server實(shí)例中打開“安全性”、“登錄名”項(xiàng),在其中顯示所有的登錄名信息。在“登錄名”項(xiàng)的右鍵菜單上點(diǎn)擊“新建登錄名”項(xiàng),在打開窗口(如圖4)中看到其支持多種登錄方式,包括Windows身份驗(yàn)證,SQL Server身份驗(yàn)證,映射到證書,映射到非對(duì)稱密鑰等。一般來說使用的是前兩者。選擇“Windows身份驗(yàn)證”項(xiàng),點(diǎn)擊“搜索”按鈕,選擇本地賬戶或者域賬戶。之后只要使用該賬戶等系統(tǒng),就可以順利訪問SQL Server實(shí)例。選擇“SQL Server身份驗(yàn)證”項(xiàng),需要設(shè)置登錄名、登錄密碼。之后在當(dāng)前SQL Server實(shí)例名的屬性窗口左側(cè)選擇“安全性”項(xiàng)。在右側(cè)選擇“SQL Server和Windows身份驗(yàn)證模式”項(xiàng),并且需要重啟SQL Server服務(wù)。
圖4 創(chuàng)建SQL Server登錄名
之后在登錄時(shí)選擇“SQL Server身份驗(yàn)證”項(xiàng),輸入賬戶名和密碼就可以訪問SQL Server實(shí)例。當(dāng)然,登錄名只負(fù)責(zé)讓用戶登錄到具體的SQL Server實(shí)例,至于是否允許訪問哪些數(shù)據(jù)庫(kù),則由不同數(shù)據(jù)庫(kù)的用戶名來決定。在某個(gè)數(shù)據(jù)庫(kù)中選擇“安全性”、“用戶”項(xiàng),選擇某個(gè)登錄名,在其屬性窗口中可以看到其登錄名和用戶名是一對(duì)一對(duì)應(yīng)的,這樣的話管理起來就比較方便。賦予登錄名訪問數(shù)據(jù)庫(kù)權(quán)限的方法有多種,包括將其加入相應(yīng)服務(wù)器角色,將其映射到相應(yīng)數(shù)據(jù)庫(kù)角色,創(chuàng)建自定義權(quán)限等。
在SQL Server中存在多種角色,包括SysAdmin(可以執(zhí)行任何操作),ServerAdmin(設(shè)置服務(wù)器范圍內(nèi)的配置選項(xiàng)或者關(guān)閉服務(wù)器),SetupAdmin(管理連接數(shù)據(jù)庫(kù)和啟動(dòng)過程),SecurityAdmin(創(chuàng)建用戶管理的登錄名,讀取錯(cuò)誤日志,分配權(quán)限等),ProcessAdmin(管理SQL Server中運(yùn)行的進(jìn)程),DBCreator(創(chuàng)建,更改,刪除和還原數(shù)據(jù)庫(kù)),DiskAdmin(管理磁盤文件,包括文件組,附加和分離數(shù)據(jù) 庫(kù) 等),BulkAdmin(授權(quán)用戶執(zhí)行Bulk Insert操作)等。所謂角色,類似于Windows中的用戶組,不同的角色擁有不同的權(quán)限。在眾多的角色中,Public角色權(quán)限擁有最低最基本的權(quán)限。
在SQL Server實(shí)例中選擇“安全性”、“登錄名”項(xiàng),選擇某個(gè)登錄名,在其屬性窗口(如圖5)左側(cè)選擇“服務(wù)器角色”項(xiàng),在右側(cè) 默 認(rèn)選中“public”角色。當(dāng)然,也可以選擇所需的角色(例如serveradmin),使其擁有該角色對(duì)應(yīng)的權(quán)限。例如,執(zhí)行“EXEC sp_srvrolepermission ‘具體的角色名’”語(yǔ)句,就可以查看該角色擁有的權(quán)限信息。例如執(zhí)行“EXEC sp_srvrolepermission‘DBCreator’”語(yǔ)句,可以查看“DBCreator”角色擁有的權(quán)限(即可以執(zhí)行哪些數(shù)據(jù)庫(kù)操作命令)。當(dāng)然,如果將某個(gè)登錄名加入到某個(gè)角色,就意味著其對(duì)該SQL Server實(shí)例中的所有的數(shù)據(jù)庫(kù)都擁有了相應(yīng)的權(quán)限。此外,在選定的SQL Server實(shí)例的屬性窗口左側(cè)選擇“高級(jí)”項(xiàng),在右側(cè)顯示某個(gè)登錄名或者角色,在底部的權(quán)限顯示實(shí)例級(jí)別的各種權(quán)限,可以根據(jù)需要酌情進(jìn)行分配。這些權(quán)限都比較大,可以對(duì)SQL Server實(shí)例進(jìn)行各種控制。
圖5 為用戶分配角色
出于安全性考慮,在分配權(quán)限時(shí),應(yīng)該限制其管理的數(shù)據(jù)庫(kù)范圍,例如只允許其管理某個(gè)數(shù)據(jù)庫(kù)等。這就需要將其映射到某個(gè)數(shù)據(jù)庫(kù)角色中,常用的角色包括db_owner(可以執(zhí)行數(shù)據(jù)庫(kù)的所有配置和維護(hù)活動(dòng),可以刪除數(shù)據(jù)庫(kù)),db_securityadmin(可以修改角色成員身份和管理權(quán)限),db_accessadmin(可以為Windows登錄名,Windows組 和 SQL Server登錄名添加或刪除訪問權(quán)限),db_backupoperator(可以備份數(shù)據(jù)庫(kù)),db_ddladmin(可以執(zhí)行任何數(shù)據(jù)定義語(yǔ)言命令),db_datawriter(可以在所有用戶表中添加,刪除或更改數(shù) 據(jù)),db_datareader(可以從所有用戶表中讀取所有數(shù) 據(jù)),db_denydatawriter(不能添加,刪除或修改數(shù)據(jù)庫(kù)內(nèi)用戶表中的任何數(shù)據(jù)),db_denydatareder(不能讀取數(shù)據(jù)庫(kù)中用戶表的任何數(shù)據(jù))等。
例 如, 執(zhí) 行“EXEC s p_d bfixe droleper mission"db_security admin"”語(yǔ)句,可以查看指定數(shù)據(jù)庫(kù)角色擁有的權(quán)限。例如,在某個(gè)數(shù)據(jù)庫(kù)中依次打開“安全性”、“角色”、“數(shù)據(jù)庫(kù)角色”項(xiàng),在其中可以看到相關(guān)的角色項(xiàng)目。在對(duì)應(yīng)的登錄名屬性窗口左側(cè)選擇“用戶映射”項(xiàng),在“映射到此登錄名的用戶”列表中選擇目標(biāo)數(shù)據(jù)庫(kù),在“數(shù)據(jù)庫(kù)角色成員身份”列表中選擇需要映射的數(shù)據(jù)庫(kù)角色,就使其擁有了對(duì)目標(biāo)數(shù)據(jù)庫(kù)的相關(guān)訪問權(quán)限。例如選擇“db_owner”角色,就使其擁有了對(duì)數(shù)據(jù)庫(kù)的完全控制權(quán)限。如圖6所示。
圖6 查看數(shù)據(jù)庫(kù)角色
當(dāng)然,固定的數(shù)據(jù)庫(kù)角色有時(shí)無法滿足實(shí)際的需求,例如Auser賬戶只具有“public”角色功能,只允許其訪問數(shù)據(jù)庫(kù)中XXX的表,可以在該表的屬性窗口左側(cè)選擇“權(quán)限”項(xiàng),點(diǎn)擊“搜索”按鈕,將Auser登錄名添加進(jìn)來。在權(quán)限列表中列出所有可用的權(quán)限,例如插入、查看定義、更新、更改、控制、接管所有權(quán)、刪除、選擇和引用等。例如在“授予”列只選擇“選擇”項(xiàng),這樣就賦予了該用戶查詢指定數(shù)據(jù)表的權(quán)限。如果點(diǎn)擊“列權(quán)限”按鈕,在彈出窗口中顯示該表中的所有字段,在“授予拒絕”列中選擇相關(guān)的字段,而不選擇禁止訪問的字段。這樣,該用戶就無法訪問遭到禁用的字段的內(nèi)容。