SQL Server 2016:隐藏来自DBA的列数据,但特定用户可以通过应用程序查看数据

时间:2017-03-16 13:47:22

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

我尝试通过PowerBI启用对工资信息的团队负责人的访问权限,但是会从其他用户和DBA加密这些数据。拒绝访问此列数据的用户仍应能够执行查询,但只能查看工资信息的加密字符。

我正在使用SQL Server 2016。

我测试了新的“始终加密”#39;功能,这完美地工作......但除了我无法通过'列加密设置=启用' PowerBI连接字符串的参数。据大家所知,PowerBI目前不支持此功能。

我目前正在通过使用列级加密和对称密钥来测试列加密的使用,但问题是我正在硬编码OPEN SYMMETRIC KEY SymmetricKey1&通过CERTIFICTION证书将Certificate1代码放入SQL中,如果用户没有访问权限,那么当用户测试时,错误会导致SQL失败。

我是证书和加密的新手,而且我目前处于陡峭的学习阶段...所以请放轻松。

由于

2 个答案:

答案 0 :(得分:1)

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

动态数据屏蔽通过将列输出屏蔽到没有权限的用户来工作。以下示例已根据此处提供的演示进行了测试: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;

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

enter image description here

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

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

答案 1 :(得分:1)

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

动态数据屏蔽可以防止普通用户。上面提供的示例很容易由具有管理级访问权限的任何用户进行。

列级加密通常不会保护具有管理员级权限的用户。数据库所有者或系统管理员始终可以打开密钥或替换密钥。通过ekm可以解决这个问题,但在你的场景中没有任何可扩展或可用的功能。

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