久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

深入淺出:全面理解SQL Server權(quán)限體系

 RoryShaw 2013-08-23

        【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.

  理解SQL Server中的權(quán)限體系

  圖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所示,。

理解SQL Server中的權(quán)限體系

  圖2.安裝完SQL Server之后改變身份驗(yàn)證方式

  理解主體

  “主體”是可以請求 SQL Server 資源的實(shí)體。主體可以是個體,,組或者進(jìn)程,。主體可以按照作用范圍被分為三類:

  •   Windows級別主體
  •   服務(wù)器級別主體
  •   數(shù)據(jù)庫級別主體

  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所示。

理解SQL Server中的權(quán)限體系

 

  圖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所示,。

理解SQL Server中的權(quán)限體系

圖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所示,。

理解SQL Server中的權(quán)限體系

 

  圖5.可以讓用戶名和登錄名不一致,,但并不推薦


  默認(rèn)情況下,每個數(shù)據(jù)庫都帶有4個內(nèi)置用戶,,如圖6所示,。

理解SQL Server中的權(quán)限體系

  圖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ù)庫用戶,。

理解SQL Server中的權(quán)限體系

  圖7.為guest用戶分配角色

  而INFORMATION_SCHEMA用戶和sys用戶擁有系統(tǒng)視圖,,因此這兩個數(shù)據(jù)庫用戶不能被刪除,如圖8所示,。

理解SQL Server中的權(quán)限體系

  圖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所示,。

理解SQL Server中的權(quán)限體系

  圖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)限。

理解SQL Server中的權(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中將安全對象分為三個層次,分別為:

  •   服務(wù)器層級
  •   數(shù)據(jù)庫層級
  •   構(gòu)架層級

  這三個層級是從上到下包含的,,如圖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所示,。

  1

  圖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):

  •   GRANT會移除主體作用于安全對象上的DENY和REVOKE
  •   DENY和REVOKE移出主體作用于安全對象上的GRANT
  •   REVOKE會移除主體作用于安全對象上的DENY和GRANT

  在高層級上的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)限時減少很多問題,。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多