我在SQL Server 2016中为主题始终加密做了一些演示。很少有人怀疑。以下是以下步骤:
在数据库服务器(托管在Microsoft Azure VM中)中:
MyTable
中,创建了列加密密钥(CEK)和主加密密钥(CMK)Select * from MyTable
,显示加密数据。(来自App和DB服务器)Column Encryption Setting=Enabled
添加到我的应用程序的连接字符串中。的疑问:
在数据库服务器(在MS Azure VM中)中,如果SysAdmin登录(SQL身份验证)使用附加参数Column Encryption Setting=Enabled
连接到SSMS,则会显示纯文本数据(期望加密数据)。 我的理解是,除了应用程序用户之外,没有人应该看到纯文本数据)。有人可以澄清一下吗?
答案 0 :(得分:3)
在步骤3中,您提到从数据库服务器导出证书,以确保最高安全性,从不将证书存储在数据库服务器上。服务器无需访问证书。
如果SysAdmin登录(SQL身份验证)连接到SSMS 附加参数Column Encryption Setting = Enabled,显示 纯文本数据(期望加密数据)。我的理解是,不 另一个应用程序用户应该看到纯文本数据)。能够 有人请澄清一下吗?
如果SysAdmin从具有证书的客户端计算机连接到SSMS,并且SysAdmin有权访问证书,则他们将看到纯文本数据。
粗略地说,Always Encrypted提供以下安全保证,只有有权访问ColumnMasterKey(证书)的实体才能看到明文数据
详细说明,请考虑以下情况。
考虑两台机器:
考虑两个用户
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 。
可以使用以下步骤实现上述目标。
Encrypt columns (configure Always Encrypted)
部分中提到的步骤加密表t中的 ssnCol
当 userT 以上述方式加密 ssnCol 时,会生成两个密钥
因此,为了解密 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了解更多详情和有用指南。