.net - SQL Server 通过集成登录提升权限

标签 .net sql-server security permissions impersonation

我有一个在 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/

相关文章:

c# - 简单除法

.net - 使用System.Net.Dns类指定Nameserver

security - 将 jwt token 作为 url 的一部分传递是否不好?

c# - Mvc 5 中的 Aspx View

c# - 使用ParseExact解析DateTime,我缺少什么?

sql-server - 必须声明标量变量 "@??????"

sql - 从 MIN 日期获取 MAX 日期时间值

sql-server - 替换 SQL XML 中空节点的值

security - 在 Azure ACS 断言中添加自定义声明

php - 跨站点身份验证