SQL Server 连接加密 (1) -- SQL Server connection encyption

联机从书上提到过从SQL Server 2005开始,SQL Server和客户端的连接是自动加密的。但是你可能也注意到在SQL Server Configuration Manager里是有地方去设置加密与否的,而且这个选项默认是关闭的。这可能会显得有些自相矛盾了。此外你也可能注意到,Server Configuration Manager和加密相关的选项出现在了两个地方,一个是客户端选项,一个是服务器端选项,这些又都有些什么区别呢?今天我来详细解释下它们之间的关系。

 

SQL Server中的“加密”发生在什么地方


总的来说,我把SQL Server的加密分成两个部分,一个是对数据的加密,一个是对连接的加密。对于数据的加密,主要是通过一系列的函数如EncryptbyKey,或者TDE来完成的。这部分不在这里展开了。

另外一部分是连接加密,自己分的话还能分成两个阶段。一个是建立连接时候的加密。另外一个阶段是连接建立起来之后,客户端和SQL Server在其上传输数据时候的加密。

 

建立连接时的加密


联机丛书上所说的SQL Server会自动加密连接就是指的这个阶段。这个阶段开始于客户端和SQL Server在TCP/IP协议栈的三次握手,止于客户端成功登陆SQL Server。从SQL Server 2005开始,这个阶段永远是加密的。

那么SQL Server是使用什么密钥来对连接加密的呢?默认情况下SQL Server会自动生成一个证书并使用这个证书来对连接做SSL加密。

大家可能会在SQL Server的Error log的开头部分看到这么一段话:

 

A self-generated certificate was successfully loaded for encryption

这段话就表明了SQL Server在启动的时候自动加载了自动生成的证书并且使用这个证书来加密。

我们可以做一个实验来验证它。将SA的密码设置为Password,然后我们在远端机器上使用SQL Server Management Studio并使用SA账户去连接SQL Server。同时我们使用微软的Network Monitor工具来抓取SQL Server和客户端之间的网络包。使用SA账户来做这个实验是因为,SA账户是一个SQL 验证账户,而SQL验证账户的密码都是由客户端通过网络直接提交给SQL Sever来做验证的。这也是为什么说SQL验证不如Windows验证安全的原因。通过实验:

1. 我们可以看到有SSL的数据包交换,因此你判定SQL Server已经使用了SSL来加密了。

  

2. 检查所有网络包的内容,我们是找不到Password的,也就是说网络上传输的不再是明文而是加密过的内容。

  

需要注意的一点是,SQL Server自动生成的证书是一种自签名的证书,而通过自签名证书实现的SSL并不能提供很强的安全性。他对中间人攻击(man-in-the-middle attack)不具有抵抗能力。因此我们建议在生产环境中,应该手动给SQL Server配置证书,而不是让它使用自动生成的证书。关于更多SQL Server配置证书的内容,可以参考这里

 

关于建立连接后的加密,会在下一篇文章中继续。