在我们的其中一台生产服务器中,我们需要启用xp_cmdshell
某些应用程序功能。
使用我们当前的安全措施,它在所有情况下都被禁用,只需要为一个特定的 SQL Server 启用。
xp_cmdshell
?我们的应用程序团队创建了一个触发器,可以启动另一个发票流程,他们需要这样做xp_cmdshell
。
根据Microsoft Docs for xp_cmdshell
:
xp_cmdshell 代理帐号
当它由不是 sysadmin 固定服务器角色成员的用户调用时,xp_cmdshell 将使用存储在名为 ##xp_cmdshell_proxy_account## 的凭据中的帐户名和密码连接到 Windows。如果此代理凭据不存在,xp_cmdshell 将失败。
因此,如果您尝试以xp_cmdshell
非 sysadmin 用户身份执行,假设您尚未配置代理帐户,它将失败。这意味着只有系统管理员才能运行它。你信任你的系统管理员吗?
一旦xp_cmdshell
被启用,它产生的外壳具有同样的安全性用于运行SQL Server本身(或代理帐户,如果配置)的帐户。如果该帐户在本地计算机上具有完全权限,则由xp_cmdshell
所创建的外壳将在本地计算机上具有完全权限。如果 SQL Server 服务帐户是域管理员(我永远不会建议),情况也是如此。遵循最小权限原则应该意味着 SQL Server 拥有运行所需的最低权限,并且xp_cmdshell
将拥有相同的一组权限。
如果配置xp_cmdshell
为使用代理帐户,然后由它衍生出的外壳将有权利即帐户,它可以被锁定。但是,任何系统管理员都可以修改代理帐户设置,因此确保限制谁拥有系统管理员权限非常重要。
您已经提到您的应用程序团队想要xp_cmdshell
在触发器中使用。这将真正限制您系统的性能,您真的应该重新考虑该设计。例如,如果xp_cmdshell
返回错误,则插入表将失败。如果调用xp_cmdshell
需要几秒钟才能完成,则在此期间受插入影响的行将被锁定,并可能导致其他会话被阻塞。
正如@DanGuzman指出的那样,您应该改为使用服务代理队列来提供异步有保证的消息传递机制,该机制不会中断将行插入受影响的表。Service Broker 队列可由 SQL Server 外部的应用程序以响应迅速、可靠且可扩展的方式使用。
归档时间: |
|
查看次数: |
4333 次 |
最近记录: |