SQL Server權(quán)限體系

權(quán)限兩個字,一個權(quán)力,一個限制。在軟件領(lǐng)域通俗的解釋就是哪些人可以對哪些資源哪些操作。在SQL Server中,”哪些人”,“哪些資源”,”哪些操作”則分別對應SQL Server中的三個對象,分別為主體(Principals),安全對象(Securables)和權(quán)限(Permissions),而權(quán)力和限制則是對應了SQL Server中的GRENT和DENY。對于主體,安全對象和權(quán)限的初步理解,見下圖:

主體

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

  • Windows級別主體:包括Windows 域登錄名Windows 本地登錄名。
  • 服務器級別主體:包括服務器登錄名服務器角色。
  • 數(shù)據(jù)庫級別主體:包括數(shù)據(jù)庫用戶、數(shù)據(jù)庫角色、固定數(shù)據(jù)庫角色以及應用程序角色。

可以看到主體包括登錄名以及角色。

角色

角色可以看成是權(quán)限的集合體,為了方便權(quán)限管理,可以把一些常用權(quán)限賦予角色,然后再把角色賦予相關(guān)用戶,則這些用戶就繼承了橘色中的所有權(quán)限。一般情況下,數(shù)據(jù)庫會內(nèi)置一些角色,用戶也可以創(chuàng)建自定義角色。對角色進行權(quán)限管理的方式與對用戶進行權(quán)限管理的方式是相同的。
??角色在SQL Server中被分為三類,分別為:

  • 內(nèi)置角色----這類角色在服務器安裝時已經(jīng)默認存在,其權(quán)限是固定的,并且不能被刪除
  • 用戶自定義角色----這類角色由用戶按照需求自定義創(chuàng)建
  • 應用程序角色----這類特殊角色用于管理應用程序的數(shù)據(jù)訪問

角色也分為兩個方面:

  • 服務器級別的角色,用于數(shù)據(jù)庫服務器方面的控制權(quán)限
  • 數(shù)據(jù)庫級別的角色,用于數(shù)據(jù)庫中數(shù)據(jù)的控制權(quán)限。

(1)服務器級別的角色

服務器級角色的權(quán)限作用域為服務器范圍。例如創(chuàng)建、修改、刪除數(shù)據(jù)庫,管理磁盤文件,添加或刪除數(shù)據(jù)庫連接等等,都是需要服務器上的權(quán)限才能進行操作。
??固定服務器角色具有一組固定的權(quán)限,并且適用于整個服務器范圍。 它們專門用于管理 SQL Server,且不能更改分配給它們的權(quán)限。 可以在數(shù)據(jù)庫中不存在用戶帳戶的情況下向固定服務器角色分配登錄。
??服務器級別的對象,只能包含登錄名。定義了服務器角色,你定義的登陸用戶就有了相應的執(zhí)行權(quán)限。先來看一下服務器級別的固定角色:

服務器角色 含義
sysadmin 可以在服務器上執(zhí)行任何活動
serveradmin 可以更改服務器范圍的配置選項和關(guān)閉服務器
securityadmin 管理和審核登錄用戶。具有 GRANT、DENY 和 REVOKE 服務器和數(shù)據(jù)庫級別的權(quán)限。此外,還可以重置 SQL Server 登錄名的密碼
processadmin 管理SQL Server運行的進程
setupadmin 可以使用 T-SQL 語句添加和刪除連接服務器,并可以執(zhí)行某些系統(tǒng)存儲過程(如 sp_serveroption)
bulkadmin 可以運行 BULK INSERT 語句
diskadmin 用于管理磁盤文件
dbcreator 可以創(chuàng)建、更改、刪除和還原任何數(shù)據(jù)庫
public public角色不同于其它角色在于其權(quán)限可以被修改,每個 SQL Server 登錄名都屬于 public 服務器角色。無法將用戶、角色或組指派給它,因為默認情況下它屬于該角色,且public不能被刪除

(2)數(shù)據(jù)庫級別的角色

數(shù)據(jù)庫級角色的權(quán)限作用域為數(shù)據(jù)庫范圍。例如可以訪問哪個數(shù)據(jù)庫,可以訪問哪個數(shù)據(jù)庫中的哪些數(shù)據(jù)表、哪些視圖、哪些存儲過程等等,都需要數(shù)據(jù)庫上的權(quán)限才能進行操作。
??SQL Server存在兩種類型的數(shù)據(jù)庫級角色:數(shù)據(jù)庫中預定義的“固定數(shù)據(jù)庫角色”和可以創(chuàng)建的“用戶定義的數(shù)據(jù)庫角色”。
??固定數(shù)據(jù)庫角色是SQL Server預定義的數(shù)據(jù)庫角色,具有數(shù)據(jù)庫級別的管理權(quán)限,并且存在于每個數(shù)據(jù)庫中。db_owner 數(shù)據(jù)庫角色的成員可以管理固定數(shù)據(jù)庫角色成員身份。自定義數(shù)據(jù)庫角色是當固定數(shù)據(jù)庫角色不能滿足要求時,可以自定義數(shù)據(jù)庫角色。
??
數(shù)據(jù)庫級別的對象,只能包含數(shù)據(jù)庫用戶名。
先來看一下數(shù)據(jù)庫級別的固定角色:

數(shù)據(jù)庫角色 含義
db_owner 可以執(zhí)行數(shù)據(jù)庫中技術(shù)所有動作的用戶,執(zhí)行所有的配置活動和維護活動
db_securityadmin 管理數(shù)據(jù)庫安全,可以修改角色成員身份和管理權(quán)限。向此角色中添加主體可能會導致意外的權(quán)限升級
db_accessadmin 可以為 Windows 登錄名、Windows 組和 SQL Server 登錄名添加或刪除數(shù)據(jù)庫訪問權(quán)限
db_backupoperator 可以備份數(shù)據(jù)庫
db_ddladmin 可以在數(shù)據(jù)庫中運行任何數(shù)據(jù)定義語言 (DDL) 命令
db_datawriter 可以在所有用戶表中添加、刪除或更改數(shù)據(jù)
db_datareader 可以從所有用戶表中讀取所有數(shù)據(jù)
db_denydatawriter 不能添加、修改或刪除數(shù)據(jù)庫內(nèi)用戶表中的任何數(shù)據(jù)
db_denydatareader 不能讀取數(shù)據(jù)庫內(nèi)用戶表中的任何數(shù)據(jù)
public public角色不同于其它角色在于其權(quán)限可以被修改,每個數(shù)據(jù)庫用戶、角色或組都屬于public數(shù)據(jù)庫角色。無法將用戶、角色或組指派給它,因為默認情況下它屬于該角色,且public不能被刪除

登錄賬號和數(shù)據(jù)庫用戶

SQL Server的服務器和數(shù)據(jù)庫是兩個層次的概念,SQL Server的用戶也分為兩種,一種是服務器登陸賬號,另一種是數(shù)據(jù)庫用戶。
??一個人要操作SQL Server數(shù)據(jù)庫,首先要為其創(chuàng)建服務器登陸賬號,使得他可以登錄到服務器上,然后還要在要操作的數(shù)據(jù)庫上創(chuàng)建和這個登陸賬號對應的數(shù)據(jù)庫用戶。
??可以給登陸賬號賦予相應權(quán)限,使得這個賬號可以執(zhí)行指定的管理服務器的任務。也可以給數(shù)據(jù)庫用戶賦予相應權(quán)限,使得這個數(shù)據(jù)庫用戶可以在這個數(shù)據(jù)庫中執(zhí)行指定的操作。
??服務器登陸賬號分為為Windows驗證及SQL Server驗證兩種。

  • Windows身份驗證模式:把Windows的操作系統(tǒng)用戶添加為SQL Server服務器登陸賬號,SQL Server并不參與驗證。SQL Server完全相信Windows的驗證結(jié)果,所以用此方式登錄SQL Server時并不需要提供密碼。
  • SQL Server和Windows身份驗證模式:這種模式即允許由Windows來驗證主體身份,又允許SQL Server來驗證主體身份,當由SQL Server驗證主體身份時,需要用戶名和密碼來確認主體身份,和使用什么Windows賬戶半毛錢關(guān)系都沒有,是在服務器上創(chuàng)建的另外一種獨立賬號。

登錄名
??登錄名是服務器級別的主體,但無論是上述哪個層級的主體,因為需要登錄到SQL Server實例,所以每一個層級的主體都需要一個與之對應的登錄名。對于Windows級別的主體來說,Windows用戶會映射到登錄名。對于數(shù)據(jù)庫級別的主體來說,其用戶必須映射到登錄名中。而登錄名可以不映射到數(shù)據(jù)庫用戶,如圖所示登錄名的映射關(guān)系:


??在圖中實例層級的登錄名中,我們看到除了自定義添加的用戶之外,還有一些由系統(tǒng)添加的登錄名。

  • 以”##”開頭和結(jié)尾的用戶是SQL Server內(nèi)部使用的賬戶,由證書創(chuàng)建,僅供內(nèi)部系統(tǒng)使用,不應該被刪除。
  • sa 登錄名是服務器級的主體。 默認情況下,該登錄名是在安裝實例時創(chuàng)建的。從 SQL Server 2005 開始,sa 的默認數(shù)據(jù)庫為“master”。 sa賬戶可以認為是超級管理員用戶,擁有一切特權(quán),可以在SQL Server中為所欲為,并且不能夠被刪除。因此sa作為分配權(quán)限的起點(也就是SA賬戶在最開始時給予了其他主體對于安全對象的權(quán)限)。因此對于Sa的密碼要設置的盡可能復雜,否則Sa登錄名被盜取后果不堪設想。
  • NT AUTHORITY\NETWORK SERVICE和NT AUTHORITY\SYSTEM賬戶是和啟動SQL Server這個Windows服務的賬戶有關(guān),如果使用本地登錄賬戶或是網(wǎng)絡賬戶啟動SQL Server服務,請不要刪除這兩個賬戶。
  • BUILDIN\Administrator賬戶是與本地管理員組關(guān)聯(lián)的登錄名,默認屬于sysadmin角色。這個賬戶使得任何屬于本地管理員的賬戶都可以獲得對SQL Server的完全控制權(quán)。

數(shù)據(jù)庫用戶
??數(shù)據(jù)庫用戶是數(shù)據(jù)庫級別的主體,被用于訪問數(shù)據(jù)庫層面的對象。每一個數(shù)據(jù)庫用戶都必須要一個與之對用的登錄名。數(shù)據(jù)庫用戶的信息存在數(shù)據(jù)庫中,而登錄名存在實例級別的Master數(shù)據(jù)庫中(但SQL SERVER2012的Contained Database允許將登錄名也存在數(shù)據(jù)庫級別)。通常來說,數(shù)據(jù)庫層級的用戶可以和映射的登錄名不一致,但由于這種做法會引起混淆,因此并不推薦,如下圖所示。


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

  • dbo用戶:dbo用戶是Database Owner的簡稱,如果說SA是實例級別的老大,那DBO就是數(shù)據(jù)庫級別的老大,是數(shù)據(jù)庫的擁有者。這個用戶也同樣不能被刪除,登錄名sa自動映射為數(shù)據(jù)庫用戶dbo。每一個表創(chuàng)建時如果沒有指定Schema,則默認在dbo這個schema下。
  • guest 用戶:guest用戶是一個來賓賬戶,這個賬戶允許登錄名沒有映射到數(shù)據(jù)庫用戶的情況下訪問數(shù)據(jù)庫。默認情況下guest用戶是不啟用的,但不能刪除??赏ㄟ^撤消該用戶的 CONNECT 權(quán)限將其禁用。
--允許guest用戶連接權(quán)限
GRANT CONNECT TO guest
--收回guest的連接權(quán)限
REVOKE CONNECT TO guest
  • INFORMATION_SCHEMA 和 sys:它們都作為用戶出現(xiàn)在目錄視圖中。 這兩個實體是 SQL Server 所必需的。 它們不是主體,不能修改或刪除它們。


安全對象

安全對象是SQL Server數(shù)據(jù)庫引擎授權(quán)系統(tǒng)控制對其訪問的資源。安全對象分別屬于3個層次:服務器、數(shù)據(jù)庫、架構(gòu)。
??不同的范圍包含不同的安全對象,詳見下圖。


安全對象

架構(gòu)(schema)及其管理

在SQL Server 2000中的構(gòu)架是和用戶綁定的,比如我新建用戶Jack,SQL Server自動分配一個叫Jack構(gòu)架,用戶Jack并不能改變這個選項,而由Jack所建的任何對象都在Jack之下。比如新建一個表,則為Jack.Table1。當Jack如果離職時,這對管理來說簡直是一場噩夢。
??從SQL Server2005開始,數(shù)據(jù)庫用戶不再等同于架構(gòu),允許用戶和構(gòu)架分離。而在Oracle中,用戶與模式還是等同的(在Oracle中,schema一般翻譯為模式)。所以以往 SQL Server 內(nèi)的對象命名是“服務器.數(shù)據(jù)庫.用戶名.對象”,但如今的對象命名改為“服務器.數(shù)據(jù)庫.Schema.對象”
??架構(gòu)是與創(chuàng)建它的數(shù)據(jù)庫用戶無關(guān)的命名空間,也可以說,架構(gòu)是數(shù)據(jù)庫對象的容器,獨立于創(chuàng)建它們的數(shù)據(jù)庫用戶而存在。架構(gòu)有一下特點:

  • 多個數(shù)據(jù)庫用戶可以共享一個默認的架構(gòu);
  • 單個架構(gòu)可以包含多個數(shù)據(jù)庫用戶擁有的對象;
  • 架構(gòu)的所有權(quán)和架構(gòu)內(nèi)的安全對象可以轉(zhuǎn)移;
  • 對象可以在不同的架構(gòu)之間移動;
  • 可以刪除數(shù)據(jù)庫用戶,而不刪除相應架構(gòu)中的對象。

架構(gòu)所有者和權(quán)限
??通過用戶架構(gòu)分離,可實現(xiàn)管理數(shù)據(jù)庫對象權(quán)限的更大靈活性。,因為對象不再綁定到用戶賬號上,所以你根本不用擔心當一個賬號被刪除時需要變換對象的擁有者。
??默認情況下,當開發(fā)人員創(chuàng)建了一個對象時,該對象并不屬于開發(fā)人員而屬于一個數(shù)據(jù)庫架構(gòu)。
??任何數(shù)據(jù)庫主體都可以擁有架構(gòu),并且一個主體可擁有多個架構(gòu)。每個架構(gòu)都有其所有者,但是所有者和架構(gòu)名是不綁定的。所以當一個用戶擁有一個架構(gòu),并且這個用戶必須從數(shù)據(jù)庫中刪除時,可以不用破壞任何代碼而僅僅是將架構(gòu)的所有者變一下。
??可以對架構(gòu)應用安全規(guī)則,安全規(guī)則將由架構(gòu)中的所有對象繼承。 如果設置了對架構(gòu)的訪問權(quán)限,則當新對象添加到架構(gòu)時,新對象會自動應用這些權(quán)限。注意:用戶不從架構(gòu)繼承權(quán)限,架構(gòu)權(quán)限由架構(gòu)中包含的數(shù)據(jù)庫對象繼承。

內(nèi)置架構(gòu)
??SQL Server創(chuàng)建了十個預定義的架構(gòu),它們與內(nèi)置數(shù)據(jù)庫用戶和角色具有相同的名稱。這些架構(gòu)主要用于向后兼容性。如果您不需要與固定數(shù)據(jù)庫角色具有相同名稱的架構(gòu),則可以刪除它們。您不能刪除下列架構(gòu):

  • dbo:dbo 是新創(chuàng)建的數(shù)據(jù)庫的默認架構(gòu)。 dbo 架構(gòu)由 dbo 用戶帳戶擁有。 默認情況下,使用 CREATE USER命令創(chuàng)建的用戶的默認架構(gòu)為 dbo,但是分配了 dbo 架構(gòu)的用戶不繼承 dbo 用戶帳戶的權(quán)限。
  • guest
  • sys:為系統(tǒng)對象而保留的。
  • INFORMATION_SCHEMA:為系統(tǒng)對象而保留的。
    如果從模型數(shù)據(jù)庫中刪除這些架構(gòu),它們將不會顯示在新數(shù)據(jù)庫中。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容