【问题标题】:SQL Server 2016: Hide column data from DBAs but specific users can view data through applicationSQL Server 2016:对 DBA 隐藏列数据,但特定用户可以通过应用程序查看数据
【发布时间】:2017-03-16 13:47:21
【问题描述】:

我正在尝试通过 PowerBI 访问团队负责人的工资信息,但对来自其他用户和 DBA 的数据进行加密。拒绝访问此列数据的用户应该仍然能够执行查询,但只能看到工资信息的加密字符。

我使用的是 SQL Server 2016。

我已经测试了新的“始终加密”功能,并且效果很好……但我无法将“列加密设置=启用”参数传递给 PowerBI 连接字符串。众所周知,PowerBI 目前不支持此功能。

我目前正在通过使用列级加密和对称密钥来测试列加密的使用,但问题是我将 OPEN SYMMETRIC KEY SymmetricKey1 & DECRYPTION BY CERTIFICATE Certificate1 代码硬编码到 SQL 中,如果用户无权访问,则用户测试时出现错误会导致 SQL 失败。

我是证书和加密的新手,我目前正处于陡峭的学习曲线中……所以放轻松。

谢谢

【问题讨论】:

    标签: sql-server encryption powerbi sql-server-2016 always-encrypted


    【解决方案1】:

    您可以使用动态数据屏蔽。

    动态数据屏蔽通过屏蔽列输出给没有权限的用户来工作。以下示例已根据此处提供的演示在 2016 年进行了测试:Exploring SQL Server 2016 Dynamic Data Masking – Part One - Creating a Table that uses Dynamic Data Masking

    --create a table
    
    CREATE TABLE ClientInfo
      (ClientID int IDENTITY,
       FirstName varchar(65),
       LastName varchar(65),
       PhoneNum bigint 
          MASKED WITH (FUNCTION = 'default()'),
       EmailAddr varchar(100) 
          MASKED WITH (FUNCTION = 'email()'),
       CreditCardNum varchar(19) MASKED 
          WITH (FUNCTION = 'partial(0,"XXXX-XXXX-XXXX-",4)'),
       BirthDT date MASKED 
          WITH (FUNCTION = 'default()'));
    
    INSERT Clientinfo (FirstName, LastName, PhoneNum, EmailAddr,CreditCardNum,BirthDT) VALUES 
    ('George', 'Washington', 5555814441, 
    'GeorgeW@datanbasejournal.com', '0123-4567-8901-2345','02/22/1732'),
    ('Thomas', 'Jefferson', 5559841298, 
    'ThomasJ@datanbasejournal.com', '9999-9999-9999-9999', '04/13/1743'),
    ('Abraham', 'Lincoln', 5554070123, 
    'AbrahamL@datanbasejournal.com','0000-1111-2222-3333', '02/12/1809');
    

    现在尝试只选择并查看数据,因为您是管理员,所以您将看到所有数据

    select * from clientinfo
    

    现在尝试限制您想要限制查看的用户的权限

    CREATE USER user1 WITHOUT LOGIN;
    GRANT SELECT ON ClientInfo TO user1;
    

    现在让我们尝试以该用户身份执行

    EXECUTE AS USER = 'AppReader';
    SELECT * FROM ClientInfo;
    REVERT;
    

    执行上面的查询,不会显示所有数据,并且会根据被屏蔽的函数进行不同的屏蔽。见下面的截图

    要向用户提供访问权限,您可以使用以下查询

    CREATE USER AppAdmin WITHOUT LOGIN;
    GRANT SELECT ON ClientInfo TO AppAdmin;
    GRANT UNMASK TO AppAdmin; 
    

    【讨论】:

    • 感谢 TheGameiswar,但我已经使用标准 Windows 帐户用户(管理员权限)创建了这些步骤,但当我以主管理员 'sa' 身份登录时,该用户能够查看所有数据。
    • 管理员可以看到所有数据,一个系统管理员不能与另一个系统管理员区分开来。要这样工作,你必须如上所述创建具有最少权限的用户
    • 谢谢,但这是“始终加密”功能的全部概念,它向外部 DBA、系统管理员或云管理员隐藏数据。
    • 我不确定是否总是加密,但据我了解,它隐藏了静态和动态数据,我不确定这是否对您隐藏列有用
    • @Mako 你是对的。 Always Encrypted 将保护数据免受 DbAdmin、sysAdmin 和 SQL Server 的所有其他管理员的侵害,此外还保护静态和动态数据。我在这里解释了安全保证以及它是如何实现的stackoverflow.com/questions/42157845/…
    【解决方案2】:

    不幸的是,AE 是唯一可以防止任何用户(包括 DBA/系统管理员)未经授权访问的现有内置解决方案。

    动态数据屏蔽可防止普通用户。任何具有管理员级别访问权限的用户都可以轻松绕过上面提供的示例。

    列级加密通常也不保护具有管理员级权限的用户。数据库所有者或系统管理员始终可以打开密钥或替换它。通过 ekm 可以解决此问题,但在您的场景中没有可扩展或可用的方法。

    流氓管理员是 Always Encrypted 旨在解决的用例之一,因此它是正确的解决方案。这是 PowerBI 团队需要实现的东西,因此如果该功能对您很重要,建议您将您的投票和 cmets 添加到他们的反馈论坛: https://ideas.powerbi.com/forums/265200-power-bi-ideas/suggestions/14732184-sql-server-2016-always-encription-features

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 2015-09-01
      • 1970-01-01
      相关资源
      最近更新 更多