李素奇
(射陽縣中醫(yī)院,江蘇 射陽 224300)
我們在接觸SQL Server時經(jīng)常會碰到三個術(shù)語分別是登錄名、用戶名、賬號,訪問SQL Server時必須要有登錄名,在master數(shù)據(jù)庫中的syslogins表里存放每個登錄名的信息。登錄名不同于用戶名,使用登錄名并不能訪問數(shù)據(jù)庫中的資源,此時必須要創(chuàng)建用戶名;在數(shù)據(jù)庫里創(chuàng)建用戶名并與其中一個登錄名關(guān)聯(lián),用戶信息存放在數(shù)據(jù)庫的sysusers表中,且用戶沒有口令與他關(guān)聯(lián),用戶訪問特定對象的權(quán)限是需要授予的??傊?,數(shù)據(jù)庫的對象是用戶,根據(jù)授予的權(quán)限來獲得資源,登錄名則不能獲得資源,只是進(jìn)門的鑰匙,而賬號則是特指用戶管理器中創(chuàng)建的賬戶。
在大多數(shù)情況下,我們習(xí)慣登錄名和用戶名使用一樣的名稱,系統(tǒng)管理員一般用sa表示,數(shù)據(jù)庫屬主一般用dbo表示,sa始終關(guān)聯(lián)著dbo用戶,只有在新的登錄名創(chuàng)建后才能創(chuàng)建新的用戶。
在登錄SQL Server時,我們需要經(jīng)過三步驗(yàn)證,第一步需要正確的登錄名和密碼登錄到SQL Server,但此時還不能訪問數(shù)據(jù)庫資源。第二步在特定數(shù)據(jù)庫中創(chuàng)建或綁定用戶,允許用戶與特定數(shù)據(jù)庫連接并訪問資源。第三步指派用戶對特定數(shù)據(jù)庫的對象的訪問權(quán)限,比如哪些表、視圖、存儲過程是用戶有權(quán)使用運(yùn)行的。
我們在登錄Windows系統(tǒng)后,系統(tǒng)管理員的賬戶也有SQL Server的管理權(quán),為保證特定的用戶能夠訪問SQL Server數(shù)據(jù)庫那應(yīng)該需要怎樣設(shè)置呢,這就涉及到SQL Server的驗(yàn)證模式,SQL Server支持兩種不同的安全模式,即Windows驗(yàn)證模式和混合安全驗(yàn)證模式。
在Windows驗(yàn)證模式下,SQL Server數(shù)據(jù)庫檢測當(dāng)前Windows 用戶賬戶,并在syslogins表中查找該賬戶,如有則有權(quán)限登錄,并且不需要輸入登錄名和口令進(jìn)行驗(yàn)證,在此過程中SQL Server是從RPC連接中來獲得Windows的用戶信息,Windows驗(yàn)證優(yōu)點(diǎn)在于,首先,SQL Server數(shù)據(jù)庫管理員只需管理數(shù)據(jù)庫,用戶賬戶由Windows 去管理,其次,Windows管理用戶賬戶的工具相比SQL Server的更強(qiáng)大,SQL Server如需這些功能,需要定制來進(jìn)行擴(kuò)展。
在混合安全驗(yàn)證模式下,允許Windows驗(yàn)證模式或者SQL Server的驗(yàn)證模式進(jìn)行登錄連接數(shù)據(jù)庫,當(dāng)通信時使用TCP/IP Sockets就是使用SQL Server進(jìn)行驗(yàn)證登錄;當(dāng)使用命名管道就是使用Windows進(jìn)行驗(yàn)證登錄,使用混合安全模式靈活性更好,更能適應(yīng)不同的應(yīng)用場景。使用SQL Server驗(yàn)證時需輸入登錄名和口令,在syslogins表中進(jìn)行匹配,匹配成功,正常登錄,
SQL Server的驗(yàn)證模式類型的確定,取決于服務(wù)器與客戶和網(wǎng)絡(luò)驗(yàn)證模型之間使用的網(wǎng)絡(luò)通信協(xié)議。一般情況下我們可以運(yùn)用SQL server 工具企業(yè)管理器來進(jìn)行設(shè)置、修改驗(yàn)證模式。
用戶管理是一件復(fù)雜的事情,如何保證用戶在不超出設(shè)置的權(quán)限范圍內(nèi),訪問到他們所需要的數(shù)據(jù),是每個數(shù)據(jù)庫管理員需要慎重分配的。我們知道用戶可以進(jìn)行分組,也就是需要訪問相同數(shù)據(jù)且具有相同權(quán)限的用戶放入一個組里進(jìn)行統(tǒng)一管理。此時可以把組當(dāng)成角色來理解,在SQL server里有數(shù)據(jù)庫角色和服務(wù)器角色兩種,其中數(shù)據(jù)庫級的對象是數(shù)據(jù)庫角色,包含數(shù)據(jù)庫名,而服務(wù)器級的對象是服務(wù)器角色,包含登錄名(見圖1)。
圖1 登錄過程圖
SQL Server 安裝完成后,系統(tǒng)自動會創(chuàng)建以下一些固定的數(shù)據(jù)庫角色如:
Db_owner(數(shù)據(jù)庫的屬主,能執(zhí)行特定數(shù)據(jù)庫的所有的任務(wù)。)
Db_accessadmin(能在數(shù)據(jù)庫中添加、刪除數(shù)據(jù)庫角色、用戶)
Db_securityadmin(能在數(shù)據(jù)庫中分配對象和語句權(quán)限)
Db_ddladmin(能在數(shù)據(jù)庫中添加、刪除和修改對象)
Db_backupoperator(能恢復(fù)或備份數(shù)據(jù)庫)
Db_datareader(能查看任意表中的數(shù)據(jù))
Db_datawriter(能在表中添加、修改、刪除數(shù)據(jù))
Db_denydatareader(拒絕讀取表中的數(shù)據(jù))
Db_denydatawriter(拒絕修改表中的數(shù)據(jù))
以上這些數(shù)據(jù)角色可在數(shù)據(jù)庫sysusers表里查看。SQL Server數(shù)據(jù)庫中的用戶都是公共角色成員,管理員可以定義數(shù)據(jù)庫用戶的角色,比如有一個醫(yī)療的角色和一個護(hù)理的角色,在醫(yī)療部中有幾位科室主管,這些科室主管用戶不能在護(hù)理部和科護(hù)士長的角色中,此時就需要我們繼續(xù)創(chuàng)建角色,把科室主管加到角色中并為分配一定的權(quán)限來進(jìn)行工作。
SQL Server 安裝完成后,系統(tǒng)也自動會創(chuàng)建以下一些固定的服務(wù)器角色如:
Sysadmin(系統(tǒng)管理員組,可執(zhí)行任何任務(wù))
Securityadmin(審核、管理服務(wù)器登錄名)
Serveradmin(設(shè)置服務(wù)器及配置信息)
Setupadmin(可復(fù)制、安裝)
Processadmin(管理進(jìn)程)
Diskadmin(管理磁盤文件)
Dbcreator(修改、建立數(shù)據(jù)庫)
以上這些服務(wù)器角色可在數(shù)據(jù)庫master 的syslogins表里查看。
數(shù)據(jù)庫的安全性離不開數(shù)據(jù)庫角色的控制,用戶通過數(shù)據(jù)庫角色中的用戶名確定對數(shù)據(jù)庫操作的權(quán)限。數(shù)據(jù)庫角色分為標(biāo)準(zhǔn)角色和應(yīng)用程序角色。
一般來說每個數(shù)據(jù)庫的系統(tǒng)表里都保存角色和用戶信息,sysusers系統(tǒng)表中有uid,name,gid等字段在數(shù)據(jù)庫中用戶的標(biāo)識是uid,組用gid來表示,在sysuser表中uid與gid相等的行就是定義的角色。其中g(shù)id與uid都等于0是public的角色,所以一般可以通過對uid來判斷sysuser表中的記錄是角色還是用戶。
數(shù)據(jù)庫里的對象和全部的數(shù)據(jù)庫都是SQL server 的對象,在一個數(shù)據(jù)庫中表、存儲過程、規(guī)則、視圖、缺省和自定義的數(shù)據(jù)類型都是其對象。它們各自都有其對應(yīng)的屬主,簡而論之創(chuàng)建該對象的用戶就是其屬主。比如系統(tǒng)管理員(sa)創(chuàng)建數(shù)據(jù)庫后,并在其登錄后sa在該數(shù)據(jù)庫中則是數(shù)據(jù)庫屬主(dbo),再比如sa用戶創(chuàng)建表,則sa將對該表擁有權(quán)限。
對象名是該對象屬主的一部分,數(shù)據(jù)庫中所有的對象都?xì)w該數(shù)據(jù)庫的屬主所擁有,比如當(dāng)查詢appdata數(shù)據(jù)庫中mancode表中的內(nèi)容,一般通過select命令查詢:select *from mancode。但如果用戶fck在appdata數(shù)據(jù)庫中創(chuàng)建了表doctor,你則需要限定該對象的名字:fck.mancode。在數(shù)據(jù)庫appdata中任何有權(quán)限的用戶都可創(chuàng)建同一名稱的表。所以在數(shù)據(jù)庫appdata中就有fck.mancode,lyy.mancode,cd.mancode,chy.mancode等。數(shù)據(jù)庫中的用戶訪問其中某一對象時,如該對象屬主的用戶名沒有限制,那將先訪問擁有該對象的用戶,其次數(shù)據(jù)庫屬主所擁有的對象。
權(quán)限對用戶賬戶來說是其中重要的屬性之一,可以完成特定范圍內(nèi)的一些操作。SQL server一般擁有的權(quán)限,有兩種不同的類型??刂朴脩襞c對象進(jìn)行操作交互就是對象的權(quán)限,特別是在插入、修改、刪除、查詢某一表中行的數(shù)據(jù),又或者某一存儲過程能否執(zhí)行。恢復(fù)和備份數(shù)據(jù)庫、刪除和創(chuàng)建對象通過語句權(quán)限來實(shí)現(xiàn)。
權(quán)限用來完成特定的操作,是用戶賬戶的屬性,權(quán)限一般有三種類型,分別是對象權(quán)限、語句權(quán)限、暗示性權(quán)限。對象權(quán)限是控制用戶與對象進(jìn)行交互、操作,主要進(jìn)行查詢、插入、修改、刪除數(shù)據(jù)庫中某個表的數(shù)據(jù)或運(yùn)行一個存儲過程,一般有五個權(quán)限,分別是查詢(select)、修改(update)、刪除(delete)、插入(insert)、執(zhí)行(exec),在數(shù)據(jù)庫屬性內(nèi)設(shè)置。語句權(quán)限適用于備份、恢復(fù)數(shù)據(jù)庫刪除、創(chuàng)建對象,在添加用戶后設(shè)置。暗示性權(quán)限是數(shù)據(jù)庫角色、服務(wù)器角色等擁有的權(quán)限,由系統(tǒng)設(shè)置完成。
數(shù)據(jù)庫中的用戶根據(jù)數(shù)據(jù)庫的角色被設(shè)定了一些缺省權(quán)限,這樣的用戶分為四類。分別是數(shù)據(jù)庫管理員(配置服務(wù)器,創(chuàng)建、刪除數(shù)據(jù)庫,master數(shù)據(jù)庫被系統(tǒng)管理員一直擁有),數(shù)據(jù)庫屬主(管理數(shù)據(jù)庫,創(chuàng)建、管理數(shù)據(jù)庫中的對象),對象屬主(對象屬主dbo在對象上授予、回收權(quán)限等操作),除以上三類的都?xì)w為第四類。實(shí)際上我們發(fā)現(xiàn)權(quán)限是重疊的,正常情況下系統(tǒng)管理員會被設(shè)定為數(shù)據(jù)庫的屬主,這時系統(tǒng)管理員既可以管理服務(wù)器也可以刪除、創(chuàng)建、管理數(shù)據(jù)庫,同時數(shù)據(jù)庫中的所有對象數(shù)據(jù)庫屬主都可以擁有,這樣看來系統(tǒng)管理員就同時擔(dān)任了前三類角色,而其余的用戶則可以是第四類角色。
所有權(quán)鏈?zhǔn)荢QL Server中難以理解和比較復(fù)雜的,當(dāng)我們創(chuàng)建存儲過程或者試圖時,同時也創(chuàng)建了所有權(quán)鏈,實(shí)際上存儲過程或者視圖創(chuàng)建時的對象的擁有者的名單就是一個所有權(quán)鏈。當(dāng)用戶在視圖中通過select提取數(shù)據(jù)時,SQL server既檢查在該視圖用戶的權(quán)限,也要檢查所有權(quán)鏈。所有權(quán)鏈有兩種類型,當(dāng)視圖的屬主擁有視圖中全部引用的對象時,(unbroken ownership chain)是該視圖的所有權(quán)鏈。當(dāng)多個以上的用戶擁有一個視圖的對象時,所有權(quán)鏈將斷鏈(broken ownership chain)。比如,用戶yb在allpat表上創(chuàng)建視圖時,所有權(quán)鏈將斷鏈。所有權(quán)鏈斷鏈不是恒定的錯誤,在任意數(shù)據(jù)庫中由任意多個用戶創(chuàng)建的視圖都有可能出現(xiàn)所有權(quán)鏈斷鏈,理解在所有權(quán)鏈內(nèi)部權(quán)限所起到的作用是很重要的。
根據(jù)上文我們已知道對象和語句上權(quán)限是如何運(yùn)行工作的,但是如何實(shí)現(xiàn)的呢?將所有權(quán)鏈、權(quán)限、所有權(quán)組合起來是一個讓人難以理解且復(fù)雜的事情,系統(tǒng)管理員是如何對它們進(jìn)行跟蹤和管理?在單屬主模式(single owner model)和多屬主模式(multiple owner model)這兩種模式下可以跟蹤和創(chuàng)建安全性。單屬主模式(single owner model)中,數(shù)據(jù)庫里的所有對象被dbo所擁有,dbo具有授權(quán)和收回的權(quán)限。多屬主模式(multiple owner model)中,用戶可以直接管理、創(chuàng)建表及數(shù)據(jù)。當(dāng)然它們也有各自的優(yōu)、缺點(diǎn),單屬主模式(single owner model)缺點(diǎn)是所有在對象上權(quán)限的變化及處理需要dbo實(shí)時跟蹤,優(yōu)點(diǎn)是在這兩種模式下相對簡單,數(shù)據(jù)庫中dbo擁有控制權(quán)。多屬主模式(multiple owner model)缺點(diǎn)是所有權(quán)鏈斷鏈需要一定能力水平才能解決,優(yōu)點(diǎn)在于dbo的工作量被大大減少了。在一些特殊情況下,單屬主模式(single owner model)和多屬主模式(multiple owner model)這兩種模式聯(lián)合。在設(shè)計數(shù)據(jù)庫時我們會碰到用戶不光擁有自己的表,且這些表還有為應(yīng)用程序做的個性化設(shè)置或者其他表里數(shù)據(jù)的子集,通過客戶端的應(yīng)用程序來控制數(shù)據(jù)的輸出與輸入并且表的創(chuàng)建也被管理起來了。這樣簡化了用戶的管理。
以下示例可直觀地了解以上的內(nèi)容。
在數(shù)據(jù)庫appdata中創(chuàng)建一個角色ruser,擁有表allpat的所有權(quán)限、表inpat的查詢(select)權(quán)限,再創(chuàng)建luser登錄名,并為它創(chuàng)建uuser賬戶,同時歸類到ruser角色中,用戶賬戶uuser不能有對mzdj表的查詢權(quán)限(select)。
Exec sp_addrole ‘ruser’ --ruser角色創(chuàng)建
Grant all on allpat to ruser ---ruser角色擁有allpat表的所有權(quán)限
Grant select on inpat to ruser ---ruser角色擁有inpat表的查詢權(quán)限
Exec sp_addlogin ‘luser’,’pwd’,‘a(chǎn)ppdata’ --增加登錄用戶名luser
Exec sp_grantdbaccess ‘luser’,‘uuser’ --添加賬戶uuser
Exec sp_addrolemember ‘ruser’,‘uuser’ --增加uuser為ruser的成員
綜上所述我們知道服務(wù)器角色是可以分配賬戶,數(shù)據(jù)庫角色管理賬戶,根據(jù)目的不同分配不同的權(quán)限來規(guī)范用戶操作,定義和生成權(quán)限是系統(tǒng)管理員平時的重要任務(wù)。
總之,提高數(shù)據(jù)庫的安全性,保護(hù)數(shù)據(jù)庫,防止因非法操作而造成的數(shù)據(jù)泄露、損壞、更改。