李素奇
(射陽縣中醫院,江蘇 射陽 224300)
我們在接觸SQL Server時經常會碰到三個術語分別是登錄名、用戶名、賬號,訪問SQL Server時必須要有登錄名,在master數據庫中的syslogins表里存放每個登錄名的信息。登錄名不同于用戶名,使用登錄名并不能訪問數據庫中的資源,此時必須要創建用戶名;在數據庫里創建用戶名并與其中一個登錄名關聯,用戶信息存放在數據庫的sysusers表中,且用戶沒有口令與他關聯,用戶訪問特定對象的權限是需要授予的。總之,數據庫的對象是用戶,根據授予的權限來獲得資源,登錄名則不能獲得資源,只是進門的鑰匙,而賬號則是特指用戶管理器中創建的賬戶。
在大多數情況下,我們習慣登錄名和用戶名使用一樣的名稱,系統管理員一般用sa表示,數據庫屬主一般用dbo表示,sa始終關聯著dbo用戶,只有在新的登錄名創建后才能創建新的用戶。
在登錄SQL Server時,我們需要經過三步驗證,第一步需要正確的登錄名和密碼登錄到SQL Server,但此時還不能訪問數據庫資源。第二步在特定數據庫中創建或綁定用戶,允許用戶與特定數據庫連接并訪問資源。第三步指派用戶對特定數據庫的對象的訪問權限,比如哪些表、視圖、存儲過程是用戶有權使用運行的。
我們在登錄Windows系統后,系統管理員的賬戶也有SQL Server的管理權,為保證特定的用戶能夠訪問SQL Server數據庫那應該需要怎樣設置呢,這就涉及到SQL Server的驗證模式,SQL Server支持兩種不同的安全模式,即Windows驗證模式和混合安全驗證模式。
在Windows驗證模式下,SQL Server數據庫檢測當前Windows 用戶賬戶,并在syslogins表中查找該賬戶,如有則有權限登錄,并且不需要輸入登錄名和口令進行驗證,在此過程中SQL Server是從RPC連接中來獲得Windows的用戶信息,Windows驗證優點在于,首先,SQL Server數據庫管理員只需管理數據庫,用戶賬戶由Windows 去管理,其次,Windows管理用戶賬戶的工具相比SQL Server的更強大,SQL Server如需這些功能,需要定制來進行擴展。
在混合安全驗證模式下,允許Windows驗證模式或者SQL Server的驗證模式進行登錄連接數據庫,當通信時使用TCP/IP Sockets就是使用SQL Server進行驗證登錄;當使用命名管道就是使用Windows進行驗證登錄,使用混合安全模式靈活性更好,更能適應不同的應用場景。使用SQL Server驗證時需輸入登錄名和口令,在syslogins表中進行匹配,匹配成功,正常登錄,
SQL Server的驗證模式類型的確定,取決于服務器與客戶和網絡驗證模型之間使用的網絡通信協議。一般情況下我們可以運用SQL server 工具企業管理器來進行設置、修改驗證模式。
用戶管理是一件復雜的事情,如何保證用戶在不超出設置的權限范圍內,訪問到他們所需要的數據,是每個數據庫管理員需要慎重分配的。我們知道用戶可以進行分組,也就是需要訪問相同數據且具有相同權限的用戶放入一個組里進行統一管理。此時可以把組當成角色來理解,在SQL server里有數據庫角色和服務器角色兩種,其中數據庫級的對象是數據庫角色,包含數據庫名,而服務器級的對象是服務器角色,包含登錄名(見圖1)。

圖1 登錄過程圖
SQL Server 安裝完成后,系統自動會創建以下一些固定的數據庫角色如:
Db_owner(數據庫的屬主,能執行特定數據庫的所有的任務。)
Db_accessadmin(能在數據庫中添加、刪除數據庫角色、用戶)
Db_securityadmin(能在數據庫中分配對象和語句權限)
Db_ddladmin(能在數據庫中添加、刪除和修改對象)
Db_backupoperator(能恢復或備份數據庫)
Db_datareader(能查看任意表中的數據)
Db_datawriter(能在表中添加、修改、刪除數據)
Db_denydatareader(拒絕讀取表中的數據)
Db_denydatawriter(拒絕修改表中的數據)
以上這些數據角色可在數據庫sysusers表里查看。SQL Server數據庫中的用戶都是公共角色成員,管理員可以定義數據庫用戶的角色,比如有一個醫療的角色和一個護理的角色,在醫療部中有幾位科室主管,這些科室主管用戶不能在護理部和科護士長的角色中,此時就需要我們繼續創建角色,把科室主管加到角色中并為分配一定的權限來進行工作。
SQL Server 安裝完成后,系統也自動會創建以下一些固定的服務器角色如:
Sysadmin(系統管理員組,可執行任何任務)
Securityadmin(審核、管理服務器登錄名)
Serveradmin(設置服務器及配置信息)
Setupadmin(可復制、安裝)
Processadmin(管理進程)
Diskadmin(管理磁盤文件)
Dbcreator(修改、建立數據庫)
以上這些服務器角色可在數據庫master 的syslogins表里查看。
數據庫的安全性離不開數據庫角色的控制,用戶通過數據庫角色中的用戶名確定對數據庫操作的權限。數據庫角色分為標準角色和應用程序角色。
一般來說每個數據庫的系統表里都保存角色和用戶信息,sysusers系統表中有uid,name,gid等字段在數據庫中用戶的標識是uid,組用gid來表示,在sysuser表中uid與gid相等的行就是定義的角色。其中gid與uid都等于0是public的角色,所以一般可以通過對uid來判斷sysuser表中的記錄是角色還是用戶。
數據庫里的對象和全部的數據庫都是SQL server 的對象,在一個數據庫中表、存儲過程、規則、視圖、缺省和自定義的數據類型都是其對象。它們各自都有其對應的屬主,簡而論之創建該對象的用戶就是其屬主。比如系統管理員(sa)創建數據庫后,并在其登錄后sa在該數據庫中則是數據庫屬主(dbo),再比如sa用戶創建表,則sa將對該表擁有權限。
對象名是該對象屬主的一部分,數據庫中所有的對象都歸該數據庫的屬主所擁有,比如當查詢appdata數據庫中mancode表中的內容,一般通過select命令查詢:select *from mancode。但如果用戶fck在appdata數據庫中創建了表doctor,你則需要限定該對象的名字:fck.mancode。在數據庫appdata中任何有權限的用戶都可創建同一名稱的表。所以在數據庫appdata中就有fck.mancode,lyy.mancode,cd.mancode,chy.mancode等。數據庫中的用戶訪問其中某一對象時,如該對象屬主的用戶名沒有限制,那將先訪問擁有該對象的用戶,其次數據庫屬主所擁有的對象。
權限對用戶賬戶來說是其中重要的屬性之一,可以完成特定范圍內的一些操作。SQL server一般擁有的權限,有兩種不同的類型。控制用戶與對象進行操作交互就是對象的權限,特別是在插入、修改、刪除、查詢某一表中行的數據,又或者某一存儲過程能否執行。恢復和備份數據庫、刪除和創建對象通過語句權限來實現。
權限用來完成特定的操作,是用戶賬戶的屬性,權限一般有三種類型,分別是對象權限、語句權限、暗示性權限。對象權限是控制用戶與對象進行交互、操作,主要進行查詢、插入、修改、刪除數據庫中某個表的數據或運行一個存儲過程,一般有五個權限,分別是查詢(select)、修改(update)、刪除(delete)、插入(insert)、執行(exec),在數據庫屬性內設置。語句權限適用于備份、恢復數據庫刪除、創建對象,在添加用戶后設置。暗示性權限是數據庫角色、服務器角色等擁有的權限,由系統設置完成。
數據庫中的用戶根據數據庫的角色被設定了一些缺省權限,這樣的用戶分為四類。分別是數據庫管理員(配置服務器,創建、刪除數據庫,master數據庫被系統管理員一直擁有),數據庫屬主(管理數據庫,創建、管理數據庫中的對象),對象屬主(對象屬主dbo在對象上授予、回收權限等操作),除以上三類的都歸為第四類。實際上我們發現權限是重疊的,正常情況下系統管理員會被設定為數據庫的屬主,這時系統管理員既可以管理服務器也可以刪除、創建、管理數據庫,同時數據庫中的所有對象數據庫屬主都可以擁有,這樣看來系統管理員就同時擔任了前三類角色,而其余的用戶則可以是第四類角色。
所有權鏈是SQL Server中難以理解和比較復雜的,當我們創建存儲過程或者試圖時,同時也創建了所有權鏈,實際上存儲過程或者視圖創建時的對象的擁有者的名單就是一個所有權鏈。當用戶在視圖中通過select提取數據時,SQL server既檢查在該視圖用戶的權限,也要檢查所有權鏈。所有權鏈有兩種類型,當視圖的屬主擁有視圖中全部引用的對象時,(unbroken ownership chain)是該視圖的所有權鏈。當多個以上的用戶擁有一個視圖的對象時,所有權鏈將斷鏈(broken ownership chain)。比如,用戶yb在allpat表上創建視圖時,所有權鏈將斷鏈。所有權鏈斷鏈不是恒定的錯誤,在任意數據庫中由任意多個用戶創建的視圖都有可能出現所有權鏈斷鏈,理解在所有權鏈內部權限所起到的作用是很重要的。
根據上文我們已知道對象和語句上權限是如何運行工作的,但是如何實現的呢?將所有權鏈、權限、所有權組合起來是一個讓人難以理解且復雜的事情,系統管理員是如何對它們進行跟蹤和管理?在單屬主模式(single owner model)和多屬主模式(multiple owner model)這兩種模式下可以跟蹤和創建安全性。單屬主模式(single owner model)中,數據庫里的所有對象被dbo所擁有,dbo具有授權和收回的權限。多屬主模式(multiple owner model)中,用戶可以直接管理、創建表及數據。當然它們也有各自的優、缺點,單屬主模式(single owner model)缺點是所有在對象上權限的變化及處理需要dbo實時跟蹤,優點是在這兩種模式下相對簡單,數據庫中dbo擁有控制權。多屬主模式(multiple owner model)缺點是所有權鏈斷鏈需要一定能力水平才能解決,優點在于dbo的工作量被大大減少了。在一些特殊情況下,單屬主模式(single owner model)和多屬主模式(multiple owner model)這兩種模式聯合。在設計數據庫時我們會碰到用戶不光擁有自己的表,且這些表還有為應用程序做的個性化設置或者其他表里數據的子集,通過客戶端的應用程序來控制數據的輸出與輸入并且表的創建也被管理起來了。這樣簡化了用戶的管理。
以下示例可直觀地了解以上的內容。
在數據庫appdata中創建一個角色ruser,擁有表allpat的所有權限、表inpat的查詢(select)權限,再創建luser登錄名,并為它創建uuser賬戶,同時歸類到ruser角色中,用戶賬戶uuser不能有對mzdj表的查詢權限(select)。
Exec sp_addrole ‘ruser’ --ruser角色創建
Grant all on allpat to ruser ---ruser角色擁有allpat表的所有權限
Grant select on inpat to ruser ---ruser角色擁有inpat表的查詢權限
Exec sp_addlogin ‘luser’,’pwd’,‘appdata’ --增加登錄用戶名luser
Exec sp_grantdbaccess ‘luser’,‘uuser’ --添加賬戶uuser
Exec sp_addrolemember ‘ruser’,‘uuser’ --增加uuser為ruser的成員
綜上所述我們知道服務器角色是可以分配賬戶,數據庫角色管理賬戶,根據目的不同分配不同的權限來規范用戶操作,定義和生成權限是系統管理員平時的重要任務。
總之,提高數據庫的安全性,保護數據庫,防止因非法操作而造成的數據泄露、損壞、更改。