Sql-Server
我們能把使用 xp_cmdshell 的風險降到最低嗎?
使用
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
.