MySQL开启SSL的利与弊

2023-05-16

最近,准备升级一组MySQL到5.7版本,在安装完MySQL5.7后,在其data目录下发现多了很多.pem类型的文件,然后通过查阅相关资料,才知这些文件是MySQL5.7使用SSL加密连接的。本篇主要介绍MySQL5.7 SSL连接加密功能、如何使用?以及使用SSL的一些注意点。

我们知道,MySQL5.7之前版本,安全性做的并不够好,比如安装时生成的root空密码账号、存在任何用户都能连接上的test库等,导致数据库存在较大的安全隐患。好在5.7版本对以上问题进行了一一修复。与此同时,MySQL 5.7版本还提供了更为简单SSL安全访问配置,且默认连接就采用SSL的加密方式,这让数据库的安全性提高一个层次。

一、SSL介绍

SSL(Secure Socket Layer:安全套接字层)利用数据加密、身份验证和消息完整性验证机制,为基于TCP等可靠连接的应用层协议提供安全性保证。

SSL协议提供的功能主要有:

           1、 数据传输的机密性:利用对称密钥算法对传输的数据进行加密。
           2.、身份验证机制:基于证书利用数字签名方法对服务器和客户端进行身份验证,其中客户端的身份验证是可选的。
           3、 消息完整性验证:消息传输过程中使用MAC算法来检验消息的完整性。

如果用户的传输不是通过SSL的方式,那么其在网络中数据都是以明文进行传输的,而这给别有用心的人带来了可乘之机。所以,现在很多大型网站都开启了SSL功能。同样地,在我们数据库方面,如果客户端连接服务器获取数据不是使用SSL连接,那么在传输过程中,数据就有可能被窃取。

二、MySQL5.7 SSL配置和启用

1、安装时启动SSL 

在MySQL5.7安装初始化阶段,我们发现比之前版本多了一步操作,而这个操作就是安装SSL的。


shell> bin/mysqld --initialize --user=mysql    # MySQL 5.7.6 and upshell> bin/mysql_ssl_rsa_setup                 # MySQL 5.7.6 and up  

当运行完这个命令后,默认会在data_dir目录下生成以下pem文件,这些文件就是用于启用SSL功能的:

复制代码


# ll rwrwrrwrrw#客户端连接服务器端需要提供的私钥文件
-rw    #私钥/公钥对的私有成员
rwr     #私钥/公钥对的共有成员
rwr    #服务器端证书文件
rw  

复制代码

 这时从数据库服务器本地进入MySQL命令行,你可以看到如下变量值:

复制代码


root> mysql -h 10.126.xxx.xxx -udba -p
dba:(none) show global variables   Variable_name  Value            have_openssl   YES                         ssl_ca         ca.pem           ssl_capath                      ssl_cert       servercert.pem  ssl_cipher                      ssl_crl                         ssl_crlpath                     ssl_key        server.pem  

dba:(none)> \s
--------------
/usr/local/mysql/bin/mysql  Ver 14.14 Distrib 5.7.18, for linux-glibc2.5 (x86_64) using  EditLine wrapper

Connection id:          2973
Current database:
Current user:           dba@10.126.xxx.xxx
SSL:                    Cipher in use is DHE-RSA-AES256-SHA #表示该dba用户是采用SSL连接到mysql服务器上的,如果不是ssl,那么会显示“Not in use“
Current pager:          more
Using outfile:          ''
Using delimiter:        ;
Server version:         5.7.18-log MySQL Community Server (GPL)
Protocol version:       10
Connection:             10.126.126.160 via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:               3306
Uptime:                 2 hours 35 min 48 sec

复制代码

【注意】:如果用户是采用本地localhost或者sock连接数据库,那么不会使用SSL方式了。

2、如果安装MySQL57时没有运行过mysql_ssl_rsa_setup,那么如何开启SSL呢?


1)、关闭MySQL服务2)、运行mysql_ssl_rsa_setup 命令3)、到data_dir目录下修改.pem文件的所属权限用户为mysql
    chown -R mysql.mysql *.pem4)、启动MySQL服务  

3、强制某用户必须使用SSL连接数据库


#修改已存在用户 
ALTER USER 'dba'@'%' REQUIRE SSL;
#新建必须使用SSL用户grant select on *.* to 'dba'@'%' identified by 'xxx' REQUIRE SSL;  

对于上面强制使用ssl连接的用户,如果不是使用ssl连接的就会报错,像下面这样:


[root]# /usr/local/mysql/bin/mysql -udba -p -h10.126.xxx.xxx --ssl=0Enter password: 
ERROR 1045 (28000): Access denied for user 'dba'@'10.126.xxx.xxx' (using password: YES)  

三、未使用SSL和使用SSL安全性对比

【测试方式】在MySQL服务器端通过tshark抓包的方式来模拟窃取数据。验证、对比 未使用SSL和使用SSL两者在安全性上有什么不同?

    1 未使用SSL情况:

          在客户端机器(10.126.126.161)上连接数据库并进行insert操作,使用--ssl-mode=DISABLED关闭SSL

          同时在MySQL服务器端(10.126.126.160)上用tshark进行抓包:

【结论】未使用SSL情况下,在数据库服务器端可以通过抓包的方式获取数据,安全性不高。

    2 采用SSL情况:    

       在客户端机器(10.126.126.161)上连接数据库并进行insert操作, 使用--ssl-mode=REQUIRED指定SSL

       同时在MySQL服务器端(10.126.126.160)上再次用tshark进行抓包:

【结论】没有抓到该语句,采用SSL加密后,tshark抓不到数据,安全性高。

四、 使用SSL前后性能对比(QPS)

服务器配置:CPU:32核心       内存:128G      磁盘:SSD

为了尽量准确测试QPS,采用全内存查询,因为我们线上热点数据基本都在内存中;按照并发线程数分类:1线程、4线程、8线程、16线程、24线程、32线程、64线程;

具体数据如下:

从测试数据可以发现,开启SSL后,数据库QPS平均降低了23%左右,相对还是比较影响性能的。从SSL实现方式来看,建立连接时需要进行握手、加密、解密等操作。所以耗时基本都在建立连接阶段,这对于使用短链接的应用程序可能产生更大的性能损耗,比如采用PHP开发。不过如果使用连接池或者长连接可能会好许多。

五、总结

1、MySQL5.7默认是开启SSL连接,如果强制用户使用SSL连接,那么应用程序的配置也需要明确指定SSL相关参数,否则程序会报错。

2、虽然SSL方式使得安全性提高了,但是相对地使得QPS也降低23%左右。所以要谨慎选择:

      2.1、对于非常敏感核心的数据,或者QPS本来就不高的核心数据,可以采用SSL方式保障数据安全性;

      2.2、对于采用短链接、要求高性能的应用,或者不产生核心敏感数据的应用,性能和可用性才是首要,建议不要采用SSL方式;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL开启SSL的利与弊 的相关文章

随机推荐

  • c语言中四种简单的数组排序

    前言 本文介绍了几种c语言中对乱序数组的排序方式 具体的内容有 xff1a 插入排序 xff1b 冒泡排序 xff1b 选择排序 xff1b 希尔排序 xff1b 具体内容详见下文 一 插入排序 1 思路 首先假设数组的的前n位元素是有序的
  • 网桥的功能和分类

    br lan 61 lan 网桥 将WLAN和LAN 交换机 绑定为一个虚拟接口 连接两个局域网 xff0c 负责数据的中继和转发 交换机的前生 集线器 xff08 Hub xff09 是中继器的一种形式 xff0c 区别在于集线器能够提供
  • Java简介

    今天开始学习Java啦 xff0c 每天进步一点点 xff01 1 Java语言发展史 Java语言是美国Sun Stanford University Network 公司在1995年推出的计算机语言 xff0c java之父 xff1a
  • win10上WSL+vscode+xserver配置linux图形化程序开发环境

    受够了双系统来回切换 xff0c 尝试了一下wsl配置linux环境 xff08 个人习惯在linux上敲代码 xff09 xff0c 由于需求图形化 xff0c 又弄了xserver 没有装linux图形界面 WSL 安装按着官方的文档来
  • 02.Ubuntu 18.04安装KVM

    02 Ubuntu 18 04安装KVM 1 检查是否支持虚拟化 span class token function egrep span span class token parameter variable c span span cl
  • maven 打包缺失 resources 目录下的 jar 包,警告 jar should not point at files within the project directory

    报错如下 INFO Scanning for projects WARNING WARNING Some problems were encountered while building the effective model for co
  • Linux 下利用trash替换rm

    前言 rmtrash 是linux和mac下命令行版本rm的回收站 xff0c 安装后对用户透明 xff0c 符合正常使用rm的习惯 支持rm fr file哦 xff0c 有了他再也不怕rm时候手颤抖了 能自动拒绝 rm fr 哦 安装
  • 【异常】记一次前端因资源无法加载导致白屏异常问题

    一 背景 自从运维同事强烈要求前端的环境要使用多套的 xff0c 参考文章 项目 参考若依的前端框架去多环境 于是一番捣鼓与改造之后 xff0c 看似已经顺利了 但运维说 xff0c 前端还是有问题 xff0c 需要他帮我改下 xff0c
  • 三种方法实现后入先出的栈---leetcode题解225

    声明 xff1a 问题描述来源于leetcode 一 问题描述 xff1a 用队列实现栈 CategoryDifficultyLikesDislikesalgorithmsEasy 67 64 480 Tags stack design C
  • iOS|开发小技巧之UIView创建xib

    我们有的时候在创建UIView的时候 xff0c 想要使用xib进行创建视图发现 xff0c xib文件不能和UIView文件一起创建 所以 xff0c 我们要单独创建xib文件 我们选择Empty文件 xff0c 而不要选择View文件
  • PyCharm中安装Vim插件ideavim 并关闭vim编辑模式

    在PyCharm中安装Vim插件ideavim 进入File菜单下的Settings下的Plugins 搜索ideaVim 找到ideaVim插件 点击Install安装 重启并享受在Pycharm环境中使用Vim的乐趣 支持Vim三种模式
  • C++ typedef用法小结 (※不能不看※)

    第一 四个用途 用途一 xff1a 定义一种类型的别名 xff0c 而不只是简单的宏替换 可以用作同时声明指针型的多个对象 比如 xff1a char pa pb 这多数不符合我们的意图 xff0c 它只声明了一个指向字符变量的指针 xff
  • 中兴F450电信光猫改桥接模式

    前几天突然想搞外网访问 xff0c 但是电信这款光猫DMZ不能用让我很愁 xff0c 后来经过一番了解可以让光猫只负责光数转换 xff0c 剩下的事情交给路由 xff0c 但是要把光猫设置成桥接模式 这个光猫比较特殊不需要进入超级管理员只需
  • 群辉默认DDNS功能解析阿里云-自定义服务商

    前言 前不久买了个群辉NAS发现群辉DDNS不能解析阿里云 xff0c 后来找了很多教程都是部署Docker或使用其他平台转发一下 xff0c 然而这些平台还要注册 xff0c 我就在想我自己可不可以实现不需要注册就可以使用的DDNS xf
  • Debian 给非 ROOT 用户添加 sudoer 权限

    问题描述 从官方镜像安装的 Debian 9 xff08 Stretch xff09 比较纯净 xff0c 但因此需要自己安装 配置许多常用的 Linux 应用 xff0c 这里就需要 sudo xff08 super user do xf
  • ffmpeg Could not find codec parameters for stream

    在arm上使用ffmpeg rtmp拉流时出现了下面异常 xff1a flv 64 0x1b0e120 Could not find codec parameters for stream 2 Video h264 none 2560 kb
  • 五、Shell自动化脚本

    一键安装Nginx 脚本 install nginx sh span class token shebang important bin bash span span class token comment Use 使用Shell脚本一键安
  • Mysql数据库备份(一)------数据库备份和表备份

    一 Mysql中的数据备份 Mysql中数据备份使用的命令是 mysqldump 命令将数据库中的数据备份成一个文本文件 表的结构和表中的数据将存储在生成的文本文件中 mysqldump命令的 工作原理很简单 它先查出需要备份的表的结构 x
  • mysql如何查看自己数据库文件所在的位置

    本文详细讲解了如何查找mysql数据库真实物理文件的存储位置 xff0c 只要我们直接复制数据库文件 xff0c 即可对数据库进行搬迁 xff0c 也可以对数据库文件的存放位置进行改变 工具 原料 mysql数据库 方法 步骤 第1步 xf
  • MySQL开启SSL的利与弊

    最近 xff0c 准备升级一组MySQL到5 7版本 xff0c 在安装完MySQL5 7后 xff0c 在其data目录下发现多了很多 pem类型的文件 xff0c 然后通过查阅相关资料 xff0c 才知这些文件是MySQL5 7使用SS