Sql-Server

我們能把使用 xp_cmdshell 的風險降到最低嗎?

  • February 8, 2022

使用xp_cmdshell可能很有幫助,有時可能是某些場景的唯一答案。我在網際網路上閱讀了一些文章,啟用xp_cmdshell可能會危及數據庫/伺服器的安全性。

我的問題是,我們能做些什麼來降低風險嗎?例如,我們是否可以設置一些限制/應用使用者角色等提供保障措施來降低風險?

謝謝。

好吧,您不能明確地向最終使用者授予它的執行權限(甚至拒絕它),並且只能在使用 EXECUTE AS 的儲存過程中啟用它,並且某些登錄名確實具有執行權限。然後將僅對該儲存過程的執行權限授予需要執行該命令的使用者。

首先,確保xp_cmdshell已為實例啟用:

EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
EXEC sp_configure 'xp_cmdshell', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
EXEC sp_configure 'show advanced options', 0;
GO
RECONFIGURE WITH OVERRIDE;

現在取決於作業系統和 SQL Server 服務帳戶,您可能需要設置一個代理帳戶(為此,感謝 UAC,您可能需要提升並以管理員身份啟動 SSMS):

EXEC master..sp_xp_cmdshell_proxy_account 'Domain\User', 'Password';

然後在您的數據庫中創建一個包裝器,它可以執行您需要做的任何事情(這只是一個非常通用的包裝器的範例,它並不能真正保護您免受任何傷害;僅使用它來展示):

USE yourdb;
GO
CREATE PROCEDURE dbo.uxp_cmdshell
 @cmd VARCHAR(2048)
WITH EXECUTE AS OWNER
AS
BEGIN
 EXEC master.dbo.xp_cmdshell @cmd;
END
GO

現在授予您的使用者或角色執行該過程的權限:

GRANT EXECUTE ON dbo.uxp_cmdshell TO [your_user_or_role!];

現在,當your_user登錄並嘗試執行任意呼叫時xp_cmdshell

EXEC master.dbo.xp_cmdshell 'dir c:\';

他們將獲得:

消息 229,級別 14,狀態 5,過程 xp_cmdshell,第 1 行

對象“xp_cmdshell”、數據庫“mssqlsystemresource”、模式“sys”的 EXECUTE 權限被拒絕。

但是,如果他們將相同的命令傳遞給您的新過程:

EXEC dbo.uxp_cmdshell 'dir c:\';

它可以正常工作(假設您的代理帳戶設置正確和/或 SQL Server 服務帳戶具有足夠的權限)。

這可能需要一些工作,但實際上這允許您準確控制使用者可以使用xp_cmdshell.

引用自:https://dba.stackexchange.com/questions/34633