在我們關(guān)于SQL服務(wù)器安全系列的這文章里,我們的目標(biāo)是向你提供安全安裝SQL服務(wù)器所需要的工具和信心,這樣的話,你有價(jià)值的數(shù)據(jù)就會(huì)受到保護(hù),避免無意或者有意的破壞或者竊取。在本文里,我們會(huì)深入一些基礎(chǔ)的概念,在保護(hù)數(shù)據(jù)庫安全的時(shí)候,你需要利用下面這些概念:登錄、用戶、角色,以及組。確定誰在請(qǐng)求訪問數(shù)據(jù)或者SQL服務(wù)器里其他信息等看上去很簡(jiǎn)單的過程,都需要用到所有這些概念。 \r\n\r\n
登錄 \r\n\r\n 登錄規(guī)定了哪些用戶能夠連接到安裝好的SQL服務(wù)器上——這不是某個(gè)特定的數(shù)據(jù)庫,而是而是整個(gè)服務(wù)器。登錄有兩種不同的形式: \r\n\r\n Windows集成的登錄,它會(huì)授權(quán)特定的Windows用戶或者組使用它們的Windows信任書進(jìn)行連接。 \r\n\r\n SQL服務(wù)器登錄,它會(huì)授權(quán)用戶使用由SQL服務(wù)器保存的用戶名和密碼進(jìn)行連接。 \r\n\r\n
你應(yīng)該使用哪一種? \r\n\r\n Windows集成登錄肯定要比SQL服務(wù)器登錄更加高效和更方便,因?yàn)橛脩糁恍枰卿浺淮巍诰W(wǎng)絡(luò)這一層。單獨(dú)登錄到服務(wù)器是沒有必要的,因?yàn)镾QL服務(wù)器會(huì)自動(dòng)地處理(在后臺(tái))Windows登錄,從而允許到服務(wù)器的訪問。只有在服務(wù)器運(yùn)行在Windows NT或者2000上的時(shí)候,對(duì)Windows登錄的支持才有效;安裝在Windows98上的服務(wù)器必須要依賴SQL服務(wù)器登錄。如果你正在運(yùn)行Windows2000,而且最終需要支持原有的應(yīng)用程序,那么就要記住,SQL服務(wù)器登錄只有在混合模式下才可用。 \r\n\r\n
設(shè)計(jì)上的考慮 \r\n\r\n 在設(shè)計(jì)自己數(shù)據(jù)庫的時(shí)候,你需要考慮登錄的方法——而且要在你真正開始保證最終產(chǎn)品的安全之前。你應(yīng)該知道服務(wù)器使用的是哪種授權(quán)方式。那些還在Window 98上使用服務(wù)器的人可能現(xiàn)在就要考慮升級(jí),如果安全是一個(gè)很重要的問題的話;那樣的話,他們就可以使用Windows集成的安全(策略)。 \r\n\r\n 另外一個(gè)設(shè)計(jì)問題是知道誰擁有訪問權(quán),他們能夠訪問什么數(shù)據(jù),以及他們是否能夠?qū)?duì)象和數(shù)據(jù)進(jìn)行更改。你不用真的列出其名字;你只需要利用工具有效地幫助用戶就行了。最后,你應(yīng)該使用系統(tǒng)的存儲(chǔ)過程來管理安全。SQL服務(wù)器提供了兩種存儲(chǔ)過程,用于登錄的管理: \r\n\r\n ◆sp_addlogi——在使用SQL服務(wù)器驗(yàn)證保護(hù)你服務(wù)器安全的時(shí)候要使用這個(gè)存儲(chǔ)過程。具體的說,這個(gè)存儲(chǔ)過程會(huì)創(chuàng)建一個(gè)新的SQL服務(wù)器登錄,它允許用戶使用SQL服務(wù)器驗(yàn)證連接到SQL服務(wù)器的實(shí)例上。 \r\n\r\n ◆sp_grantlogin——這個(gè)存儲(chǔ)過程允許Windows 2000的用戶或者組帳號(hào)使用Windows驗(yàn)證連接到微軟的SQL服務(wù)器上。 \r\n\r\n 只有sysadmin或者securityadmin固有服務(wù)器角色的成員能夠執(zhí)行這兩個(gè)存儲(chǔ)過程。 \r\n\r\n
什么是系統(tǒng)存儲(chǔ)過程? \r\n\r\n 系統(tǒng)存儲(chǔ)過程是一個(gè)內(nèi)置的存儲(chǔ)過程,它能夠幫助你管理服務(wù)器。你可以在MSDN庫里找到一長串的系統(tǒng)存儲(chǔ)過程。SQL服務(wù)器文獻(xiàn)在線囊括了每個(gè)系統(tǒng)存儲(chǔ)過程的所有句法細(xì)節(jié)和使用示例。 \r\n\r\n
用戶 \r\n\r\n 登錄屬于服務(wù)器,而用戶則屬于數(shù)據(jù)庫。用戶ID會(huì)識(shí)別特定數(shù)據(jù)庫的特定用戶。而且,用戶對(duì)于數(shù)據(jù)庫來說是專門的——也就是說,Northwind數(shù)據(jù)庫里Fred這個(gè)用戶同公共數(shù)據(jù)庫里Fred那個(gè)用戶是不同的,盡管這兩個(gè)Fred可能和同一個(gè)登錄相關(guān)聯(lián)。 \r\n\r\n 當(dāng)你在數(shù)據(jù)庫里創(chuàng)建一個(gè)用戶的時(shí)候,你就將一個(gè)特定的登錄同這個(gè)用戶關(guān)聯(lián)起來了。對(duì)于這個(gè)數(shù)據(jù)庫而言,登錄具有這個(gè)用戶的權(quán)限。盡管登錄所用的ID不需要和用戶ID相同,但是在通常情況下,如果你保持這樣的慣例,那么事情就會(huì)更少讓人糊涂。如果登錄在數(shù)據(jù)庫里沒有相關(guān)聯(lián)的用戶,那么用戶能夠通過特殊的來賓用戶帳號(hào)連接到該數(shù)據(jù)庫。 \r\n\r\n
特殊用戶 \r\n\r\n 所有的用戶都不是數(shù)據(jù)庫里的常住人口,而且不能保證用戶帳號(hào)就是他們自己的。在希望用戶臨時(shí)訪問數(shù)據(jù)庫的時(shí)候,你可以使用來賓用戶帳號(hào),它可以不使用常規(guī)的用戶帳號(hào)而登錄訪問服務(wù)器。來賓用戶的登錄必須擁有訪問數(shù)據(jù)庫的權(quán)限,而且數(shù)據(jù)庫必須設(shè)有來賓用戶帳號(hào)。一旦進(jìn)了數(shù)據(jù)庫,來賓用戶會(huì)被限制到只能進(jìn)行來賓用戶帳號(hào)所指定的活動(dòng)。但是,來賓用戶帳號(hào)在一個(gè)剛剛創(chuàng)建的數(shù)據(jù)庫里不是缺省就存在的;(數(shù)據(jù)庫的)所有者或者系統(tǒng)管理員必須創(chuàng)建這樣一個(gè)帳號(hào)。 \r\n\r\n 除了來賓用戶,你還需要考慮數(shù)據(jù)庫的所有者(DBO)。他是創(chuàng)建數(shù)據(jù)庫的用戶。數(shù)據(jù)庫的所有者或者系統(tǒng)管理員必須賦予(其他人)權(quán)限,才能讓他們?cè)跀?shù)據(jù)庫創(chuàng)建其它的對(duì)象。 \r\n\r\n 為了向數(shù)據(jù)庫里添加數(shù)據(jù),你要運(yùn)行sp_grantdbaccess。這個(gè)存儲(chǔ)過程會(huì)在數(shù)據(jù)庫里創(chuàng)建一個(gè)和指定登錄相對(duì)應(yīng)的用戶。只有sysadmin固有服務(wù)器角色、db_accessadmin角色,以及db_owner固有服務(wù)器角色的成員才能夠執(zhí)行sp_grantdbaccess。 \r\n\r\n
角色 \r\n\r\n 角色讓你將用戶集中到一起,以利于更簡(jiǎn)單的管理。就像用戶一樣,角色也是數(shù)據(jù)庫的對(duì)象。例如,你可以在自己的采購數(shù)據(jù)庫里定義一個(gè)“銷售”角色,并讓所有的產(chǎn)品所有銷售人員都成為這個(gè)角色的成員。如果你隨后賦予這個(gè)“銷售”角色許可,那么這些許可會(huì)自動(dòng)地應(yīng)用于該角色的所有成員上。此外,一個(gè)用戶可以是多個(gè)角色的成員。 \r\n\r\n
有三種類型的角色: \r\n\r\n ◆公共——這個(gè)角色會(huì)為所有的用戶設(shè)置缺省的基本許可,所有的用戶都會(huì)被分配公共角色。 \r\n\r\n ◆服務(wù)器——服務(wù)器角色適用于整個(gè)服務(wù)器。 \r\n\r\n ◆數(shù)據(jù)庫——這些角色適用于專門的數(shù)據(jù)庫。 \r\n\r\n 服務(wù)器和數(shù)據(jù)庫角色都有預(yù)先定義的類別,我們把它們列在表格A里。 \r\n\r\n
![]()
\r\n表格 A\r\n
角色的分配 \r\n\r\n 有一些系統(tǒng)存儲(chǔ)過程是用于向數(shù)據(jù)庫添加角色和成員的。使用sp_addrole可以在數(shù)據(jù)庫里創(chuàng)建一個(gè)新的角色。然后,運(yùn)行sp_addrolemember向角色添加用戶帳號(hào)。你不能創(chuàng)建固有的服務(wù)器角色;你只能夠在服務(wù)器這一層添加角色。只有sysadmin固有服務(wù)器角色、db_securityadmin角色,以及db_owner固有數(shù)據(jù)庫角色的成員才能夠執(zhí)行sp_addrole或者sp_addrolemember。 \r\n\r\n
組 \r\n\r\n 組向你提供了批量管理安全的第二種方式,而不需要一個(gè)用戶一個(gè)用戶地來管理。在SQL服務(wù)器里并不存在組。它們由操作系統(tǒng)來維護(hù)。組的使用可以讓你把SQL服務(wù)器的安全策略和整個(gè)企業(yè)的安全策略綁在一起。 \r\n\r\n 例如,如果你有一個(gè)叫做“銷售”的Windows2000組,它包含著你所有的銷售人員,你可以在SQL服務(wù)器里專門為這個(gè)組創(chuàng)建一個(gè)Windows登錄。這個(gè)“銷售”組的任何成員都會(huì)作為指定的登錄連接到SQL數(shù)據(jù)庫上(除非他們有自己?jiǎn)为?dú)的優(yōu)先登錄)。你可以進(jìn)一步將這個(gè)登錄同任何數(shù)據(jù)庫里的用戶相關(guān)聯(lián),然后賦予該用戶許可。組的任何成員都會(huì)在他們使用數(shù)據(jù)庫的時(shí)候獲得指定的許可。 \r\n\r\n
管理策略 \r\n\r\n 用戶管理的主要目標(biāo)是雙重的。首先,你希望確保只有那些能夠獲得數(shù)據(jù)的用戶是真正需要使用數(shù)據(jù)的人。其次,你應(yīng)該盡力將用于用戶管理的精力降到最小。繁雜的策略要比直接的策略更少被人采用,否則就會(huì)導(dǎo)致安全的極大破壞。下面是你在用戶管理中可以采納的一些簡(jiǎn)單指導(dǎo)方針: \r\n\r\n 在可能的情況下,盡量使用Windows集成安全。這會(huì)降低密碼維護(hù)和用戶創(chuàng)建所要的花費(fèi)精力。它還會(huì)讓SQL服務(wù)器將登錄信息傳遞給已連接的服務(wù)器,這在分布式數(shù)據(jù)庫里很重要。 \r\n\r\n 在可能的情況下,盡量在聚合這一層管理安全。不應(yīng)該為每個(gè)必須訪問你數(shù)據(jù)的單個(gè)人創(chuàng)建用戶,而應(yīng)該創(chuàng)建像“銷售”或者DataEntryUsers這樣的角色。然后你就可以通過添加和刪除角色的用戶來控制訪問,同時(shí)向角色分配許可。另外,你也可以在Windows層管理組成員,并向代表整個(gè)Windows組的用戶分配許可。 \r\n\r\n 來賓用戶很危險(xiǎn),因?yàn)樗鼤?huì)給你服務(wù)器上每個(gè)的登錄都賦予訪問數(shù)據(jù)庫的權(quán)限。不要在數(shù)據(jù)庫里創(chuàng)建來賓用戶,除非它要對(duì)所有的人都開放。 \r\n\r\n
基本內(nèi)容 \r\n\r\n 本篇文章里所討論的概念都是實(shí)現(xiàn)你SQL服務(wù)器安全的基本要素,它們一點(diǎn)也不簡(jiǎn)單。理解每個(gè)登錄的工作方式離你確定自己整個(gè)(安全)策略還有很長的路要走。