在我们的生产服务器之一中,我们需要启用xp_cmdshell
某些应用程序功能。
使用我们当前的安全措施,它在所有情况下都被禁用,只需要为一个特定的 SQL Server 启用。
- 启用有多糟糕
xp_cmdshell
? - 这真的是一件值得担心的大事吗?
- 可以采取什么具体措施来启用它并仍然限制它的使用?
我们的应用程序团队创建了一个触发器,可以启动另一个发票流程,他们需要这样做xp_cmdshell
。
在我们的生产服务器之一中,我们需要启用xp_cmdshell
某些应用程序功能。
使用我们当前的安全措施,它在所有情况下都被禁用,只需要为一个特定的 SQL Server 启用。
xp_cmdshell
?我们的应用程序团队创建了一个触发器,可以启动另一个发票流程,他们需要这样做xp_cmdshell
。
根据Microsoft Docs:
xp_cmdshell
因此,如果您尝试以
xp_cmdshell
非系统管理员用户身份执行,假设您尚未配置代理帐户,它将失败。这意味着只有系统管理员可以运行它。你信任你的系统管理员吗?启用后,它
xp_cmdshell
生成的 shell 与用于运行 SQL Server 本身的帐户(或代理帐户,如果已配置)具有相同的安全性。如果该帐户在本地计算机上具有完全权限,则由创建的 shellxp_cmdshell
将在本地计算机上具有完全权限。如果 SQL Server 服务帐户是域管理员(我绝不会建议),也是一样。遵循最小权限原则应该意味着 SQL Server 具有运行所需的最低权限,并且xp_cmdshell
将拥有相同的权限集。如果您配置
xp_cmdshell
为使用代理帐户,则由它生成的 shell 将拥有该帐户的权限,可以锁定该帐户。但是,任何系统管理员都可以修改代理帐户设置,因此确保限制谁拥有系统管理员权限非常重要。您提到您的应用程序团队希望
xp_cmdshell
在触发器中使用。这将真正限制您系统的性能,您真的应该重新考虑该设计。例如,如果xp_cmdshell
返回错误,则插入到您的表中将失败。如果调用xp_cmdshell
需要几秒钟才能完成,则受插入影响的行将在此期间被锁定,并可能导致其他会话被阻塞。正如@DanGuzman指出的那样,您应该改为使用服务代理队列来提供异步保证消息传递机制,该机制不会中断将行插入受影响的表中。SQL Server 之外的应用程序可以以响应迅速、可靠且可扩展的方式使用 Service Broker 队列。