MSSQL – 最佳实践 – 使用SSL加密连接

mssql – 最佳实践 – 使用ssl加密连接

author: 风移

摘要

在sql server安全系列专题月报分享中,往期我们已经陆续分享了:如何使用对称密钥实现sql server列加密技术、使用非对称密钥实现sql server列加密、使用混合密钥实现sql server列加密技术、列加密技术带来的查询性能问题以及相应解决方案、行级别安全解决方案、sql server 2016 dynamic data masking实现隐私数据列打码技术、使用证书做数据库备份加密和sql server always encrypted这八篇文章,直接点击以上文章前往查看详情。本期月报我们分享sql server ssl证书连接加密技术,实现网络上传输层连接加密。

问题引入

在sql server关系型数据库中,我们可以使用透明数据加密(tde)、行级别加密(row-level security)、数据打码(dynamic data masking)和备份加密(backup encryption)等技术来实现数据库引擎层的安全。但是,在网络传输层,客户端和服务端之前默认没有数据加密传输保护。因此,为了提高链路安全性,我们可以启用ssl(secure sockets layer)加密,ssl在传输层对网络连接进行加密,能提升数据通道的安全性,但同时会增加网络连接响应时间和cpu开销。

准备工作

为了方便观察,我们使用microsoft network monitor 3.4(以下简称mnm)工具来观察网络传输层事件,如果您已经安装mnm,请跳过该准备工作部分。
首先,我们从微软官网下载mnm,根据需要下载对应的版本,我们这里下载64 bit版本,nm34_x64.exe。
接下来,安装mnm,直接执行nm34_x64.exe,然后按照向导完成安装。
最后,重启os。

启用ssl证书之前

在启用ssl证书加密之前,客户端和sql server服务端的网络传输层默认没有加密保护的,我们可以通过如下步骤验证。
 创建测试表
 新建mnm抓取
 连接查询测试
 mnm中检查
 动态视图查看加密状态

创建测试表

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

use [testdb]
go
if object_id('dbo.customerinfo', 'u') is not null
    drop table dbo.customerinfo
create table dbo.customerinfo
(
customerid        int identity(10000,1)    not null primary key,
customername    varchar(100)            not null,
customerphone    char(11)                not null
);

-- init table
insert into dbo.customerinfo 
values ('customera','13402872514')
,('customerb','13880674722')
,('customerc','13487759293')
go

新建mnm抓取

打开mnm,点击new capture,然后start,启动网络层时间抓取。

连接查询测试

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

use [testdb]
go
select * from dbo.customerinfo with(nolock)

执行结果如下:

mnm中检查

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

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

动态视图查看连接状态

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

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

启用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 servicemssqlserver。

强制所有连接使用ssl

强制所有连接加密

在sql server服务器上,start -> run -> sqlservermanager13.msc -> 右键点击protocols for mssqlserver -> flags中将force encryption设置为yes -> certificate选项卡中选择证书 -> ok

重启sql service

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

加密特定客户端连接

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

客户端导入证书

start -> run -> 输入:certmgr.msc -> 右键选择trusted root certification authorities -> all tasks -> import

选择sql server服务端生成的证书文件

next -> finish -> ok

ssms启用加密连接

在ssms连接服务端界面 -> 选择options

然后选择encrypt connection

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

至此,使用ssl证书加密加密客户端和sql server服务端连接的实验成功。

注意事项

由于使用了ssl证书来加密客户端和sql server服务端连接,在提升数据通信的安全性同时,加密解密操作也会导致网络连接响应时间增加和cpu使用率上升,对业务系统有一定的性能影响。因此,建议您仅在外网链路有加密需求的时候启用ssl加密,内网链路相对较安全,一般无需对链路加密。

最后总结

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

如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:yqgroup@service.aliyun.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐