理解SQL Server中的權限體系(上)----主體
簡介
權限兩個字,一個權力,一個限制。在軟件領域通俗的解釋就是哪些人可以對哪些資源做哪些操作。在SQL Server中,”哪些人”,“哪些資源”,”哪些操作”則分別對應SQL Server中的三個對象,分別為主體(Principals),安全對象(Securables)和權限(Permissions),而權力和限制則是對應了SQL Server中的GRENT和DENY。對于主體,安全對象和權限的初步理解,見圖1.
圖1.簡單理解主體,安全對象和權限的關系
對于圖1中的造句來說,并沒有主語,也就是并沒有說誰給予的權限(難道是上帝?)。你可以理解為SA賬戶在最開始時給予了其他主體對于安全對象的權限。
SQL Server中的驗證方式
在給予別人權限之前,或是檢查你是否有某項權限之前,SQL Server首先要知道“你”這個主體是否是你自己號稱的那個主體。比如武俠小說中接頭時對的暗號”天王蓋地虎,寶塔鎮河妖…”就是驗證身份的一種方式。而對于SQL Server,是在你連接SQL Server時SQL Server就需要確認你是誰。SQL Server提供了兩種身份驗證模式:
Windows身份驗證模式
Windows身份驗證模式就像其名稱所示那樣,由Windows來驗證主體,SQL Server并不參與驗證。SQL Server完全相信Windows的驗證結果。所以用此方式登錄SQL Server時并不需要提供密碼。雖然如此,但Windows身份驗證模式要更加安全,因為Windows身份驗證模式使用了Kerberos(這一名詞來源于希臘神話“三個頭的狗——地獄之門守護者”)協議。這也是微軟推薦的最安全的做法。
但Windows身份驗證模式在由域控制器控制網絡訪問的情況下才得以使用(當然了,單機也包括在內)。
SQL Server和Windows身份驗證模式(混合模式)
我一直覺得這種模式的名稱應該改為SQL Server或Windows身份驗證模式更容易理解。這種模式即允許由Windows來驗證主體身份,又允許SQL Server來驗證主體身份,當由SQL Server驗證主體身份時,需要用戶名和密碼來確認主體身份,和使用什么Windows賬戶半毛錢關系都沒有。這些用戶信息被加密后存在Master數據庫中。
設置驗證模式
設置驗證模式非常簡單。既可以在安裝的時候進行設置,也可以在安裝之后通過右鍵點擊實例,選擇屬性,在安全性選項卡中進行改變,如圖2所示。
圖2.安裝完SQL Server之后改變身份驗證方式
理解主體
“主體”是可以請求 SQL Server 資源的實體。主體可以是個體,組或者進程。主體可以按照作用范圍被分為三類:
- Windows級別主體
- 服務器級別主體
- 數據庫級別主體
Windows 級別的主體包括Windows 域登錄名和Windows 本地登錄名。
SQL Server級的主體包括SQL Server 登錄名和服務器角色。
數據庫級的主體包括數據庫用戶和數據庫角色以及應用程序角色。
登錄名
登錄名是服務器級別的主體,但無論是上述哪個層級的主體,因為需要登錄到SQL Server實例,所以每一個層級的主體都需要一個與之對應的登錄名。對于Windows級別的主體來說,Windows用戶會映射到登錄名。對于數據庫級別的主體來說,其用戶必須映射到登錄名中。而登錄名可以不映射到數據庫用戶,如圖3所示。
圖3.登錄名的映射關系
在圖3中實例層級的登錄名中,我們看到除了自定義添加的用戶之外,還有一些由系統添加的登錄名。首先,以”##”開頭和結尾的用戶是SQL Server內部使用的賬戶,由證書創建,不應該被刪除。其次是sa賬戶,sa登錄名擁有一切特權,可以在SQL Server中為所欲為,并且不能夠被刪除。因此sa作為分配權限的起點(也就是圖1中所說的主語).因此對于Sa的密碼要設置的盡可能復雜,否則Sa登錄名被盜取后果不堪設想。還有NT AUTHORITY\NETWORK SERVICE和NT AUTHORITY\SYSTEM賬戶是和啟動SQL Server這個Windows服務的賬戶有關,如果使用本地登錄賬戶或是網絡賬戶啟動SQL Server服務,請不要刪除這兩個賬戶,如圖4所示。
圖4.以本地系統賬戶啟動服務
最后BUILDIN\Administrator賬戶是與本地管理員組關聯的登錄名,默認屬于sysadmin角色。這個賬戶使得任何屬于本地管理員的賬戶都可以獲得對SQL Server的完全控制權。
數據庫用戶
數據庫用戶是數據庫級別的主體,被用于訪問數據庫層面的對象。每一個數據庫用戶都必須要一個與之對用的登錄名。數據庫用戶的信息存在數據庫中,而登錄名存在實例級別的Master數據庫中(但SQL SERVER2012的Contained Database允許將登錄名也存在數據庫級別)。通常來說,數據庫層級的用戶可以和映射的登錄名不一致,但由于這種做法會引起混淆,因此并不推薦。如圖5所示。
圖5.可以讓用戶名和登錄名不一致,但并不推薦
默認情況下,每個數據庫都帶有4個內置用戶,如圖6所示。
圖6.數據庫帶的內置用戶
dbo用戶是Database Owner的簡稱,如果說SA是實例級別的老大,那DBO就是數據庫級別的老大。這個用戶也同樣不能被刪除,每一個屬于sysadmin的服務器角色都會映射到數據庫的dbo用戶。每一個表創建時如果沒有指定Schema,則默認在dbo這個schema下。
guest用戶是一個來賓賬戶,這個賬戶允許登錄名沒有映射到數據庫用戶的情況下訪問數據庫。默認情況下guest用戶是不啟用的,你可以通過代碼1來啟用或不啟用guest用戶。
--允許guest用戶連接權限 GRANT CONNECT TO guest --收回guest的連接權限 REVOKE CONNECT TO guest
代碼1.啟用或回收guest用戶的連接權限
你也可以給guest用戶分配角色來控制guest的權限(如圖7所示),但是這有可能造成潛在的安全問題,最佳做法是單獨創建數據庫用戶。
圖7.為guest用戶分配角色
而INFORMATION_SCHEMA用戶和sys用戶擁有系統視圖,因此這兩個數據庫用戶不能被刪除,如圖8所示。
圖8.INFORMATION_SCHEMA和sys用于訪問系統視圖
角色
角色是方便對主體進行管理的一種舉措。SQL Server中的角色和Windows中的用戶組是一個概念。屬于某個角色的用戶或登錄名就會擁有相應的權限,這不難理解,就好比你在公司當經理,你就可以報銷多少錢的手機費用。而比你低一個層級的開發人員則沒有這個待遇。用戶或登錄名可以屬于多個角色,這也同樣不難理解,就像你在公司中可以是項目經理,也同時兼任高級工程師一樣。
角色在SQL Server中被分為三類,分別為:
內置角色----這類角色在服務器安裝時已經默認存在,其權限是固定的,并且不能被刪除
用戶自定義角色----這類角色由用戶按照需求自定義創建
應用程序角色----這類特殊角色用于管理應用程序的數據訪問
內置角色是在安裝SQL Server時就固定的,無論是服務器角色還是數據庫角色,其對應的權限都是固定的。具體每個角色對應的權限請查看MSDN(固定服務器角色http://msdn.microsoft.com/zh-cn/library/ms175892.aspx,固定數據庫角色http://msdn.microsoft.com/zh-cn/library/ms189121.aspx),但這里要注意一個特殊的角色: public角色。
public角色不同于其它角色,其權限可以被調整,如圖9所示。
圖9.Public角色不同于其它角色在于其權限可以被修改
可以將Public角色理解為訪問數據庫或實例的最小權限,Public所擁有的權限自動被任何主體繼承,所以對于Public角色的權限修改要格外小心。
而用戶自定義角色是按照用戶自己的需求組成的角色,由用戶創建。
而應用程序角色并不包含任何用戶,應用程序角色與其說是角色,不如說是一個特殊的用戶。這是為應用程序專門準備的角色,僅僅為應用程序提供數據庫訪問權限。這個角色并不提供給用戶,而是由應用程序的連接字符串嵌入角色名稱和密碼來激活對應權限。
圖10.不同于其它數據庫角色,應用程序角色需要設置密碼
理解構架
構架(Schmea)是在SQL Server 2005之后的版本被引入的。可以將構架理解為一個命名空間。在SQL Server2000中其實也有構架的概念,但概念并不同。因為SQL Server 2000中的構架是和用戶綁定的,比如我新建用戶Jack,SQL Server自動分配一個叫Jack構架,用戶Jack并不能改變這個選項,而由Jack所建的任何對象都在Jack之下,比如新建一個表,則為Jack.Table1。當Jack如果離職時,這對管理來說簡直是一場噩夢。
在SQL Server 2005之后,SQL Server允許用戶和構架分離。使得利用構架去擁有一些數據庫層級的對象,比如說:表,視圖等。
下面幾種選擇方式,比如當我默認構架是Sales,時,我可以用代碼2中第一種寫法,不用構架:
代碼2.引用對象的幾種不同寫法
因此,假如Customer表是由Jack建的,我可以將其分配給Sales構架,引用時使用Sales.Customer,而不是Jack.Customer。這無疑大大方便了管理,此外,可以針對構設置權限,這我會在本系列文章后續的文章中講到。
總結
本文簡單講述了SQL Server的權限體系。以及主體的概念。理解SQL Server的安全性要首先理解這三大方面。下一篇文章中我將接著講述安全對象。










浙公網安備 33010602011771號