一、注意点
1、在SQLServer中,有些系统扩展存储过程,是有风险,需要取消public角色的执行权限。
2、从SQLServer2005开始就不能通过sp_dropextendedproc 删除系统扩展存储过程。
3、系统扩展存储过程是不能被删掉的,也没办法禁用(sysadmin角色的用户肯定拥有执行的权限),所以如果有公司基线要求,我们要做的是拒绝public角色拥有这些扩展存储过程的执行权限。
4、一些高风险的存储过程如下:
xp_cmdshell:以操作系统命令行解释器的方式执行给定的命令字符串,并以文本行的形式返回所有输出;
xp_readerrorlog:读取SQLServer的错误日志;
xp_snmp_getstate:获取snmp状态信息;
xp_sprintf:格式化数据;
xp_sqlinventory:查询SQLServer清单;
xp_sqlregister:对注册表的读取和编辑;
xp_sqltrace:SQL跟踪记录;
xp_servicecontrol:服务管理控制,该存储过程允许用户启动、停止、暂停或运行服务;
xp_sscanf:从字符串中读取数据数据到每个格式参数给出的参数位置;
xp_availablemedia:该存储过程可以查看系统上可用的磁盘驱动器的空间信息;
xp_subdirs:通过xp_dirtree,xp_subdirs将在一个给定的文件夹中显示所有子文件夹;
二、操作步骤
1.查看这个扩展的存储过程对象
命令:
select name,id from sysobjects where name in ('xp_cmdshell','xp_readerrorlog','xp_snmp_getstate','xp_sprintf',
'xp_sqlinventory','xp_sqlregister','xp_sqltrace','xp_servicecontrol','xp_sscanf','xp_availablemedia','xp_subdirs')
2.查看主体public的权限
命令:
select * from sys.database_permissions where grantee_principal_id = DATABASE_PRINCIPAL_ID('public')
3.查看一些public角色是否拥有一些指定的扩展存储过程的执行权限
注:查询扩展存储过程是否符合基线的最终SQL
命令:
select name from sysobjects where id in(
select major_id from sys.database_permissions where grantee_principal_id = DATABASE_PRINCIPAL_ID('public')
and permission_name = 'EXECUTE' and state_desc!='DENY'
and major_id in (
select id from sysobjects where name in ('xp_cmdshell','xp_readerrorlog','xp_snmp_getstate','xp_sprintf',
'xp_sqlinventory','xp_sqlregister','xp_sqltrace','xp_servicecontrol','xp_sscanf','xp_availablemedia','xp_subdirs')
)
)
修改基线方式:直接在图形化界面,把执行的权限去掉就行