2

我在 SQL Server 2016 中为主题始终加密做一些演示。有几个疑问。以下是遵循的步骤:

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

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

怀疑:

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

4

2 回答 2

3

在第 3 步中,您提到您从数据库服务器导出证书,为确保最大安全性,切勿将您的证书存储在数据库服务器上。服务器不需要访问证书。

如果 SysAdmin 登录(SQL 身份验证)使用附加参数 Column Encryption Setting=Enabled 连接到 SSMS,则显示纯文本数据(预期加密数据)。我的理解是,除了应用程序用户之外,没有其他人应该看到纯文本数据)。谁能澄清一下?

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

粗略地说,Always Encrypted 提供以下安全保证,纯文本数据将仅对有权访问 ColumnMasterKey(证书)的实体可见


为了详细说明,请考虑以下场景。

考虑两台机器:

  • MachineA:运行 SQL Server 的机器
  • MachineT:客户端机器。

考虑两个用户

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

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

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

我们的目标是保护属于表t的列,例如ssnCol,这样只有userT应该能够以明文形式看到ssnCol

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

  • UserT登录到MachineT
  • UserT在MachineT中打开 SSMS 。
  • UserT连接到MachineA上的 SQL Server
  • UserT使用本文部分提到的步骤加密表 t 中的ssnColEncrypt columns (configure Always Encrypted)
  • 在这一步之后,列ssnCol将被加密。

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

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

因此,为了解密ssnCol,需要 CEK,然而,为了解密 CEK,需要 CMK。

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

userAmachineA上的管理员,也是 SQL Server 上的 SysAdmin,但由于他/她无权访问 CMK,因此userA无法以明文形式访问ssnCol。您可以通过使用MachineA中的 SSMS 、以userA身份登录并查询ssnCol来验证这一点

如果您还有其他问题,请在评论部分提出,我可以回答。

于 2017-02-14T19:58:12.107 回答
2

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

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

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

于 2017-02-23T18:32:07.360 回答