概述
擴充套件儲存過程是 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 本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連結,否則保留追究責任的權利。 《歡迎交流討論》 |