1. 什么是委托权限
委托权限是指在 SQL Server 数据库中授权一个用户或者角色以执行特定操作的权限,以便它们能够完成预期的数据库操作。这种权限授信可以极大地简化操作,因为授权用户无需连接到特定的数据库,也无需在数据库服务器上掌握所有的权限。相反,用户可以使用委派权限,只将精力集中在其需要的任务上,从而提高系统的安全性和性能。
2. 如何委托权限
2.1. 开启服务
在 SQL Server 中启用委派权限之前,必须要先启用身份验证 ,Kerberos 协议以及双重身份验证
。要启用选项,请按照以下步骤进行操作:
EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'contained database authentication', 1;
GO
RECONFIGURE;
GO
在这里,我们打开先前隐藏的高级选项,然后配置“内部数据库身份验证”标志以允许数据库只能看到其自己的帐户和角色,而不是向导在创建 SQL Server 登录时所做的 server-level
身份验证。
2.2. 创建身份验证作为委派者
接下来,需要在 Active Directory 中创建 Windows 用户或组。无论用户还是组,都需要设置 SPN 以表示该用户或组授权委派另一个用户或组。使用以下命令配置 SPN:
SETSPN -A MSSQLSvc/[server_name]:[instance_name] [domain_name]\[user_name]
在这里,“服务器名称”和“实例名称”根据您的环境而异,并且“域名称”和“用户名”应该是您所创建 Windows 用户或组的值。
2.3. 设置委派权限的选项
在 Windows Active Directory 管理工具中,查找授信标识,并向其添加 SPN:将 AD 委托给用户与实施 SQL Server 角色分离控制之间的联系最为紧密 。
在 SQL Server 中,使用以下命令启用委托权限:
USE [master]
GO
SP_CONFIGURE 'show advanced options', 1
GO
RECONFIGURE WITH OVERRIDE
GO
SP_CONFIGURE 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE WITH OVERRIDE
GO
在这里,我们再次打开隐藏的高级选项 ,然后启用“允许 Ad-hoc Distributed Queries”标志,这将允许此实例首先设置“Ad-hoc Distribute Queries”标志,在 CREATE CREDENTIAL 命令中使用随机字符串(“password”),然后将该字符串插入到下一步中要用到的配置的“NTLM”字符串的值中。
2.4. 创建具有委派权限的登录凭据,并将其授予用户或角色
使用以下命令可以创建一个凭据,该凭据将作为委派权限提供凭据:
CREATE CREDENTIAL [DelegationUser]
WITH IDENTITY = 'domain\user',
SECRET = N'password';
其中,“ domain\user ”是您希望将权限委派的用户,在密码中,“ password” 是随机字符串。
要将委派权限授予已创建的用户或角色,请使用以下命令:
USE [master]
GO
GRANT IMPERSONATE ON LOGIN::[DelegationUser] TO [user or role];
GO
在这里,“用户或角色”取决于您要将委派权限授予给哪个实际用户或角色,同时“DelegationUser”是您先前创建的角色名称。
2.5. 启用 TCP/IP 端口
在 SQL Server 中,启用委派权限之前,必须使用 TCP/IP 协议启动数据库服务,而不是使用命名管道这样的本地连接。注意,这种方法只适用于 SQL Server 实例使用 TCP/IP 端口——如果使用默认的本地连接,则无法与 SQL Server 进行交互。
3. 委派权限注意事项及扩展
委派权限与所有其他类型的权限一样,需要谨慎使用。这是因为,委派权限的使用可能导致存在安全隐患,因此必须使用明智而且非常小心。
在为用户或角色授予委派权限时,应记录该用户或角色可以访问的数据和其他权限。此外,在使用委派权限之前,应进行非常详细和周全的安全评估,以确定需要限制哪些操作并设置相关的安全策略。
最后,建议使用 SQL Server 2016 及更高版本提供的新功能,以更好地保护数据库中的数据,并增强基于委派权限的安全性。例如,可以将数据库配置为使用 Always Encrypted 或者通过使用 Row-Level Security 功能来确保只有在满足特定条件的情况下才能查看或修改数据库中的数据。