权限链场景下Deny是否不具备更高优先级?如何强制生效?
权限链场景下强制Deny权限生效的实现方法
所有权链绕过下层对象权限校验的核心前提是:上层对象(视图、存储过程)和其引用的下层对象(表、视图)所有者完全一致,此时SQL引擎只会校验用户对上层对象的访问权限,不会检查下层对象权限。要让Deny权限生效,核心逻辑是触发对下层对象的权限校验,或者直接禁止用户访问上层对象。
- 调整对象所有者,打破所有权链:将视图/存储过程的所有者修改为和底层引用表不同的用户。所有权链断裂后,引擎会依次校验用户对每一层访问对象的权限,此时你在底层表上设置的Deny权限就会正常触发,覆盖Grant权限。
- 直接对上层对象设置Deny权限:如果你要限制的用户只需要禁止访问特定的几个视图/存储过程,可以直接给该用户授予对应上层对象的Deny权限,优先级高于Grant的访问权限,用户无法调用上层对象,自然也无法绕开表的Deny权限查询数据。
- 显式指定执行上下文并强制权限校验:在存储过程定义中显式声明
EXECUTE AS CALLER,同时配合打破所有权链的配置,会强制用调用者的身份校验所有被引用对象的权限,此时底层表的Deny权限会正常生效。 - 使用更高层级的权限控制:如果是要禁止某类用户通过任意所有权链访问敏感表,可以给该用户授予针对敏感表的服务器级Deny权限,这类高优先级的权限规则会跳过所有权链的校验逻辑,直接触发权限检查,让Deny生效。
内容的提问来源于stack exchange,提问作者variable
相关产品推荐
相关产品推荐

