SQL Server 2008共有26個服務器級權限,分別爲
-
ADMINISTER BULK OPERATIONS
-
ALTER ANY CONNECTION
-
ALTER ANY CREDENTIAL
-
CREATE ANY DATABASE
-
ALTER ANY DATABASE
-
VIEW ANY DATABASE
-
CREATE ENDPOINT
-
ALTER ANY ENDPOINT
-
CREATE DDL EVENT NOTIFICATION
-
CREATE TRACE EVENT NOTIFICATION
-
ALTER ANY EVENT NOTIFICATION
-
ALTER ANY LINKED SERVER
-
ALTER ANY LOGIN
-
ALTER ANY SERVER AUDIT
-
ALTER RES
-
ALTER TRACE
-
AUTHENTICATE SERVER
-
CONNECT SQL
-
CONTROL SERVER
-
EXTERNAL ACCESS ASSEMBLY
-
SHUTDOWN
-
UNSAFE ASSEMBLY
-
VIEW ANY DEFINITION
-
VIEW SERVER STATE
-
OURCES
-
ALTER SERVER STATE
-
ALTER SETTINGS
SQL Server 2016 中比 2008 多出瞭如下8個服務級權限
-
CREATE AVAILABILITY GROUP --SQL Server 2012
-
ALTER ANY AVAILABILITY GROUP --SQL Server 2012
-
ALTER ANY EVENT SESSION
-
CREATE SERVER ROLE --SQL Server 2012
-
ALTER ANY SERVER ROLE --SQL Server 2012
-
CONNECT ANY DATABASE --SQL Server 2014
-
IMPERSONATE ANY LOGIN --SQL Server 2014
-
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》 中的過程查看登陸賬戶的權限。