我们有仍然使用 xp_cmdshell 调用的遗留代码。当我们迁移到 SQL Server 2008 时,我们创建了一个使用以下模式代码的存储过程:
EXECUTE AS 'DOMAIN\ID2'
EXEC master..xp_cmdshell @command
REVERT
Run Code Online (Sandbox Code Playgroud)
当我将 WHOAMI 作为命令传递时,它显示的不是“DOMAIN\ID2”,而是运行 SQL Server 的服务帐户的 ID(即“DOMAIN\ID1”)。它不应该返回 'DOMAIN\ID2',因为它应该在不同的安全上下文下运行吗?如果是这样,知道为什么它不会改变上下文吗?这个过程是由另一个现在早已不复存在的开发人员创建的,我对安全性和模拟并不像我应该的那样熟悉。
找到一种允许您在不知道密码的情况下模拟 Windows 用户的工具不是很好吗?每个实习生都可以冒充首席财务官从银行提取数百万美元……可能性!
不,EXECUTE AS是专门针对访问 SQL Server 对象(表、过程等)更改安全上下文。决不会(甚至不能)更改进程或 SQL Server 启动的进程的真实 NT 执行上下文。
更新
我显然忘了补充信息的实际有用的部分:有是一种方法,使xp_cmdshell使用特定的凭证,只要你做创建这样一个凭证在SQL Server中:
create credential [##xp_cmdshell_proxy_account##]
with identity = 'DOMAIN\ID2',
secret = '<ID2 password>';
Run Code Online (Sandbox Code Playgroud)
关键区别在于您在此处非常明确地将密码提供给 SQL Server。现在,SQL Server 将在遇到xp_cmdshell从 SQL 登录上下文或从 EXECUTE AS 上下文调用时使用此凭据“代理” 。
您还可以将凭据与登录名关联,以便对 SQL Server 外部的资源进行“通用”访问(例如,访问网络共享):
凭据是包含连接到 SQL Server 外部资源所需的身份验证信息的记录。大多数凭据包括 Windows 用户和密码。