Azure SQL托管实例:分析师跨库建视图访问禁止数据的问题求助
核心问题概述
用户在拥有CONTROL权限的个人架构中创建视图,可绕过权限限制访问原本禁止的数据。
背景介绍
Azure SQL托管实例包含两个数据库:
sources:存储原始数据表reports:基于sources库表构建视图的数据库
在reports库中,数据分析师拥有个人专属架构,具备创建视图和表的权限。部分数据涉及敏感信息,对应架构需限制分析师访问。
问题详情
已对敏感架构的直接访问权限进行拒绝/撤销,分析师无法直接访问这些架构,但仍可创建引用sources库中禁止访问表的视图,并通过该视图查看敏感数据。
疑问
按权限设计,分析师不应能访问这些敏感数据,但目前找不到阻止该行为的有效方法。
环境配置
用户账号通过Azure AD创建,相关权限配置SQL代码如下:
在reports数据库中创建用户并分配个人架构
CREATE USER [john@example.com] FOR LOGIN [john@example.com];
USE [reports]; CREATE SCHEMA mypersonal; -- 创建角色 CREATE ROLE mypersonal_schema_creator; -- 为角色授予权限 GRANT CREATE TABLE TO mypersonal_schema_creator; GRANT CREATE VIEW TO mypersonal_schema_creator; -- 授予角色对架构的CONTROL权限 GRANT CONTROL ON SCHEMA::mypersonal TO mypersonal_schema_creator; -- 将用户添加至角色 ALTER ROLE mypersonal_schema_creator ADD MEMBER [john@example.com];
在sources数据库中授予用户指定架构访问权限
-- 连接至sqldb-ingestion01 CREATE USER [john@example.com] FOR LOGIN [john@example.com]; -- 授予对ALLOWED架构的SELECT权限 GRANT SELECT ON SCHEMA::allowed TO [john@example.com];
用户直接访问sources库时仅能看到allowed架构,但创建引用forbidden架构表的视图后,仍可查看其中数据。
解决方案
1. 显式拒绝敏感架构的访问权限
在sources数据库中,对目标用户显式拒绝敏感架构的SELECT权限,这会覆盖任何可能的继承权限,确保用户无法通过视图间接访问:
USE [sources]; DENY SELECT ON SCHEMA::forbidden TO [john@example.com];
2. 检查跨数据库所有权链配置
Azure SQL托管实例默认关闭跨数据库所有权链,但如果该选项被开启,当两个数据库所有者为同一账号时,视图可能跳过底层表的权限检查。需确认该配置处于关闭状态:
- 登录Azure门户,进入目标托管实例
- 在"配置"选项中,确保"跨数据库所有权链"设置为"关闭"
3. 限制架构CONTROL权限的范围(可选)
若无需用户拥有架构的完整CONTROL权限,可拆分权限:仅授予CREATE TABLE、CREATE VIEW以及对架构内对象的SELECT/ALTER等必要权限,而非直接授予CONTROL,减少权限滥用风险:
USE [reports]; -- 撤销CONTROL权限 REVOKE CONTROL ON SCHEMA::mypersonal FROM mypersonal_schema_creator; -- 授予必要权限 GRANT ALTER ON SCHEMA::mypersonal TO mypersonal_schema_creator; GRANT SELECT ON SCHEMA::mypersonal TO mypersonal_schema_creator; GRANT INSERT, UPDATE, DELETE ON SCHEMA::mypersonal TO mypersonal_schema_creator;
内容的提问来源于stack exchange,提问作者Kirill.lv
相关产品推荐
相关产品推荐

