SQL Server 禁用擴展存儲過程


概述  

擴展存儲過程是 SQL Server 實例可以動態加載和運行的 DLL。擴展存儲過程是使用 SQL Server 擴展存儲過程 API 編寫的,可直接在 SQL Server 實例的地址空間中運行。擴展存儲過程可能會產生內存泄漏或其他降低服務器的性能及可靠性的問題。固定服務器角色 sysadmin 的成員可以使用 SQL Server 實例來注冊該擴展存儲過程,然后授予其他用戶執行該過程的權限。擴展存儲過程只能添加到 master 數據庫中。有一些系統自帶的擴展存儲過程操作的權限非常的高,包括修改注冊表和修改文件的權限,比如“xp_cmdshell”。為了保證數據庫的安全需要將這部分擴展存儲過程給禁用。如果你們公司需要面臨ICP備案的話那么這個事情是必須要做的。

 

 

需要禁用的擴展存儲過程包括:

SELECT  object_name,state from  sys.system_components_surface_area_configuration 
WHERE state=1 and object_name IN (
'xp_regdeletevalue',
'xp_regremovemultistring',
'xp_regwrite',
'xp_regaddmultistring',
'xp_regdeletekey',
'xp_enumerrorlogs',
'xp_enumgroups',
---不中視圖中
'xp_loginconfig',
'xp_getfiledetails',
'xp_regenumvalues',
'sp_makewebtask',
---對應系統外圍配置'xp_cmdshell'
'xp_cmdshell',
---對應系統外圍配置'Ole Automation Procedures'
'Sp_OACreate',
'Sp_OADestroy',
'Sp_OAGetErrorInfo',
'Sp_OAGetProperty',
'Sp_OAMethod',
'Sp_OASetProperty',
'Sp_OAStop'
)

一、禁用擴展存儲過程

有一些擴展存儲過程它是屬於服務器外圍配置選項,可以使用sp_configure來開啟和禁用。例如xp_cmdshell

---開啟xp_cmdshell
sp_configure 'show advanced options', 1;
GO
sp_configure 'allow updates',0 ---開啟允許更新系統表,當更改系統配置選項時提示不運行對系統目錄即時更新時需要開啟改功能
go
reconfigure;
go
sp_configure 'xp_cmdshell', 1;----開啟xp_cmdshell
go
reconfigure;
go
sp_configure 'allow updates',1----關閉更新系統表功能
go
sp_configure 'show advanced options', 0;

go
---關閉xp_cmdshell
sp_configure 'show advanced options', 1;
GO
sp_configure 'allow updates',0 ---開啟允許更新系統表
go
reconfigure;
go
sp_configure 'xp_cmdshell', 0;----關閉xp_cmdshell
go
reconfigure;
go
sp_configure 'allow updates',1----關閉更新系統表功能
go
sp_configure 'show advanced options', 0;

二、拒絕授予擴展存儲過程的可執行權限

而除了系統外圍配置選項涉及的擴展存儲過程可以通過sp_configure開啟和禁用之外,剩下的系統擴展存儲過程只能通過拒絕授予可執行權限的方式來禁用。

從SQLServer2005開始就不能通過sp_dropextendedproc 刪除系統擴展存儲過程

可以通過拒絕 public 角色對擴展存儲過程的 EXECUTE 權限

select 'DENY EXECUTE ON '+object_name+' TO public',object_name,state from  sys.system_components_surface_area_configuration 
WHERE state=1 and object_name IN (
'xp_regdeletevalue',
'xp_regremovemultistring',
'xp_regwrite',
'xp_regaddmultistring',
'xp_regdeletekey',
'xp_enumerrorlogs',
'xp_enumgroups',
---不中視圖中
'xp_loginconfig',
'xp_getfiledetails',
'xp_regenumvalues',
'sp_makewebtask',
---對應系統外圍配置'xp_cmdshell'
'xp_cmdshell',
---對應系統外圍配置'Ole Automation Procedures'
'Sp_OACreate',
'Sp_OADestroy',
'Sp_OAGetErrorInfo',
'Sp_OAGetProperty',
'Sp_OAMethod',
'Sp_OASetProperty',
'Sp_OAStop'
);

 

三、查詢權限

USE MASTER
;
WITH CET AS(
SELECT  'DENY EXECUTE ON '+object_name+' TO public' AS DenySQL,object_name,state from  sys.system_components_surface_area_configuration 
WHERE state=1 and object_name IN (
'xp_regdeletevalue',
'xp_regremovemultistring',
'xp_regwrite',
'xp_regaddmultistring',
'xp_regdeletekey',
'xp_enumerrorlogs',
'xp_enumgroups',
---不中視圖中
'xp_loginconfig',
'xp_getfiledetails',
'xp_regenumvalues',
'sp_makewebtask',
---對應系統外圍配置'xp_cmdshell'
'xp_cmdshell',
---對應系統外圍配置'Ole Automation Procedures'
'Sp_OACreate',
'Sp_OADestroy',
'Sp_OAGetErrorInfo',
'Sp_OAGetProperty',
'Sp_OAMethod',
'Sp_OASetProperty',
'Sp_OAStop'
)
)
 
SELECT A.name,schema_name(A.schema_id) [schema],A.type,b.permission_name,B.type,B.state_desc,C.name,c.type_desc    
FROM sys.all_objects AS A      
LEFT JOIN sys.database_permissions AS B ON B.major_id=A.object_id AND B.minor_id=0 AND B.class=1      
LEFT JOIN sys.database_principals AS C ON C.principal_id = B.grantee_principal_id      
where A.name IN(SELECT object_name FROM CET)   
ORDER BY A.name 

 

參考:http://blog.csdn.net/kk185800961/article/details/52188556

參考:https://docs.microsoft.com/zh-cn/sql/relational-databases/system-stored-procedures/sp-dropextendedproc-transact-sql

總結

 

 

 

 

 

 

備注:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須注明文章來源,且在文章開頭明顯處給明鏈接,否則保留追究責任的權利。

《歡迎交流討論》

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM