代码之家  ›  专栏  ›  技术社区  ›  Kirill.lv

Azure SQL分析师可以从禁止的跨数据库数据创建视图

  •  0
  • Kirill.lv  · 技术社区  · 1 月前

    TLDR问题

    用户可以通过在他拥有CONTROL权限的个人模式中创建禁止数据的视图来查看禁止数据。


    介绍

    我有一个Azure SQL(托管实例)服务器,它有两个数据库:

    • sources :带数据的表
    • reports :视图构建在中的表之上 来源

    报告 数据库中,数据分析师有自己的个人模式,可以创建视图和表。由于某些数据的性质,并非每个模式都允许向数据分析师公开。

    问题

    我拒绝/撤销对某些模式的访问,直接访问这些模式是有效的。但是数据分析师仍然可以创建引用中禁止的表的新视图 来源 数据库,仍然可以通过创建的视图查看数据。

    提问

    这不应该是可能的,因为数据分析师不应该能够访问 来源 数据库。但我似乎找不到阻止这种情况的方法。

    安装程序

    用户的帐户是在Azure的AD中创建的。我在 报告 数据库。

    CREATE USER [[email protected]] FOR LOGIN [[email protected]];
    

    根据他自己的模式:

    USE [reports];
    
    CREATE SCHEMA mypersonal;
    
    -- Create a role
    CREATE ROLE mypersonal_schema_creator;
    
    -- Grant permissions to the role
    GRANT CREATE TABLE TO mypersonal_schema_creator;
    GRANT CREATE VIEW TO mypersonal_schema_creator;
    
    -- Grant control on the schema to the role
    GRANT CONTROL ON SCHEMA::mypersonal TO mypersonal_schema_creator;
    
    -- Add the user to the role
    ALTER ROLE mypersonal_schema_creator ADD MEMBER [[email protected]];
    

    我授予用户访问中架构的权限 来源 数据库:

    -- Connect to sqldb-ingestion01
    CREATE USER [[email protected]] FOR LOGIN [[email protected]];
    
    -- Grant SELECT permission on the ALLOWED schema
    GRANT SELECT ON SCHEMA::allowed TO [[email protected]];
    

    当用户访问 来源 数据库中,除了 allowed 模式。但是,当他创建一个访问表的视图时 forbidden 模式,他仍然可以看到数据。

    1 回复  |  直到 1 月前
        1
  •  1
  •   Thom A    1 月前

    这既是预期的行为,也是记录在案的行为。你所经历的就是所谓的所有权链。

    当一个物体,如 VIEW PROCEDURE ,如果 USER 他们也有权使用该对象 隐含地 授予对对象引用的任何对象的访问权限,这些对象与该对象具有相同的所有者,同时处于该对象的范围内。在这种情况下,你有一个 用户 谁创造了一个 视图 哪一个 SELECT s来自具有相同所有者的其他对象(推测 dbo 或者别的什么),所以即使 用户 没有对底层表的显式访问权限 视图 允许他们隐式许可。

    虽然我很感激您为我们提供了一些细节,但我将使用对象DDL设置我自己的示例。首先,让我们创建一个测试数据库 用户

    CREATE DATABASE YourDB;
    GO
    USE YourDB;
    GO
    
    CREATE USER SomeUser WITHOUT LOGIN; --Example User
    GO
    
    CREATE SCHEMA SomeSchema; --Example schema
    GO
    
    GRANT CONTROL ON SCHEMA::SomeSchema TO SomeUser;
    GRANT CREATE TABLE TO SomeUser;
    GRANT CREATE VIEW TO SomeUser;
    GRANT SELECT ON SCHEMA::SomeSchema TO SomeUser;
    

    所以 用户 有创建权限 视图 s和 TABLE s、 他们 CONTROL “他们的”模式,他们也可以 选择 从他们的模式。

    现在让我们创建一些示例对象:

    CREATE TABLE dbo.SomeTable (SomeID int);
    CREATE TABLE dbo.AnotherTable (AnotherID int);
    --We don't need any sample data, this is just permissions checking;
    GO
    GRANT SELECT ON dbo.SomeTable TO SomeUser;
    

    注:我同意 用户 明确访问 SomeTable ,但不是 AnotherTable .

    现在,作为 用户 ,我要 CREATE 一些 视图 s、 然后做一些测试 选择 s

    EXECUTE AS USER = 'SomeUser';
    GO
    
    SELECT SomeID
    FROM dbo.SomeTable; --Works
    GO
    
    CREATE VIEW SomeSchema.SomeView AS
        SELECT SomeID AS ID
        FROM dbo.SomeTable;
    GO
    
    SELECT ID
    FROM SomeSchema.SomeView; --Works
    GO
    SELECT AnotherID
    FROM dbo.AnotherTable; --Doesn't work.
    GO
    
    CREATE VIEW SomeSchema.AnotherView AS
        SELECT AnotherID AS ID
        FROM dbo.AnotherTable;
    GO
    
    SELECT ID
    FROM SomeSchema.AnotherView; --Works, due to permission chaining
    GO
    
    GO
    REVERT; --back to normal
    

    正如我们所看到的,这正如我所期望的那样 选择 反对 SomeSchema.AnotherView 使用以下命令工作并返回数据集 dbo.AnotherTable 以及 选择 直接对着物体 dbo。另一张桌子 失败,错误为:

    对象“AnotherTable”、数据库“YourDB”、架构“dbo”的SELECT权限被拒绝。

    为了解决这个问题,正如我提到的,更改模式的所有者 用户 正在使用:

    --Let's change the owner of the schema
    ALTER AUTHORIZATION ON SCHEMA::SomeSchema TO SomeUser;
    

    现在我们可以再次测试,只需查询2 视图 s

    --Now let's try those VIEWs again
    EXECUTE AS USER = 'SomeUser';
    GO
    SELECT SomeID
    FROM dbo.SomeTable; --Works, we have explicit SELECT on the table
    GO
    SELECT ID
    FROM SomeSchema.AnotherView; --Doesn't work, we don't have explicit permission and ownership chaining fails
    GO
    REVERT;
    

    这次查询针对 某种模式。另一种观点 失败,与我们尝试查询时遇到的权限错误相同 dbo。另一张桌子 直接。


    清理 :

    USE master;
    GO
    ALTER DATABASE YourDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    GO
    DROP DATABASE YourDB;