【IT168 技術(shù)】權(quán)限兩個字,,一個權(quán)力,,一個限制。在軟件領(lǐng)域通俗的解釋就是哪些人可以對哪些資源做哪些操作,。在SQL Server中,,”哪些人”,“哪些資源”,”哪些操作”則分別對應(yīng)SQL Server中的三個對象,,分別為主體(Principals),安全對象(Securables)和權(quán)限(Permissions),,而權(quán)力和限制則是對應(yīng)了SQL Server中的GRENT和DENY。對于主體,安全對象和權(quán)限的初步理解,,見圖1.
圖1.簡單理解主體,安全對象和權(quán)限的關(guān)系 對于圖1中的造句來說,,并沒有主語,也就是并沒有說誰給予的權(quán)限(難道是上帝?),。你可以理解為SA賬戶在最開始時給予了其他主體對于安全對象的權(quán)限,。 SQL Server中的驗(yàn)證方式 在給予別人權(quán)限之前,或是檢查你是否有某項(xiàng)權(quán)限之前,,SQL Server首先要知道“你”這個主體是否是你自己號稱的那個主體,。比如武俠小說中接頭時對的暗號”天王蓋地虎,寶塔鎮(zhèn)河妖…”就是驗(yàn)證身份的一種方式,。而對于SQL Server,是在你連接SQL Server時SQL Server就需要確認(rèn)你是誰,。SQL Server提供了兩種身份驗(yàn)證模式: Windows身份驗(yàn)證模式 Windows身份驗(yàn)證模式就像其名稱所示那樣,由Windows來驗(yàn)證主體,,SQL Server并不參與驗(yàn)證,。SQL Server完全相信Windows的驗(yàn)證結(jié)果。所以用此方式登錄SQL Server時并不需要提供密碼,。雖然如此,,但Windows身份驗(yàn)證模式要更加安全,因?yàn)閃indows身份驗(yàn)證模式使用了Kerberos(這一名詞來源于希臘神話“三個頭的狗——地獄之門守護(hù)者”)協(xié)議,。這也是微軟推薦的最安全的做法,。 但Windows身份驗(yàn)證模式在由域控制器控制網(wǎng)絡(luò)訪問的情況下才得以使用(當(dāng)然了,單機(jī)也包括在內(nèi)),。 SQL Server和Windows身份驗(yàn)證模式(混合模式) 我一直覺得這種模式的名稱應(yīng)該改為SQL Server或Windows身份驗(yàn)證模式更容易理解,。這種模式即允許由Windows來驗(yàn)證主體身份,又允許SQL Server來驗(yàn)證主體身份,,當(dāng)由SQL Server驗(yàn)證主體身份時,,需要用戶名和密碼來確認(rèn)主體身份,和使用什么Windows賬戶半毛錢關(guān)系都沒有,。這些用戶信息被加密后存在Master數(shù)據(jù)庫中,。 設(shè)置驗(yàn)證模式 設(shè)置驗(yàn)證模式非常簡單。既可以在安裝的時候進(jìn)行設(shè)置,,也可以在安裝之后通過右鍵點(diǎn)擊實(shí)例,,選擇屬性,在安全性選項(xiàng)卡中進(jìn)行改變,,如圖2所示,。 圖2.安裝完SQL Server之后改變身份驗(yàn)證方式 理解主體 “主體”是可以請求 SQL Server 資源的實(shí)體。主體可以是個體,,組或者進(jìn)程,。主體可以按照作用范圍被分為三類:
Windows 級別的主體包括Windows 域登錄名和Windows 本地登錄名,。 SQL Server級的主體包括SQL Server 登錄名和服務(wù)器角色。 數(shù)據(jù)庫級的主體包括數(shù)據(jù)庫用戶和數(shù)據(jù)庫角色以及應(yīng)用程序角色,。 登錄名 登錄名是服務(wù)器級別的主體,,但無論是上述哪個層級的主體,因?yàn)樾枰卿浀絊QL Server實(shí)例,,所以每一個層級的主體都需要一個與之對應(yīng)的登錄名,。對于Windows級別的主體來說,,Windows用戶會映射到登錄名,。對于數(shù)據(jù)庫級別的主體來說,其用戶必須映射到登錄名中,。而登錄名可以不映射到數(shù)據(jù)庫用戶,,如圖3所示。
圖3.登錄名的映射關(guān)系 在圖3中實(shí)例層級的登錄名中,,我們看到除了自定義添加的用戶之外,,還有一些由系統(tǒng)添加的登錄名。首先,,以”##”開頭和結(jié)尾的用戶是SQL Server內(nèi)部使用的賬戶,,由證書創(chuàng)建,不應(yīng)該被刪除,。其次是sa賬戶,,sa登錄名擁有一切特權(quán),可以在SQL Server中為所欲為,,并且不能夠被刪除,。因此sa作為分配權(quán)限的起點(diǎn)(也就是圖1中所說的主語).因此對于Sa的密碼要設(shè)置的盡可能復(fù)雜,否則Sa登錄名被盜取后果不堪設(shè)想,。還有NT AUTHORITY\NETWORK SERVICE和NT AUTHORITY\SYSTEM賬戶是和啟動SQL Server這個Windows服務(wù)的賬戶有關(guān),,如果使用本地登錄賬戶或是網(wǎng)絡(luò)賬戶啟動SQL Server服務(wù),請不要刪除這兩個賬戶,,如圖4所示,。 圖4.以本地系統(tǒng)賬戶啟動服務(wù) 最后BUILDIN\Administrator賬戶是與本地管理員組關(guān)聯(lián)的登錄名,默認(rèn)屬于sysadmin角色,。這個賬戶使得任何屬于本地管理員的賬戶都可以獲得對SQL Server的完全控制權(quán),。 數(shù)據(jù)庫用戶 數(shù)據(jù)庫用戶是數(shù)據(jù)庫級別的主體,被用于訪問數(shù)據(jù)庫層面的對象。每一個數(shù)據(jù)庫用戶都必須要一個與之對用的登錄名,。數(shù)據(jù)庫用戶的信息存在數(shù)據(jù)庫中,,而登錄名存在實(shí)例級別的Master數(shù)據(jù)庫中(但SQL SERVER2012的Contained Database允許將登錄名也存在數(shù)據(jù)庫級別)。通常來說,,數(shù)據(jù)庫層級的用戶可以和映射的登錄名不一致,,但由于這種做法會引起混淆,因此并不推薦。如圖5所示,。
圖5.可以讓用戶名和登錄名不一致,,但并不推薦 默認(rèn)情況下,每個數(shù)據(jù)庫都帶有4個內(nèi)置用戶,,如圖6所示,。 圖6.數(shù)據(jù)庫帶的內(nèi)置用戶 dbo用戶是Database Owner的簡稱,如果說SA是實(shí)例級別的老大,,那DBO就是數(shù)據(jù)庫級別的老大,。這個用戶也同樣不能被刪除,每一個屬于sysadmin的服務(wù)器角色都會映射到數(shù)據(jù)庫的dbo用戶,。每一個表創(chuàng)建時如果沒有指定Schema,,則默認(rèn)在dbo這個schema下。 guest用戶是一個來賓賬戶,,這個賬戶允許登錄名沒有映射到數(shù)據(jù)庫用戶的情況下訪問數(shù)據(jù)庫,。默認(rèn)情況下guest用戶是不啟用的,你可以通過代碼1來啟用或不啟用guest用戶,。 --允許guest用戶連接權(quán)限 GRANT CONNECT TO guest --收回guest的連接權(quán)限 REVOKE CONNECT TO guest 代碼1.啟用或回收guest用戶的連接權(quán)限 你也可以給guest用戶分配角色來控制guest的權(quán)限(如圖7所示),,但是這有可能造成潛在的安全問題,最佳做法是單獨(dú)創(chuàng)建數(shù)據(jù)庫用戶,。 圖7.為guest用戶分配角色 而INFORMATION_SCHEMA用戶和sys用戶擁有系統(tǒng)視圖,,因此這兩個數(shù)據(jù)庫用戶不能被刪除,如圖8所示,。 圖8.INFORMATION_SCHEMA和sys用于訪問系統(tǒng)視圖 角色 角色是方便對主體進(jìn)行管理的一種舉措,。SQL Server中的角色和Windows中的用戶組是一個概念。屬于某個角色的用戶或登錄名就會擁有相應(yīng)的權(quán)限,,這不難理解,,就好比你在公司當(dāng)經(jīng)理,你就可以報(bào)銷多少錢的手機(jī)費(fèi)用,。而比你低一個層級的開發(fā)人員則沒有這個待遇,。用戶或登錄名可以屬于多個角色,這也同樣不難理解,,就像你在公司中可以是項(xiàng)目經(jīng)理,,也同時兼任高級工程師一樣。 角色在SQL Server中被分為三類,,分別為: 內(nèi)置角色----這類角色在服務(wù)器安裝時已經(jīng)默認(rèn)存在,,其權(quán)限是固定的,并且不能被刪除 用戶自定義角色----這類角色由用戶按照需求自定義創(chuàng)建 應(yīng)用程序角色----這類特殊角色用于管理應(yīng)用程序的數(shù)據(jù)訪問 內(nèi)置角色是在安裝SQL Server時就固定的,,無論是服務(wù)器角色還是數(shù)據(jù)庫角色,,其對應(yīng)的權(quán)限都是固定的,。具體每個角色對應(yīng)的權(quán)限請查看MSDN(固定服務(wù)器角色http://msdn.microsoft.com/zh-cn/library/ms175892.aspx,固定數(shù)據(jù)庫角色http://msdn.microsoft.com/zh-cn/library/ms189121.aspx),但這里要注意一個特殊的角色: public角色。 public角色不同于其它角色,,其權(quán)限可以被調(diào)整,如圖9所示,。 圖9.Public角色不同于其它角色在于其權(quán)限可以被修改 可以將Public角色理解為訪問數(shù)據(jù)庫或?qū)嵗淖钚?quán)限,Public所擁有的權(quán)限自動被任何主體繼承,,所以對于Public角色的權(quán)限修改要格外小心,。 而用戶自定義角色是按照用戶自己的需求組成的角色,由用戶創(chuàng)建,。 而應(yīng)用程序角色并不包含任何用戶,,應(yīng)用程序角色與其說是角色,不如說是一個特殊的用戶,。這是為應(yīng)用程序?qū)iT準(zhǔn)備的角色,,僅僅為應(yīng)用程序提供數(shù)據(jù)庫訪問權(quán)限,。這個角色并不提供給用戶,,而是由應(yīng)用程序的連接字符串嵌入角色名稱和密碼來激活對應(yīng)權(quán)限。 圖10.不同于其它數(shù)據(jù)庫角色,,應(yīng)用程序角色需要設(shè)置密碼 理解構(gòu)架 構(gòu)架(Schmea)是在SQL Server 2005之后的版本被引入的,。可以將構(gòu)架理解為一個命名空間,。在SQL Server2000中其實(shí)也有構(gòu)架的概念,,但概念并不同。因?yàn)镾QL Server 2000中的構(gòu)架是和用戶綁定的,,比如我新建用戶Jack,SQL Server自動分配一個叫Jack構(gòu)架,,用戶Jack并不能改變這個選項(xiàng),而由Jack所建的任何對象都在Jack之下,,比如新建一個表,,則為Jack.Table1。當(dāng)Jack如果離職時,,這對管理來說簡直是一場噩夢,。 在SQL Server 2005之后,SQL Server允許用戶和構(gòu)架分離,。使得利用構(gòu)架去擁有一些數(shù)據(jù)庫層級的對象,,比如說:表,視圖等,。 下面幾種選擇方式,,比如當(dāng)我默認(rèn)構(gòu)架是Sales,時,我可以用代碼2中第一種寫法,,不用構(gòu)架: SELECT * FROM Customer SELECT * FROM sales.Customer SELECT * FROM AdventureWorks.sales.Customer 代碼2.引用對象的幾種不同寫法 因此,,假如Customer表是由Jack建的,,我可以將其分配給Sales構(gòu)架,引用時使用Sales.Customer,而不是Jack.Customer,。這無疑大大方便了管理,,此外,可以針對構(gòu)設(shè)置權(quán)限,,這我會在本系列文章后續(xù)的文章中講到,。 簡單講述了SQL Server的權(quán)限體系。以及主體的概念,。理解SQL Server的安全性要首先理解這三大方面,。接下來,文章中我將接著講述安全對象,。 理解安全對象(Securable) 安全對象,,是SQL Server 數(shù)據(jù)庫引擎授權(quán)系統(tǒng)控制對其進(jìn)行訪問的資源。通俗點(diǎn)說,,就是在SQL Server權(quán)限體系下控制的對象,,因?yàn)樗械膶ο?從服務(wù)器,到表,,到視圖觸發(fā)器等)都在SQL Server的權(quán)限體系控制之下,,所以在SQL Server中的任何對象都可以被稱為安全對象。 和主體一樣,,安全對象之間也是有層級,,對父層級上的安全對象應(yīng)用的權(quán)限會被其子層級的安全對象所繼承。SQL Server中將安全對象分為三個層次,分別為:
這三個層級是從上到下包含的,,如圖1所示: 圖1.安全對象層級之間的包含關(guān)系 對于SQL Server對于層級的詳細(xì)劃分,,可以參看MSDN(http://msdn.microsoft.com/zh-cn/library/ms190401.aspx)。SQL Server中全部的安全對象如圖2和圖3所示,。 圖2.服務(wù)器層級的安全對象 圖3.數(shù)據(jù)庫和構(gòu)架層級的安全對象 理解權(quán)限(Permission) 權(quán)限是連接主體和安全對象的紐帶,。SQL Server 2008中,權(quán)限分為權(quán)利與限制,分別對應(yīng)GRANT語句和DENY語句。GRANT表示允許主體對于安全對象做某些操作,,DENY表示不允許主體對某些安全對象做某些操作,。還有一個REVOKE語句用于收回先前對主體GRANT或DENY的權(quán)限。 在設(shè)置權(quán)限時,,尤其要注意權(quán)限在安全對象上的繼承關(guān)系,。對于父安全對象上設(shè)置的權(quán)限,會被自動繼承到子安全對象上,。主體和安全對象的層級關(guān)系如圖4所示,。
圖4.主體和安全對象之間的層級關(guān)系 比如,我給予主體CareySon(登錄名)對于安全對象CareySon-PC(服務(wù)器)的Select(權(quán)限),那么CareySon這個主體自動擁有CareySon-PC服務(wù)器下所有的數(shù)據(jù)庫中表和視圖等子安全對象的SELECT權(quán)限,。如圖5所示,。 圖5.主體對于安全對象的權(quán)限在層級上會繼承 此時,,主體CareySon可以看到所有數(shù)據(jù)庫極其子安全對象,如圖6所示
圖6.主體對于安全對象的權(quán)限在層級上會繼承 使用T-SQL語句進(jìn)行權(quán)限控制 在理解了主體,安全對象和權(quán)限的概念之后,,使用T-SQL語句進(jìn)行權(quán)限控制就非常簡單了,。使用GRANT語句進(jìn)行授予權(quán)限,使用DENY語句限制權(quán)限,,使用REVOKE語句收回之前對于權(quán)限的授予或者限制,。 GRANT在MSDN的原型為: GRANT { ALL [ PRIVILEGES ] } | permission [ ( column [ ,...n ] ) ] [ ,...n ] [ ON [ class :: ] securable ] TO principal [ ,...n ] [ WITH GRANT OPTION ] [ AS principal ] 對于GRANT語句的理解就像造句一樣 GRANT 某種權(quán)限 ON 安全對象類型::安全對象 TO 主體。如果指定了WITH GRANT OPTION,則被授予權(quán)限的主體可以授予別的主體同樣的權(quán)限,。 對于DENY語句在MSDN中的原型和GRANT大同小異: DENY { ALL [ PRIVILEGES ] } | permission [ ( column [ ,...n ] ) ] [ ,...n ] [ ON [ class :: ] securable ] TO principal [ ,...n ] [ CASCADE] [ AS principal ] 值得注意的是CASCADE選項(xiàng)表示拒絕主體對于安全對象的訪問權(quán)限同時決絕主體授予其他主體對于安全對象的權(quán)限,。 而REVOKE語句用于收回原來授予或拒絕某個主體對于安全對象的權(quán)限。REVOKE在MSDN中的原型如下: REVOKE [ GRANT OPTION FOR ] { [ ALL [ PRIVILEGES ] ] | permission [ ( column [ ,...n ] ) ] [ ,...n ] } [ ON [ class :: ] securable ] { TO | FROM } principal [ ,...n ] [ CASCADE] [ AS principal ] 一個進(jìn)行權(quán)限控制的例子如下: grant select--權(quán)限 ON Schema::SalesLT--類型::安全對象 to careyson--主體 deny select--權(quán)限 ON Schema::SalesLT--類型::安全對象 to careyson--主體 revoke select--權(quán)限 ON Schema::SalesLT--類型::安全對象 to careyson--主體 控制權(quán)限的時候需要注意如下幾點(diǎn):
在高層級上的DENY會覆蓋任何子層級的GRANT,。比如說,,你對于Schema進(jìn)行Deny,對其包含的表進(jìn)行Grant,則表的GRANT會被Schema的Deny鎖覆蓋,如圖7所示。 圖7.父層級的Deny覆蓋子層級的Grant 對于主體作用于高層級的GRANT會被其子Deny所覆蓋,,還是上面的例子,,我對于Schema進(jìn)行Grant,對于表進(jìn)行Deny,最后結(jié)果還是Deny,如圖8所示,。 圖8.子層級的Deny覆蓋父層級的Grant SQL Server不對sysadmin組的成員做任何權(quán)限驗(yàn)證操作,。換句話說,sysadmin組的成員可以為所欲為 而對于何種的安全對象可以進(jìn)行何種對應(yīng)權(quán)限的GRANT,REVOKE,DENY,請參看MSDN(http://msdn.microsoft.com/zh-cn/library/ms191291.aspx) 總結(jié) 本文講述了安全對象以及相應(yīng)的權(quán)限,。對于權(quán)限控制時,理解權(quán)限的繼承和權(quán)限的覆蓋會在設(shè)置權(quán)限時減少很多問題,。 |
|