关于azure:SQL Server 2016中始终加密的行为

Always encrypted Behavior in SQL Server 2016

我在SQL Server 2016中为主题"始终加密"做了一些演示。没有什么疑问。以下步骤如下:

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

  • 在表MyTable中,创建了列加密密钥(CEK)和主加密密钥(CMK)
  • Select * from MyTable显示加密数据(来自app和db server)。
  • 已从数据库服务器导出证书
  • 已在应用服务器(我的本地计算机)中导入证书
  • 在我的应用程序的连接字符串中添加了Column Encryption Setting=Enabled
  • 它工作正常,现在它按预期显示纯文本数据。
  • 怀疑:

    在数据库服务器(在MS Azure VM中)中,如果系统管理员登录(SQL身份验证)使用附加参数Column Encryption Setting=Enabled连接到SSMS,则显示纯文本数据(需要加密数据)。我的理解是,应用程序用户不应该看到纯文本数据)。有人能澄清一下吗?


    在步骤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了解更多详细信息和有用的指导原则。