始终在SQL Server 2016中加密行为

时间:2017-02-10 11:05:20

标签: azure sql-server-2016 always-encrypted

我在SQL Server 2016中为主题始终加密做了一些演示。很少有人怀疑。以下是以下步骤:

数据库服务器(托管在Microsoft Azure VM中)中:

  1. 在表MyTable中,创建了列加密密钥(CEK)和主加密密钥(CMK)
  2. Select * from MyTable,显示加密数据。(来自App和DB服务器)
  3. 从数据库服务器导出证书
  4. App Server (我的本地计算机)
  5. 中导入证书
  6. Column Encryption Setting=Enabled添加到我的应用程序的连接字符串中。
  7. 工作正常,现在按预期显示纯文本数据。
  8. 的疑问:

    在数据库服务器(在MS Azure VM中)中,如果SysAdmin登录(SQL身份验证)使用附加参数Column Encryption Setting=Enabled连接到SSMS,则会显示纯文本数据(期望加密数据)。 我的理解是,除了应用程序用户之外,没有人应该看到纯文本数据)。有人可以澄清一下吗?

2 个答案:

答案 0 :(得分:3)

在步骤3中,您提到从数据库服务器导出证书,以确保最高安全性,从不将证书存储在数据库服务器上。服务器无需访问证书。

  

如果SysAdmin登录(SQL身份验证)连接到SSMS   附加参数Column Encryption Setting = Enabled,显示   纯文本数据(期望加密数据)。我的理解是,不   另一个应用程序用户应该看到纯文本数据)。能够   有人请澄清一下吗?

如果SysAdmin从具有证书的客户端计算机连接到SSMS,并且SysAdmin有权访问证书,则他们将看到纯文本数据。

粗略地说,Always Encrypted提供以下安全保证,只有有权访问ColumnMasterKey(证书)的实体才能看到明文数据

详细说明,请考虑以下情况。

考虑两台机器:

  • MachineA :正在运行SQL Server的计算机
  • MachineT :客户端计算机。

考虑两个用户

  • UserA (从技术上讲,这可以是一组用户,但为了简单起见,我将考虑使用单用户的方案):谁是 MachineA的管理员,管理SQL服务器并且是SQL服务器上的SysAdmin。但是, userA MachineT 没有任何访问权限, UserA 不能解密存储在SQL Server上的任何加密数据A(加密数据,在此答案的上下文中是使用SQL Server的始终加密功能加密的数据)。

  • UserT (从技术上讲,这可以是一组用户,但为了简单起见,我将考虑使用单用户的方案):是否是受信任的用户,可以访问 MachineT ,可以访问 MachineA 上SQL Server中托管的数据库 db 中的所有数据。此外,由于 userT 是受信任的,他/她应该能够解密加密数据。

考虑在 MachineA上运行的SQL Server 具有数据库db table t

我们的目标是确保属于表 t 的列,例如 ssnCol ,这样只有 userT 应该能够看到<明文中的em> ssnCol 。

可以使用以下步骤实现上述目标。

  • UserT 登录 MachineT
  • UserT MachineT 中打开SSMS。
  • UserT 连接到 MachineA上的SQL Server
  • UserT 使用this article
  • Encrypt columns (configure Always Encrypted)部分中提到的步骤加密表t中的 ssnCol
  • 完成此步骤后, ssnCol 列将被加密。

userT 以上述方式加密 ssnCol 时,会生成两个密钥

  • CMK :CMK aka列主密钥是用于加密CEK / s的密钥。此密钥存储在 MachineT 的Windows证书存储区中。
  • CEK :CEK又名列加密密钥是用于加密 ssnCol 的密钥,此密钥以加密形式存储在 MachineA <上的SQL Server中/ em>并且不会以明文的任何地方保留。

因此,为了解密 ssnCol ,需要CEK,但是,为了解密CEK,需要CMK。

由于CMK位于 machineT 的Windows证书存储区中,因此只有 userT 可以访问CMK,解密CEK并解密 ssnCol

userA machineA 的管理员,也是SQL Server上的SysAdmin,但是,由于他/她无法访问CMK, userA < / em>无法以纯文本格式访问 ssnCol 。您可以使用 MachineA 中的SSMS,以 userA 登录并查询 ssnCol

来验证这一点

如果您有其他问题,请将它们放在评论部分,我可以回答。

答案 1 :(得分:2)

另外一个非常重要的考虑因素:

Always Encrypted的主要目标是保护您的数据免受托管SQL Server的计算机上运行的恶意软件以及托管SQL Server的计算机上的恶意高权限用户(DBA,sys admins)的影响。如果这些是您要在应用程序中寻址的攻击媒介,则不应在托管包含要保护的列的数据库的SQL Server实例的计算机上为Always Encrypted配置密钥。如果您运行密钥配置工具,例如SSMS或PowerShell,在托管您的实例的计算机上,并且计算机受到攻击,攻击者可以窃取您的密钥,例如通过刮SSMS内存。当然,如果您生成证书并放入服务器计算机上的证书存储区,攻击者更容易获得它。

请参阅https://msdn.microsoft.com/en-us/library/mt708953.aspx#SecurityForKeyManagement了解更多详情和有用指南。