AD组交集控制Synapse Serverless Pool访问权限的方法
Synapse Serverless Pool权限交集控制实现方案
答案是可行的。Synapse Serverless Pool的SQL权限模型本身不提供原生的“AD组取交集”SQL语法,但可以在不改动第三方团队维护的ADGroupA/ADGroupB/ADGroupC配置的前提下,实现“仅同时属于目标ADGroupD、且在原三个AD组权限范围内的用户,可获得对应数据集访问权限”的目标,完全避免全量35个用户被授权的问题。
第一步:清理原有全量授权规则
移除原有第三方AD组对数据库角色的直接绑定、以及对数据访问凭据的直接授权,从根源上阻断非目标用户的权限通道:-- 断开第三方AD组和数据库角色的直接关联 ALTER ROLE [finance] DROP MEMBER [ADGroupA] ALTER ROLE [对应ADGroupB的业务角色] DROP MEMBER [ADGroupB] ALTER ROLE [对应ADGroupC的业务角色] DROP MEMBER [ADGroupC] -- 撤销原有直接给AD组的托管凭据授权 REVOKE REFERENCES ON DATABASE SCOPED CREDENTIAL::[SynapseManagedIdentity] TO [ADGroupA] REVOKE REFERENCES ON DATABASE SCOPED CREDENTIAL::[SynapseManagedIdentity] TO [ADGroupB] REVOKE REFERENCES ON DATABASE SCOPED CREDENTIAL::[SynapseManagedIdentity] TO [ADGroupC]第二步:配置目标用户的数据库入口权限
为管控15名目标用户的ADGroupD创建数据库映射,仅向该组开放数据库连接和底层ADLS访问的基础权限,非组内用户无法建立数据库会话:-- 创建ADGroupD的外部身份映射 CREATE USER [ADGroupD] FROM EXTERNAL PROVIDER -- 授予基础数据库连接权限 GRANT CONNECT ON DATABASE::[你的目标数据库名] TO [ADGroupD] -- 授予ADLS访问所需的托管凭据引用权限,所有能连上库的用户均可通过统一托管身份访问底层存储 GRANT REFERENCES ON DATABASE SCOPED CREDENTIAL::[SynapseManagedIdentity] TO [ADGroupD]第三步:实现AD组交集的权限匹配
可根据自身运维权限选择两种匹配方案,均不改动原有第三方AD组的配置:- 方案一:低维护成本的静态权限绑定
基于已知的15名目标用户的AD归属,直接将单个用户加入对应的业务数据库角色,权限边界完全对齐原ADGroupA/B/C的数据集范围。例如某用户同时属于ADGroupD和ADGroupA,则执行ALTER ROLE [finance] ADD MEMBER [该用户的UPN]将其加入财务数据集对应的角色。全程仅维护15个目标用户的绑定关系,原有35个用户中的非目标用户不会获得任何权限。 - 方案二:零手动维护的动态交集实现
在自有AD权限范围内创建三个动态嵌套组,分别配置为“成员需同时属于ADGroupA和ADGroupD、ADGroupB和ADGroupD、ADGroupC和ADGroupD”。这些动态组不需要修改原有第三方AD组的任何配置,仅做身份交集判断。之后将三个动态组映射为数据库用户,分别加入对应的业务数据库角色,即可实现权限的自动匹配,后续AD组成员变动时不需要手动调整数据库侧配置。
- 方案一:低维护成本的静态权限绑定
上线校验注意事项
- 禁止将ADGroupD本身直接加入全部业务数据库角色,否则会导致组内所有用户获得全量数据集的访问权限,违反最小权限原则。
- 权限上线后可通过
SELECT * FROM sys.user_token验证当前用户的安全上下文,确认非目标用户无法建立会话、目标用户仅能获得对应归属范围内的schema查询权限。
内容的提问来源于stack exchange,提问作者Aravind
相关产品推荐
相关产品推荐

