问题引入

在SQL Server关系型数据库中,我们可以使用透明数据加密(TDE)、行级别加密(Row-level Security)、数据打码(Dynamic Data Masking)和备份加密(Backup Encryption)等技术来实现数据库引擎层的安全。但是,在网络传输层,客户端和服务端之前默认没有数据加密传输保护。因此,为了提高链路安全性,我们可以启用SSL(Secure Sockets Layer)加密,SSL在传输层对网络连接进行加密,能提升数据通道的安全性,但同时会增加网络连接响应时间和CPU开销。

为了方便观察,我们使用Microsoft Network Monitor 3.4(以下简称MNM)工具来观察网络传输层事件,如果您已经安装MNM,请跳过该准备工作部分。

首先,我们从微软官网,根据需要下载对应的版本,我们这里下载64 bit版本,NM34_x64.exe。 接下来,安装MNM,直接执行NM34_x64.exe,然后按照向导完成安装。

最后,重启OS。

启用SSL证书之前

在启用SSL证书加密之前,客户端和SQL Server服务端的网络传输层默认没有加密保护的,我们可以通过如下步骤验证。

 创建测试表

 新建MNM抓取

 连接查询测试

 MNM中检查

 动态视图查看加密状态

为了测试方便,我们首先创建测试表CustomerInfo,存入三个客户敏感信息,包含客户名称和客户电话号码。

新建MNM抓取

打开MNM,点击New Capture,然后Start,启动网络层时间抓取。

从客户端,连接上对应的SQL Server,执行下面的查询语句,以便观察MNM抓取情况。

02.png

MNM中检查

我们仔细观察MNM中的事件,发现在客户机和SQL Server服务端的网络传输层,使用的明文传输,如下截图:

从图中右下角红色方框中,我们可以清清楚楚的看到了这三个客户的姓名和对应的手机号码,我们使用MNM看到数据在网络传输层以明文传送,并未做任何加密,可能会存在数据被窃听的风险。

当然,您也可以从SQL Server的连接动态视图看出,连接并未加密:

04.png

从MNM和SQL Server动态视图我们可以得出相同的结论是:客户端和SQL Server服务端数据在网络传输层默认以明文传送,并未加密传输,可能会存在数据被窃听的风险。那么,我们可以启动SSL证书来加密数据传输,以达到更为安全的目的。

启动SSL证书,分为以下几个部分:

 证书申请

 强制所有连接使用SSL

 加密特定客户端连接

证书申请

Start –> 输入:mmc.exe -> File -> Add/Remove Snap-ins -> Certificate -> add -> Computer account -> Next -> Local Computer -> Finish -> OK

展开Certificates -> 右键 Personal -> 选择 All Tasks -> 选择Request New Certificate -> 点击 Next -> 选中 Computer -> 点击Enroll -> 点击Finish。 右键点击对应证书 -> 选中All Tasks -> 选择Manage Private Keys… -> 授予 read 权限给本地账号NT Service\MSSQLSERVER。

强制所有连接加密

06.png

重启SQL Service

强制所有连接设置完毕后,如果想要立即生效,请重启SQL Service。 注意: 这里需要特别注意,如果是目前线上正常运行的应用,请慎重测试后,打开强制所有连接使用SSL。

加密特定客户端连接

当然,您也可以不用打开强制所有的连接使用SSL,转而使用加密特定的客户端连接,这里以SSMS连接工具为例。

客户端导入证书

Start -> Run -> 输入:certmgr.msc -> 右键选择Trusted Root Certification Authorities -> All Tasks -> Import

选择SQL Server服务端生成的证书文件

08.png

Next -> Finish -> OK

SSMS启用加密连接

在SSMS连接服务端界面 -> 选择Options

然后选择Encrypt connection

10.png

然后,参照“连接查询测试”中方法进行连接测试。同样在连接管理视图中查看,我们可以看到连接已经加密:

至此,使用SSL证书加密加密客户端和SQL Server服务端连接的实验成功。

注意事项

本期月报我们分享了如何启用SSL证书,来加密客户端和SQL Server服务端连接,提升网络传输层通信安全,使得数据在传输过程中被加密后,以密文传送,最大限度保证了链路安全。