用户可在DB2创建同义词访问DB1受限表,如何阻止该查询?
如何阻止用户通过同义词访问已被拒绝权限的跨库表
从你的描述来看,核心问题大概率是跨数据库所有权链(Cross-Database Ownership Chaining) 在DB1或DB2中被开启了。当这个特性启用时,如果同义词的所有者(比如DB2的dbo)和底层表的所有者(DB1的dbo)是同一个登录身份,那么用户只要能访问同义词(你是DB2的db_owner,肯定有权限),就会跳过对底层表的权限检查——这就是为什么直接访问DB1.dbo.cl被拒绝,但通过同义词能查询的原因。
下面是几种可行的解决方法,你可以根据实际环境选择:
1. 关闭跨数据库所有权链(最直接)
这是从根源解决问题的方法。关闭后,即使所有者相同,访问同义词时也会强制检查底层表的权限。执行以下命令:
-- 关闭DB1的跨数据库所有权链 ALTER DATABASE DB1 SET DB_CHAINING OFF; -- 关闭DB2的跨数据库所有权链 ALTER DATABASE DB2 SET DB_CHAINING OFF;
注意:关闭前要评估是否会影响其他依赖这个特性的应用,比如跨库存储过程、视图等。
2. 明确拒绝用户对DB1表的SELECT权限
拒绝权限的优先级高于任何允许权限(包括所有权链带来的隐含允许)。直接在DB1中执行拒绝命令:
USE DB1; -- 替换成你的AD用户或组名 DENY SELECT ON dbo.cl TO [YourADUserOrGroup];
执行后,无论用户通过直接访问还是同义词访问,都会被拒绝查询权限。
3. 修改底层表的所有者(适合无法关闭所有权链的场景)
如果不能关闭跨数据库所有权链,可以修改DB1中cl表的所有者,让它和DB2的dbo不是同一个身份。这样所有权链就无法生效,访问同义词时会触发底层表的权限检查。示例命令:
USE DB1; -- 替换成新的所有者登录名,比如一个专门的业务账户 ALTER AUTHORIZATION ON OBJECT::dbo.cl TO [NewOwnerLogin];
这个操作需要DB1的管理员权限,你如果没有的话需要联系DBA。
另外,建议你先检查下用户是否通过间接方式获得了权限:比如所属AD组是否被授予了DB1的SELECT权限,或者public角色是否有cl表的访问权限。如果有的话,记得撤销这些权限,避免出现权限泄漏。
内容的提问来源于stack exchange,提问作者Tom Kev
相关产品推荐
相关产品推荐

