Always encrypted Behavior in SQL Server 2016
我在SQL Server 2016中为主题"始终加密"做了一些演示。没有什么疑问。以下步骤如下:
在数据库服务器中(托管在Microsoft Azure VM中):
怀疑:
在数据库服务器(在MS Azure VM中)中,如果系统管理员登录(SQL身份验证)使用附加参数
在步骤3中,您提到从数据库服务器导出证书,为了确保最大的安全性,永远不要将证书存储在数据库服务器上。服务器不需要访问证书。
If a SysAdmin login (SQL Authentication) connects to SSMS with
additional parameter Column Encryption Setting=Enabled, It is shows
plain text data (expecting encrypted data). My understanding is, no
one other then application users should see the plain text data). Can
anyone please clarify?
号
如果sysadmin从具有证书的客户机连接到ssms,并且sysadmin具有访问证书的权限,那么他们将看到纯文本数据。
大致来说,始终加密提供了以下安全保证,纯文本数据只对有权访问ColumnMasterKey(证书)的实体可见。
要详细说明,请考虑以下场景。
考虑两台机器:
- machinea:运行SQL Server的计算机
- 机器:客户机。
考虑两个用户
user a(从技术上讲,这可以是一组用户,但为了简单起见,我将考虑使用单用户的场景):谁是machinea的管理员,管理SQL Server,谁是SQL Server的sysadmin。但是,用户A对machinet没有任何访问权限,并且用户A不应该能够解密存储在计算机A上的SQL Server中的任何加密数据(在这个答案的上下文中,加密数据是使用SQL Server的始终加密功能加密的数据)。
usert(从技术上讲,这可以是一组用户,但为了简单起见,我将考虑使用单用户的场景):是一个受信任的用户,可以访问machinet,可以访问machinea上SQL Server中托管的数据库db中的所有数据。另外,由于usert是可信的,他/她应该能够解密加密的数据。
考虑在machinea上运行的SQL Server具有数据库DB和表T。
我们的目标是保护一个属于表T的列,比如ssncol,这样只有usert才能以明文形式看到ssncol。
上述目标可通过以下步骤实现。
- usert登录到machinet。
- usert在machinet中打开ssms。
- usert连接到machinea上的SQL Server
- usert使用本文
Encrypt columns (configure Always Encrypted) 部分中提到的步骤对表t中的ssncol进行加密。 - 在此步骤之后,列ssncol将被加密。
当usert以上述方式加密ssncol时,会生成两个密钥。
- cmk:cmk aka column master key是用于加密CEK/S的密钥。此密钥存储在计算机的Windows证书存储中。
- cek:cek aka column encryption key是用于加密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来验证这一点。
如果您还有其他问题,请将它们放在评论部分,我可以回答它们。
另外一个非常重要的考虑事项:
始终加密的主要目标是保护您的数据不受运行在承载SQL Server的计算机上的恶意软件和承载SQL Server的计算机上的恶意高权限用户(DBA、sys admins)的侵害。如果这些是您希望在应用程序中解决的攻击向量,则不应在承载包含要保护列的数据库的SQL Server实例的计算机上为"始终加密"设置密钥。如果在承载实例的计算机上运行密钥设置工具(例如SSMS或PowerShell),并且该计算机受到威胁,则攻击者可以窃取您的密钥,例如通过刮取SSMS内存。当然,如果您生成一个证书并将其放在服务器机器上的证书存储中,攻击者就更容易获得它。
请参阅https://msdn.microsoft.com/en-us/library/mt708953.aspx SecurityWorkeyManagement了解更多详细信息和有用的指导原则。