我有一个在 IIS 中运行的应用程序,它使用 Windows 集成身份验证连接到 SQL Server 2008 R2 实例。该应用程序使用一组存储过程在数据库中执行简单的读/写操作。我可以很好地限制 SQL Server 中此登录名/用户组合的权限。
但是对于应用程序的一小部分,我需要在数据库中“提升”/更强大的权限...例如创建/删除事件通知以及可能的队列和代理服务。
所以基本上我有一个进程,其代码在连接到 SQL Server 的同一用户帐户下运行,并且我需要两组不同的权限...一组连接具有非常有限的权限,一组连接具有更强大的权限。
我想使用 Windows 集成身份验证...带有两个用户/密码组合的 sql 身份验证不是一个选项。
是否有推荐的方法来实现这一目标?
- 在应用程序代码中进行模拟,使用模拟上下文中的集成安全性连接到 SQL Server(不同的用户帐户/sql 登录)不喜欢它,因为我必须管理第二个登录名/密码
- SQL 服务器应用程序角色(我相信需要应用程序提供密码)- 不太喜欢它,因为我需要存储密码
- 两个用户的 SQL 身份验证 - 不是一个选项
- 为“提升的内容”创建专用存储过程并使用
执行为
(应该可以工作,但是不确定我是否可以在目标数据库中创建存储过程) - 复杂的想法:启动应用程序进程,连接到数据库,限制应用程序 token ,然后打开特权较低的连接(这可行吗?)
- 使用 COM+ ( a la Keith Brown's protocol transition )、WCF 服务或第二个进程来处理应用程序的“提升”部分(太复杂)
我想有一些我缺少的简单而简洁的解决方案......
最佳答案
使用代码签名。所有“提升”操作都是通过已签名的存储过程完成的,并且信任源自该过程的签名。这是非常有效和强大的,并且极其安全。例如,假设您需要一种方法(我不知道)创建一个绑定(bind)到 http://schemas.microsoft.com/SQL/Notifications/PostEventNotification
合约的队列和服务。所以你需要运行以下代码:
create queue myQueue;
create service myService on queue myQueue (
[http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);
此语句需要提升权限:EN 合约上的 CREATE QUEUE、CREATE SERVICE 和 REFERENCE。您可以将这些语句嵌入到过程中,签署该过程,从用于签署该过程的证书创建用户,然后向证书派生的用户授予必要的权限:
create procedure usp_createQueueAndService
with execute as caller
as
begin
create queue myQueue;
create service myService on queue myQueue (
[http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);
end
go
create certificate [certificateToSign_usp_createQueueAndService]
ENCRYPTION BY PASSWORD = 'Password#1234'
with subject = 'Code signing for usp_createQueueAndService';
go
ADD SIGNATURE TO OBJECT::[usp_createQueueAndService]
BY CERTIFICATE [certificateToSign_usp_createQueueAndService]
WITH PASSWORD = 'Password#1234';
go
ALTER CERTIFICATE [certificateToSign_usp_createQueueAndService]
REMOVE PRIVATE KEY;
GO
create user [certificateDerivedUser_usp_createQueueAndService]
from certificate [certificateToSign_usp_createQueueAndService];
go
grant create queue to [certificateDerivedUser_usp_createQueueAndService];
grant create service to [certificateDerivedUser_usp_createQueueAndService];
grant references on
contract::[http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]
to [certificateDerivedUser_usp_createQueueAndService];
go
这是 100% 防弹安全。所有已授予该过程 EXECUTE 权限的调用者现在都可以创建队列和服务,因为过程本身通过签名被授予了必要的权限。没有人可以修改该过程,因为更改该过程会丢失签名,从而失去特权。没有人可以滥用证书来签署另一个过程,因为私钥已被删除并永远丢失(不需要私钥来验证现有签名)。
此模型可以扩展到您需要的任何权限,包括服务器范围的权限(不过需要证书派生的登录名而不是用户,请参阅 Signing and Activated Procedure )。
当然,您可以让 usp_createQueueAndService 接受队列和服务名称作为参数,我将该部分留给读者作为简单的练习。如果您想使用事件通知,这种练习对您来说应该是微不足道的;)
关于.net - SQL Server 通过集成登录提升权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3190742/