
SQL Server 文档中提到关于安全性的最佳实践如下:
“请考虑从 sysadmin 角色中删除 DBA 帐户,并向 DBA 帐户授予 CONTROL SERVER,而不是使其成为 sysadmin 角色的成员。系统管理员角色不接受 DENY,而 CONTROL SERVER 接受。”
SQL Server 2005 开始,Microsoft 引入了CONTROL SERVER 权限,官方建议使用 CONTROL SERVER 权限来替代固定服务器角色sysadmin。相信多数DBA分配管理员账号权限时,使用的是服务器角色sysadmin。但你知道 CONTROL SERVER 也拥有管理员权限吗?
我们先看看这两者的授权方式,右键指定的登录账号可对其进行授权,如下图。

或者使用 T-SQL 脚本授权,如下代码eeon]
--授权服务器角色权限 sysadminALTER SERVER ROLE sysadmin ADD MEMBER jeesonGO--授权服务器权限 CONTROL SERVERGRANT CONTROL SERVER TO jeesonGO
现在我们可以通过系统存储过程,看看服务器角色sysadmin的详细权限。
EXEC sp_srvrolepermission @srvrolename = 'sysadmin'

可以看到,sysadmin 有121项权限,可以说包含了实例的所有权限。
CONTROL SERVER 与 sysadmin 两者之间有什么区别呢?
CONTROL SERVER 与 sysadmin 拥有大多数相同的权限,其中部分差异如下表格。
| 差异权限 | CONTROL SERVER | sysadmin |
| 实例级别deny权限 | Y | N |
| 默认schema | N | Y |
| 固定服务器角色添加成员 | N | Y |
| DBCC | N | Y |
| 配置数据库邮件 | N | Y |
| 查看SQL Server 日志 | N | Y |
| 管理SQL Server 代理 | N | Y |
| 创建链接服务器 | N | Y |
通过以上表格对比发现,CONTROL SERVER 在涉及到实例以外的操作是被禁止的,当然使用 sp_configure 中的命令是可以的。
在各云厂商中,客户是可以申请最高权限账号的,使用的是服务器角色 sysadmin 。相比安全而言,云厂商其实可以使用 CONTROL SERVER 权限的账号给客户作为其最佳实践。此外,很多企业对 SQL Server 账号进行审计的时候,只考虑 sysadmin 权限,很容易忽略 CONTROL SERVER 权限。我们可以使用以下脚本查账号是否拥有管理员权限。
SELECT DISTINCT p.name AS [loginname] ,p.type_desc ,p.is_disabled,s.sysadmin,case when sp.permission_name = 'CONTROL SERVER' then 1 else 0 end as contral_server,p.create_date,p.modify_dateFROM sys.server_principals pJOIN sys.syslogins s ON p.sid = s.sidJOIN sys.server_permissions sp ON p.principal_id = sp.grantee_principal_idWHERE p.type_desc IN ('SQL_LOGIN', 'WINDOWS_LOGIN', 'WINDOWS_GROUP')AND (s.sysadmin = 1 OR sp.permission_name = 'CONTROL SERVER')ORDER BY p.nameGO
最近文章推荐:
历史文章推荐:





