SQL Server服務器級權限

SQL Server 2008共有26個服務器級權限,分別爲

  1. ADMINISTER BULK OPERATIONS

  2. ALTER ANY CONNECTION

  3. ALTER ANY CREDENTIAL

  4. CREATE ANY DATABASE

  5. ALTER ANY DATABASE

  6. VIEW ANY DATABASE

  7. CREATE ENDPOINT

  8. ALTER ANY ENDPOINT

  9. CREATE DDL EVENT NOTIFICATION

  10. CREATE TRACE EVENT NOTIFICATION

  11. ALTER ANY EVENT NOTIFICATION

  12. ALTER ANY LINKED SERVER

  13. ALTER ANY LOGIN

  14. ALTER ANY SERVER AUDIT

  15. ALTER RES

  16. ALTER TRACE

  17. AUTHENTICATE SERVER

  18. CONNECT SQL

  19. CONTROL SERVER

  20. EXTERNAL ACCESS ASSEMBLY

  21. SHUTDOWN

  22. UNSAFE ASSEMBLY

  23. VIEW ANY DEFINITION

  24. VIEW SERVER STATE

  25. OURCES

  26. ALTER SERVER STATE

  27. ALTER SETTINGS

SQL Server 2016 中比 2008 多出瞭如下8個服務級權限

  1. CREATE AVAILABILITY GROUP     --SQL Server 2012

  2. ALTER ANY AVAILABILITY GROUP    --SQL Server 2012

  3. ALTER ANY EVENT SESSION

  4. CREATE SERVER ROLE         --SQL Server 2012

  5. ALTER ANY SERVER ROLE       --SQL Server 2012

  6. CONNECT ANY DATABASE        --SQL Server 2014

  7. IMPERSONATE ANY LOGIN       --SQL Server 2014

  8. SELECT ALL USER SECURABLES    --SQL Server 2014

可以通過系統函數sys.fn_builtin_permissions('SERVER') 查看實例的服務器級權限:

SELECT * FROM sys.fn_builtin_permissions('SERVER')
ORDER BY permission_name;

可以通過grant、revoke/deny賦予、收回或拒絕登陸賬戶服務器級權限,如:

use [master]
GO
--賦予登陸賬戶loginName查看服務狀態權限
GRANT VIEW SERVER STATE TO [loginName]
--收回登陸賬戶loginName查看服務狀態權限
REVOKE VIEW SERVER STATE FROM [loginName]
--拒絕登陸賬戶loginName 查看服務狀態
DENY VIEW SERVER STATE TO [loginName]

賦予登錄名或服務器角色權限時,如果增加選項 WITH GRANT OPTION,則登錄名具有給其他登陸名賦予該權限的權限,如:

GRANT VIEW ANY DATABASE TO loginName WITH GRANT OPTION;

腳本意爲登陸名loginName,授予查看任意數據庫的權限,同時loginName也可以授予其他登陸名查看任意數據庫的權限。

SQL Server 服務器級角色

 

角色可以看做有一定權限的集合,SQL Server 有8個固定服務器角色,包括:

  • bulkadmin:OPENROWSET操作權限

  • dbcreator:可以創建、更改、刪除和還原任何數據庫

    • ALTER ANY DATABASE

      • CREATE ANY DATABASE

  • diskadmin:用於管理磁盤文件

  • processadmin:是kill 連接,更改服務器狀態的組合

    • ALTER ANY CONNECTION

    • ALTER SERVER STATE

      • VIEW SERVER STATE

  • securityadmin:登錄名創建、修改、刪除,sp_addlinkedsrvlogin等權限

    • ALTER ANY LOGIN

  • serveradmin:可以更改服務器範圍的配置選項(sp_configure、reconfigure)和關閉服務器(shutdown)

    • ALTER ANY ENDPOINT

    • ALTER RESOURCES

    • ALTER SERVER STATE

      • VIEW SERVER STATE

    • SHUTDOWN

  • setupadmin:sp_addlinkedser,創建鏈接服務器等權限

  • sysadmin:擁有實例上的所有權限

  • pubilc:所有登陸賬戶都是服務器角色public的成員,服務器角色public有許多授予系統對象的權限,這是管理內部操作所必需的。

    • VIEW ANY DATABASE

    • CONNECT ON ENDPOINT

    • ALTER ANY ENDPOINT

其中public較爲特殊,所有登陸賬戶均爲public角色成員,不能將登陸賬戶移除public角色成員。

 可以通過sp_addsrvrolemember 爲服務器角色增加成員,如:

EXEC sp_addsrvrolemember loginName,sysadmin

腳本意爲爲固定角色sysadmin增加成員loginName。

爲SQL Server登陸賬戶賦予SQL Server對象(主題)管理權限

在ssms中,右擊登陸名,單擊屬性,從安全對象→搜索→對象類型中,我們可以看到,服務器級安全對象有五個:

  • 端點

  • 登陸名

  • 服務器

  • 可用性組

  • 服務器角色

下面我們通過sys.fn_builtin_permissions來查看可以爲登陸名賦予的各服務器安全對象的權限。可以給以登陸名對服務器的操作權限,上文已經列出,下面我們看服務器對其他四個安全對象的權限。

可用性組

SELECT * FROM sys.fn_builtin_permissions('AVAILABILITY GROUP');

我們看到,可以爲登陸名授予對可用性組的操作權限有四個:

  • VIEW DEFINITION

  • ALTER

  • TAKE OWNERSHIP

  • CONTROL

端點

SELECT * FROM sys.fn_builtin_permissions('ENDPOINT');

我們看到,可以爲登陸名授予對端點的操作權限有五個:

  • CONNECT

  • VIEW DEFINITION

  • ALTER

  • TAKE OWNERSHIP

  • CONTROL

登錄名

SELECT * FROM sys.fn_builtin_permissions('LOGIN');
  • IMPERSONATE:模仿

  • VIEW DEFINITION:查看定義

  • ALTER:修改

  • CONTROL:控制

服務器角色

SELECT * FROM sys.fn_builtin_permissions('SERVER ROLE');
  • VIEW DEFINITION

  • ALTER

  • TAKE OWNERSHIP

  • CONTROL

現在我們給出爲登陸名賦予服務器級安全對象操作權限的樣例:

--授予登陸賬戶loginName 擁有可用性組myAg,且loginName具有授予其他SQL Server 登陸名TAKE OWNERSHIP 權限授予
USE master; 
GRANT TAKE OWNERSHIP ON AVAILABILITY GROUP::myAg TO loginName  
    WITH GRANT OPTION; 
GO 
--賦予登陸名loginName查看端點endpoint_mirroring的權限
USE master; 
GRANT VIEW DEFINITION ON ENDPOINT::endpoint_mirroring TO loginName; 
GO 
--賦予登陸名loginName 查看登陸名testGrant定義的權限
use [master]
GO
GRANT VIEW DEFINITION ON LOGIN::[testGrant] TO [loginName]
GO
--賦予登陸名loginName2 模仿loginName1 的權限,即loginName1有的權限,loginName2現在也有了
GRANT IMPERSONATE ON LOGIN::[loginName1] TO [loginName2];
--賦予登陸名loginName查看服務角色serverRoleName定義權限
use [master]
GO
GRANT VIEW DEFINITION ON SERVER ROLE::[serverRoleName] TO [loginName]
GO

實驗發現

grant alter on login::loginName1 to loginName2

爲loginName2賦予修改loginName1的權限,但loginName2並不能對loginName1作任何alter操作。從alter login官方網上說明文檔來看,alter login 需要alter any login權限,不知這是不是存在一個bug……

我們可以使用動態視圖sys.server_permissions 結合 sys.server_principals,以及相關的對象視圖查看登陸賬戶具有的權限,當然我們也可以直接使用《SQL Server 登陸賬戶權限克隆 ——sp_DBA_LoginClone V1.1》  中的過程查看登陸賬戶的權限。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章