【问题标题】:Always encrypted Behavior in SQL Server 2016SQL Server 2016 中的始终加密行为
【发布时间】:2017-02-10 11:05:20
【问题描述】:

我在 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 身份验证)使用附加参数 Column Encryption Setting=Enabled 连接到 SSMS,则显示纯文本数据(预期加密数据)。 我的理解是,除了应用程序用户之外,其他任何人都不应该看到纯文本数据)。谁能解释一下?

【问题讨论】:

  • 你说的是有权使用证书的用户,在确实拥有适当证书的机器上使用Column Encryption连接到数据库并且能够读取数据。没关系。该用户是通过代码还是 SSMS 连接都没有关系。它仍然是一个用户在做被允许的事情
  • Always Encrypted 是一种数据保护机制,而不是权限机制。即使黑客窃取数据库文件或安装 Wireshark 来捕获数据包,它也可以防止黑客读取数据。这不是阻止服务器管理员读取他确实有权限的数据的机制。
  • 如果您想限制管理访问,不要将服务器管理权限授予所有人。使用具有最低要求权限的角色,并且只将密钥和证书的权限授予需要此类访问权限的用户和角色。
  • 感谢@Panagiotis Kanavos 的澄清。你能解释/分享Use roles with the minimum required priviledges and only give permissions to keys and certificates to the users and roles that do require such access.上的一些链接吗?

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


【解决方案1】:

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

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

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

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


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

考虑两台机器:

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

考虑两个用户

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

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

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

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

可以通过以下步骤实现上述目标。

  • UserT 登录到 MachineT
  • UserTMachineT 中打开 SSMS。
  • UserT 连接到 MachineA 上的 SQL Server
  • UserT 使用this articleEncrypt columns (configure Always Encrypted) 部分中提到的步骤对表 t 中的 ssnCol 进行加密
  • 在此步骤之后,列 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

来验证这一点

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

【讨论】:

  • 这很有帮助,谢谢!我没有在数据库服务器中存储任何证书。它是在创建密钥时创建的。已关注databasejournal.com/features/mssql/…
  • @p2k 为您提供更好的帮助,请您回答以下问题。 1)您使用什么机器来创建步骤 1 中提到的 CMK 和 CEK。2)我假设您有两台机器设置,机器 A:装有数据库的 SQL 服务器和机器 B:是您的本地机器,也就是您的机器应用服务器是正确的吗? 3)您使用哪台机器以系统管理员身份登录?
  • 精湛的解释。到目前为止,没有人在我阅读的任何在线文章中涵盖此信息。 + 1
  • @CleanBold 谢谢,非常感谢!
  • 感谢 Nikhil,这真的为我解决了问题。一个后续问题 - 正如在企业场景中相当常见的那样,服务器团队的成员(我们称他们为 UserS)对 MachineA 和 MachineT 具有管理员访问权限,以进行修补、维护、安全请求等......我可以在哪里存储CMK 在哪里 UserS 将无法使用它?
【解决方案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 了解更多详细信息和有用的指南。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多