• https://www.cnblogs.com/gered/p/13595098.html#_label1_0

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

author: 风移

说明

应用程序通过未加密的通道与数据库服务器通信, 这可能会造成重大的安全风险。在这种情况下, 攻击者可以修改用户输入的数据, 甚至对数据库服务器执行任意 SQL 命令。
例如,当您使用以下连接字符串时,就可能存在这种风险:

<connectionStrings>
<add name="Test" connectionString="Data Source=210.10.20.10,1433; Initial Catalog=myDataBase;User ID=myUsername;Password=myPassword;" providerName="System.Data.SqlClient" />
</connectionStrings>

程序连接串启用SSL/TLS加密连接

大部分数据库服务器都提供支持使用SSL/TLS来加密传输所有数据,您应当尽可能的使用它。在您的连接字符串上加上Encrypt=True即可。如果您的开发环境没有可信证书,加上TrustServerCertificate=True来取消验证证书是否受信。

<connectionStrings>
<add name="Test" connectionString="Data Source=210.10.20.10,1433; Initial Catalog=myDataBase;User ID=myUsername;Password=myPassword;Encrypt=True;" providerName="System.Data.SqlClient" />
</connectionStrings>

摘要

在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 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
 

【声明】

本标签系列全部转载自:http://www.mamicode.com/info-detail-2860727.html

【参考文档】

[转帖]【sql server安全】sql server连接加密,sql server SSL加密连接的更多相关文章

  1. (4.22)Microsoft 管理控制台启用 SSL 加密的 SQL Server 实例

    如何通过使用 Microsoft 管理控制台启用 SSL 加密的 SQL Server 实例 关键词:MSSQL加密,sql server加密,sql server客户端与服务器传输内容加密 转自:h ...

  2. vs连接服务器sql server数据库 web.config和代码

    方法一.在web.config里面配置,后连接数据库 (1)web.config文件:加在<connectionStrings>和</connectionStrings> 之间 ...

  3. Jmeter—8 连接microsoft sql server数据库取数据

    本文以Jmeter 连接microsoft sql server为例. 1 从微软官网下载Microsoft SQL Server JDBC Driver 地址:http://www.microsof ...

  4. 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

    由于项目中必须得用JDK6来作为Java环境,于是连接SQLServer时出现了com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安 ...

  5. java连接ms sql server各类问题解析

    首先先来说下使用微软自己开发的架包进行ms sql server数据库的连接时,sql 2000与sql 2005的连接方式略有不同: 1.首先驱动不一样,sql 2000的连接驱动包有三个,分别是: ...

  6. 在SQL Server 2008上安装ArcSDE 10.1并实现远程连接

    先安装SQL Server 2008 R2 X64(SP2),创建数据库实例,安装客户端. 再安装ArcSDE 10.1,ArcGIS Desktop 10.1,一切顺利. 由于Desktop是32位 ...

  7. Linux下安装SQL Server 2016(连接篇SQL Server on linux)

    连接数据库 (1)设置防火墙 要连接数据库,首先要打开防火墙上1433端口,也就是,增加tcp端口1433到公共区域,并且永久生效. [root@localhost Desktop]# firewal ...

  8. SQL Server 2008开启sa账户以及如何用JDBC进行连接

    做实验需要用Java与SQL Server连接,因为使用的 SQL 2008 Express Edition 是基于 Visual Studio2010 安装包安装时一起安装的,所以为了方便数据库的操 ...

  9. Perl/C#连接Oracle/SQL Server和简单操作

    连接数据库是一个很常见也很必须的操作.先将我用到的总结一下. 1. Perl 连接数据库 Perl 连接数据库的思路都是: 1)使用DBI模块: 2)创建数据库连接句柄dbh: 3)利用dbh创建语句 ...

  10. Jmeter入门8 连接microsoft sql server数据库取数据

    本文以Jmeter 连接microsoft sql server为例. 1 从微软官网下载Microsoft SQL Server JDBC Driver 地址:http://www.microsof ...

随机推荐

  1. HTB - CozyHosting - WriteUp

    CozyHosting 前言:抓紧赛季末上一波分,错过开vip才能练了 信息收集 扫描看看端口的开放情况,开了22,80,5555.这里fscan显示会跳转到cozyhosting.htb. 那就需要 ...

  2. ifconfig详解

    linux下ifconfig命令详解 ifconfig 是一个用来查看.配置.启用或禁用网络接口的工具,这个工具极为常用的.可以用这个工具来临时性的配置网卡的IP地址.掩码.广播地址.网关等.也可以把 ...

  3. Java 将Excel工作簿按工作表拆分为多个文档

    本文介绍在Java代码环境中如何将Excel工作簿按工作表拆分为多个Excel文档,即:把Excel工作簿中的每一个工作表单独保存为一个Excel工作簿文件. 思路及方法:通过将源文档中的每个工作表通 ...

  4. MySQL进阶篇:详解索引概述

    2.1 MySQL进阶篇:第二章_二.一_索引概述 2.1.1 介绍 索引(index)是帮助MySQL高效获取数据的数据结构(有序).在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些 ...

  5. MySQL 是如何实现RC事务隔离级别的

    摘要:Read Committed,事务运行期间,只要别的事务修改数据并提交,即可读到人家修改的数据,所以会有不可重复读.幻读问题. 本文分享自华为云社区<MySQL RC事务隔离级别的实现&g ...

  6. 火山引擎DataLeap如何解决SLA治理难题(二):申报签署流程与复盘详解

    申报签署流程详解 火山引擎DataLeap SLA保障的前提是先达成SLA协议.在SLA保障平台中,以申报单签署的形式达成SLA协议.平台核心特点是优化了SLA达成的流程,先通过"系统卡点计 ...

  7. 莉莉丝游戏与火山引擎 ByteHouse 达成合作,为实时数仓建设提速

    中国头部游戏公司莉莉丝游戏(Lilith Games)和火山引擎 ByteHouse 达成合作,共同致力于加速莉莉丝游戏的实时数仓建设.此次合作将利用 ByteHouse 的创新技术和功能,为莉莉丝的 ...

  8. NLog.config 配置

    NLog.confg 参考配置, NLog 热生效不需要重启服务 <?xml version="1.0" encoding="utf-8" ?> & ...

  9. 页面滚动,打包,appium工具

    ''' 移动到元素element对象的"底端",与当前窗口的"底部"对齐: 我们需要将页面下拉一个滑轮 ''' for y in range(3): js = ...

  10. k8s-部署 Kubernetes 集群(kubeadm方式)

    一 机器准备 IP 主机名 角色 配置 安装组件 192.168.198.150 master-1 master 2U2G master组件 etcd kubectl 192.168.198.151 ...