SQL Server 端到端加密选项

Mol*_*pad 5 sql-server encryption sql-server-2014 sql-server-2016

我熟悉 SQL Server 的数据库加密选项,例如 TDE,并确保正确加密和保护备份/备份位置。

我正在为一个新客户做一些工作,他要求我详细说明端到端加密的选项,换句话说,以确保从数据库服务器发送到应用程序服务器的数据在途中保持加密并且无法被拦截(或者更确切地说,解释) 通过任何类型的数据包监控。

我知道使用 SSL 证书来加密与数据库的连接,尽管我很少配置它。我真的不知道这是否是端到端加密的合适选项,因为这肯定不能单独使用 SQL Server 进行配置?

在我看来,应用程序端或网络路由上必须有一些东西可以实现这样的端到端加密?

我对网络安全的了解基本上仅限于防火墙规则和一般路由,因此我正在寻找可供我进一步研究或付诸实践的选项。

我担心这个问题会被关闭,因为它是基于意见的,所以我真的要求在 SQL Server 本身(或在 DBA 的职权范围内)提供可靠的选项来配置端到端的数据加密。

Nik*_*oft 5

SQL Server 中的始终加密功能,这是一种客户端加密技术,旨在提供端到端加密,这意味着它将加密客户端应用程序驱动程序中的数据。这意味着数据将在客户端和 SQL Server 之间的网络上加密、在 SQL Server 的内存中加密、在磁盘上加密。如果实施正确,它还可以保护数据免受在 SQL Server 计算机上获得管理员权限的入侵者的攻击(如果您的数据位于云中,则还可以保护云管理员)

粗略地说,Always Encrypted 提供以下安全保证,明文数据仅对有权访问 ColumnMasterKey(证书/AKV 密钥/基于 HSM 的密钥等)的实体可见


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

考虑两台机器:

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

考虑两个用户

  • UserA(从技术上讲,这可以是一组用户,但为了简单起见,我将考虑单个用户的场景):谁是MachineA上的管理员,管理 SQL 服务器,并且是 SQL 服务器上的系统管理员。但是,userA对MachineT没有任何访问权限,并且UserA不应该能够解密存储在机器 A 上的 SQL Server 中的任何加密数据(加密数据,在此答案的上下文中是使用始终加密功能加密的数据) 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 中的ssnCol进行加密Encrypt 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

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

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