【转】理解SQL Server的安全对象和权限
理解安全對象(Securable)
??? 安全對象,是SQL Server 數據庫引擎授權系統控制對其進行訪問的資源。通俗點說,就是在SQL Server權限體系下控制的對象,因為所有的對象(從服務器,到表,到視圖觸發器等)都在SQL Server的權限體系控制之下,所以在SQL Server中的任何對象都可以被稱為安全對象。
??? 和主體一樣,安全對象之間也是有層級,對父層級上的安全對象應用的權限會被其子層級的安全對象所繼承。SQL Server中將安全對象分為三個層次,分別為:
-
??? 服務器層級
-
??? 數據庫層級
-
??? 構架層級
??? 這三個層級是從上到下包含的,如圖1所示:
? ??
?
??? 對于SQL Server對于層級的詳細劃分,可以參看MSDN。SQL Server中全部的安全對象如圖2和圖3所示。
? ??
? ??
? ??
?
理解權限(Permission)
??? 權限是連接主體和安全對象的紐帶。SQL Server 2008中,權限分為權利與限制,分別對應GRANT語句和DENY語句。GRANT表示允許主體對于安全對象做某些操作,DENY表示不允許主體對某些安全對象做某些操作。還有一個REVOKE語句用于收回先前對主體GRANT或DENY的權限。
??? 在設置權限時,尤其要注意權限在安全對象上的繼承關系。對于父安全對象上設置的權限,會被自動繼承到子安全對象上。主體和安全對象的層級關系如圖4所示。
???
??? 比如,我給予主體CareySon(登錄名)對于安全對象CareySon-PC(服務器)的Select(權限),那么CareySon這個主體自動擁有CareySon-PC服務器下所有的數據庫中表和視圖等子安全對象的SELECT權限。如圖5所示。
??? 此時,主體CareySon可以看到所有數據庫極其子安全對象,如圖6所示
? ??
?
使用T-SQL語句進行權限控制
??? 在理解了主體,安全對象和權限的概念之后,使用T-SQL語句進行權限控制就非常簡單了。使用GRANT語句進行授予權限,使用DENY語句限制權限,使用REVOKE語句收回之前對于權限的授予或者限制。
??? GRANT在MSDN的原型為:
| 1 2 3 4 | GRANT?{?ALL?[?PRIVILEGES?]?} ??????|?permission?[?(?column?[?,...n?]?)?]?[?,...n?] ??????[?ON?[?class?::?]?securable?]?TO?principal?[?,...n?]? ??????[?WITH?GRANT?OPTION?]?[?AS?principal?] |
??? 對于GRANT語句的理解就像造句一樣 GRANT 某種權限 ON 安全對象類型::安全對象 TO 主體。如果指定了WITH GRANT OPTION,則被授予權限的主體可以授予別的主體同樣的權限。
?
??? 對于DENY語句在MSDN中的原型和GRANT大同小異:
| 1 2 3 4 | DENY?{?ALL?[?PRIVILEGES?]?} ??????|?permission?[?(?column?[?,...n?]?)?]?[?,...n?] ??????[?ON?[?class?::?]?securable?]?TO?principal?[?,...n?]? ??????[?CASCADE]?[?AS?principal?] |
??? 值得注意的是CASCADE選項表示拒絕主體對于安全對象的訪問權限同時決絕主體授予其他主體對于安全對象的權限。
???? 而REVOKE語句用于收回原來授予或拒絕某個主體對于安全對象的權限。REVOKE在MSDN中的原型如下:
| 1 2 3 4 5 6 7 8 9 | REVOKE?[?GRANT?OPTION?FOR?] ??????{? ????????[?ALL?[?PRIVILEGES?]?] ????????| ????????????????permission?[?(?column?[?,...n?]?)?]?[?,...n?] ??????} ??????[?ON?[?class?::?]?securable?]? ??????{?TO?|?FROM?}?principal?[?,...n?]? ??????[?CASCADE]?[?AS?principal?] |
?? 一個進行權限控制的例子如下:
| 1 2 3 4 5 6 7 | grant?select--權限 ?ON?Schema::SalesLT--類型::安全對象 ??to?careyson--主體deny?select--權限 ?ON?Schema::SalesLT--類型::安全對象 ??to?careyson--主體revoke?select--權限 ?ON?Schema::SalesLT--類型::安全對象 ??to?careyson--主體 |
?
??? 控制權限的時候需要注意如下幾點:
-
??? GRANT會移除主體作用于安全對象上的DENY和REVOKE
-
??? DENY和REVOKE移出主體作用于安全對象上的GRANT
-
??? REVOKE會移除主體作用于安全對象上的DENY和GRANT
-
??? 在高層級上的DENY會覆蓋任何子層級的GRANT。比如說,你對于Schema進行Deny,對其包含的表進行Grant,則表的GRANT會被Schema的Deny鎖覆蓋,如圖7所示。
???
?
-
??? 對于主體作用于高層級的GRANT會被其子Deny所覆蓋,還是上面的例子,我對于Schema進行Grant,對于表進行Deny,最后結果還是Deny,如圖8所示。
? ??
?
-
??? SQL Server不對sysadmin組的成員做任何權限驗證操作。換句話說,sysadmin組的成員可以為所欲為
?
??? 而對于何種的安全對象可以進行何種對應權限的GRANT,REVOKE,DENY,請參看MSDN。
?
總結
??? 本文接著上篇文章講述了安全對象以及相應的權限。對于權限控制時,理解權限的繼承和權限的覆蓋會在設置權限時減少很多問題。
作者:FFIVE
鏈接:https://www.imooc.com/article/28697
來源:慕課網
總結
以上是生活随笔為你收集整理的【转】理解SQL Server的安全对象和权限的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我国对外直接投资连续7年超千亿美元,这些
- 下一篇: C#多线程