加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQLServer 服务器角色public和数据库角色public权限回收

发布时间:2020-12-12 13:28:43 所属栏目:MsSql教程 来源:网络整理
导读:SQLServer 服务器角色public和数据库角色public默认授予每个账号和用户,并且不能禁用,该角色可以查看数据库中很多元数据,存在安全隐患,可使用以下脚本将角色的所有权限撤销。 注意:如果权限都撤销了,使用该账户登录ssms,界面将看不到任何对象了。 --

SQLServer 服务器角色public和数据库角色public默认授予每个账号和用户,并且不能禁用,该角色可以查看数据库中很多元数据,存在安全隐患,可使用以下脚本将角色的所有权限撤销。 注意:如果权限都撤销了,使用该账户登录ssms,界面将看不到任何对象了。


--	查看服务器角色 public 权限
SELECT sp1.type_desc AS grantor_type_desc,sp2.name AS grantee_name,sp2.type_desc AS grantee_type_desc,spe.class_desc,spe.state_desc,spe.permission_name,sp1.name AS [ObjectName]
FROM sys.server_permissions AS spe
INNER JOIN sys.server_principals AS sp1 ON sp1.principal_id = spe.major_id and spe.class = 101
INNER JOIN sys.server_principals AS sp2 ON sp2.principal_id = spe.grantee_principal_id
WHERE(sp2.name=N'public')
UNION
SELECT '' AS grantor_type_desc,c.name AS [ObjectName]
FROM sys.server_permissions AS spe
INNER JOIN sys.certificates AS c ON c.certificate_id = spe.major_id and spe.class = 106
INNER JOIN sys.server_principals AS sp2 ON sp2.principal_id = spe.grantee_principal_id
WHERE(sp2.name=N'public')
UNION
SELECT e.type_desc AS grantor_type_desc,e.name AS [ObjectName]
FROM sys.server_permissions AS spe
INNER JOIN sys.endpoints AS e ON e.endpoint_id = spe.major_id and spe.class = 105
INNER JOIN sys.server_principals AS sp2 ON sp2.principal_id = spe.grantee_principal_id
WHERE (sp2.name=N'public')
GO


--	查看当前数据库的角色 public 及用户 guest 的权限
SELECT role_name = u.name,p.state_desc,p.permission_name,[schema] = SCHEMA_NAME(o.schema_id),object_name = o.name,o.type 
FROM sys.database_permissions p
INNER JOIN sys.database_principals u ON p.grantee_principal_id = u.principal_id
INNER JOIN sys.all_objects o ON o.object_id = p.major_id
WHERE p.grantee_principal_id IN (0,2) --(0:public;2:guest)
ORDER BY u.name,o.schema_id,o.name,p.permission_name;
GO


--	回收所有数据库角色public的权限
DECLARE @database	varchar(100),@permission varchar(100),@object		varchar(100),@role		varchar(100),@schema		varchar(100),@sql		nvarchar(1000)

DECLARE CSR_DB CURSOR FAST_FORWARD FOR 
	SELECT name FROM sys.databases ORDER BY name;
	
OPEN CSR_DB;
FETCH NEXT FROM CSR_DB INTO @database;

WHILE (@@fetch_status = 0)
BEGIN
	SET @sql = 
		'DECLARE CSR_Objects CURSOR FAST_FORWARD FOR 
		SELECT p.permission_name,role_name = u.name
		FROM [' + @database + '].sys.database_permissions p
		INNER JOIN [' + @database + '].sys.database_principals u ON p.grantee_principal_id = u.principal_id
		INNER JOIN [' + @database + '].sys.all_objects o ON o.object_id = p.major_id
		WHERE p.grantee_principal_id IN (0,2) 
		ORDER BY u.name,p.permission_name;';
	EXECUTE sp_executesql @sql;

	OPEN CSR_Objects;
	FETCH NEXT FROM CSR_Objects INTO @permission,@schema,@object,@role;
	
	WHILE (@@fetch_status = 0)
	BEGIN
		SELECT @sql = 'USE [' + @database + ']; REVOKE ' + @permission + ' ON [' + @schema + '].[' + @object + '] FROM [' + @role + '];';
		--EXEC sp_executesql @sql;
		PRINT @sql
		FETCH NEXT FROM CSR_Objects INTO @permission,@role;
	END
	
	IF @database NOT IN ('master','tempdb')
	BEGIN
		SELECT @sql = 'USE [' + @database + ']; REVOKE CONNECT FROM GUEST;';
		--EXEC sp_executesql @sql;
		PRINT @sql
	END
	
	CLOSE CSR_Objects;
	DEALLOCATE CSR_Objects;

	FETCH NEXT FROM CSR_DB INTO @database;
END
CLOSE CSR_DB;
DEALLOCATE CSR_DB;
GO

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读