MySQL的SSL加密连接与性能开销
本文转载自:http://www.innomysql.net/article/23959.html
(只作转载, 不代表本站和博主同意文中观点或证实文中信息)
前言
在生产环境下,安全总是无法忽视的问题,数据库安全则是重中之重,因为所有的数据都存放在数据库中。MySQL在5.7版本之前对于安全问题的确考虑并不充分,导致存在比较大的隐患,比如下面的这些问题,可能有些小伙伴知道,有些却还不知道:
1.MySQL数据库默认安装的用户密码为空
2.所有用户拥有对于MySQL默认安装test数据库的访问权限(即使没有授予权限)
好在Oracle官方也已经意识到安全的重要性,MySQL 5.7开始安装完成后的root用户的密码不再是空,而是在安装时随机产生一个密码,这也导致了用户安装5.7时发现的与5.6版本比较大的一个不同点。其次,官方已经删除了test数据库,默认安装完后是没有test数据库的。更为重要的是,MySQL 5.7版本提供了更为简单SSL安全访问配置,并且默认连接就采用SSL的加密方式。
何为SSL
首先看下维基百科是如何定义SSL的:
Transport Layer Security (TLS) and its predecessor, Secure Sockets Layer (SSL), both of which are frequently referred to as ‘SSL’, are cryptographic protocols designed to provide communications security over a computer network.
从上面的定义来看,SSL指的是SSL/TLS,其是一种为了在计算机网络进行安全通信的加密协议。假设用户的传输不是通过SSL的方式,那么其在网络中以明文的方式进行传输,而这给别有用心的人带来了可乘之机。所以,现在很多网站其实默认已经开启了SSL功能,比如Facebook、Twtter、YouTube、淘宝等。
在数据库领域,之前Inside君去某公司做技术交流时,该公司介绍其运维平台能够对一些敏感字段做处理,比如取出的密码或资金数据用***来表示,那么DBA就无法看到这部分的私人数据内容。这本身是一个很不错的安全处理方式,但若DBA在本地装一个类似tcpdump的工具,则依然能够通过获取得到的包得到想要的数据。因此,除了在程序端进行展示的安全处理,还需在MySQL服务器端开启安全的加密通信功能,这时就是SSL发挥功能的时候了。
MySQL 5.7的SSL配置与使用
如果仔细阅读MySQL 5.7的安装文档INSTALL-BINARY,会发现5.7的安装文档在初始化数据目录之后还额外多做了一个操作,这是之前版本所没有的操作,而该步骤即是对于SSL的安装与配置:
|
1
2
3
4
|
......shell> bin/mysqld --initialize --user=mysqlshell> bin/mysql_ssl_rsa_setup...... |
运行完命令mysql_ssl_rsa_setup后会发现数据目录下多出了一些以pem结尾的文件,而这些文件就是开启SSL连接所需要的文件:
|
1
2
3
4
5
6
7
8
9
|
root@test-1:/usr/local/mysql/data# ls -lh *.pem-rw------- 1 mysql mysql 1.7K Nov 25 14:12 ca-key.pem-rw-r--r-- 1 mysql mysql 1.1K Nov 25 14:12 ca.pem-rw-r--r-- 1 mysql mysql 1.1K Nov 25 14:12 client-cert.pem-rw------- 1 mysql mysql 1.7K Nov 25 14:12 client-key.pem-rw------- 1 mysql mysql 1.7K Nov 25 14:12 private_key.pem-rw-r--r-- 1 mysql mysql 451 Nov 25 14:12 public_key.pem-rw-r--r-- 1 mysql mysql 1.1K Nov 25 14:12 server-cert.pem-rw------- 1 mysql mysql 1.7K Nov 25 14:12 server-key.pem |
若这时启动MySQL数据库并启动应该可以发现如下状态:
|
1
2
3
4
5
6
7
|
mysql>SHOW VARIABLES LIKE 'have_ssl';+---------------+-------+| Variable_name | Value |+---------------+-------+| have_ssl | YES |+---------------+-------+1 row in set (0.00 sec) |
该参数表示MySQL服务器开启了SSL功能,而在MySQL 5.7版本下默认就会使用SSL的方式来进行连接,比如:
|
1
2
3
4
5
6
7
8
9
|
root@test-1:~# mysql -h10.166.224.32 -udavidmysql> \s--------------mysql Ver 14.14 Distrib 5.7.9, for linux-glibc2.5 (x86_64) using EditLine wrapperConnection id: 6119Current database:Current user: david@10.166.224.32SSL: Cipher in use is DHE-RSA-AES256-SHA...... |
通过STATUS的SSL列就能判断连接的用户是否使用了SSL,比如上述例子中的Cipher in use is DHE-RSA-AES256-SHA就表示当前david用户是通过SSL的方式进行连接。若在创建用户时,希望该用户每次必须通过SSL方式,则需在创建用户通过REQUIRE SSL来进行设置,对于上述的david用户,可以通过如下方式来进行修改以确保每次通过SSL进行连接,强制不使用SSL进行连接则报错:
|
1
2
3
4
|
mysql> ALTER USER david@'%' REQUIRE SSL;......root@test-1:~# mysql -h10.166.224.32 -udavid --ssl=0ERROR 1045 (28000): Access denied for user 'david'@'10.166.224.32' (using password: YES) |
MySQL 5.6同样支持以SSL的方式进行连接,但是操作相对5.7较为复杂,用户需要自己通过openssl命令来创建各类公密钥,具体可以查看相关官方文档。
SSL性能测试
相信很多小伙伴关心开启SSL加密连接后的性能表现,不可否认的是启用SSL加密连接后,性能必然会有下降。这里的测试采用全内存SELECT主键的方式,因此可以认为是最坏情况的SSL性能开销:
上述的测试是在Inside君的云主机环境下,云主机配置只有4核CPU,故QPS值整体不高,但是应该能够发现开启SSL后的性能开销在25%左右。
另外,由于SSL开销较大的环节在建立连接,所以短链接的开销可能会更大,因此推荐使用长连接或者连接池的方式来减小SSL所带来的额外开销,不过好在MySQL的应用习惯大部分也是长连接的方式。
总结
- MySQL 5.7配置SSL要比5.6来的简单的多
- MySQL 5.7客户端默认开启SSL加密连接
- 通常来说,开启SSL加密连接后,性能最大的开销在25%左右
MySQL的SSL加密连接与性能开销的更多相关文章
- MSSQL - 最佳实践 - 使用SSL加密连接
MSSQL - 最佳实践 - 使用SSL加密连接 author: 风移 摘要 在SQL Server安全系列专题月报分享中,往期我们已经陆续分享了:如何使用对称密钥实现SQL Server列加密技术. ...
- mysql建立ssl安全连接的配置
mysql建立ssl安全连接的配置 1.环境.IP.安装包: centOS 5.4 虚拟机了两台服务器 mysql-5.1.48.tar.gz openssl-0.9.8b.tar.gz server ...
- MySQL PROFILE 跟踪语句各阶段性能开销
PROFILE 可以跟踪查询语句各个阶段 Time,IO,CPU,MEMORY 等资源使用情况,比较详细.所以系统一般不会记录太多.启用是全局的,所以每个连接都保持语句的资源使用情况. 查看 PRO ...
- 36. ClustrixDB 使用ClustrixDB加密连接
ClustrixDB使用sha256_password插件支持SSL和身份验证. 一些安全规则要求对存储在数据库中的用户密码进行更强的保护.与默认的mysql_native_password插件相比, ...
- Tomcat配置https加密连接
配置https安全连接(ssl加密连接) https连接需要用到数字证书与数字签名(MD5算法),网站https连接首先需要申请数字证书,配置加密连接器,浏览器安装证书. 证书运用到RSA技术,RSA ...
- 使用mqtt+ssl加密 WebSocket 客户端连接 MQTT 服务器以及ws+wss协议
上篇用TLS/SSL保证EMQ的网络传输安全讲了使用自签ca加密MQTT传输数据,如果mqtt用在web端,如何使用ssl.tsl加密? 1.web客户端 // 引入mqtt.min.js // 将在 ...
- Mysql 5.7 使用SSL安全连接
MySQL默认的数据通道是不加密的,在一些安全性要求特别高的场景下,我们需要配置MySQL端口为SSL,使得数据通道加密处理,避免敏感信息泄漏和被篡改.当然,启用MySQL SSL之后,由于每个数据包 ...
- mysql 建立加密连接
加密连接可提高数据的安全性,但会降低性能.要进行加密连接,必须满足以下要求: user权限表里要有相关的SSL数据列.如果安装的MySQL服务器是4.0.0版的,user权限表已包含相关的SSL数据列 ...
- Mysql 5.7.18 加密连接mysql_ssl_rsa_setup
MySQL 5.7.18 下载地址: https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.18-linux-glibc2.5-x86_64. ...
随机推荐
- MVVM架构~目录
回到占占推荐博客索引 MVVM在概念上是真正将页面与数据逻辑分离的模式,在开发方式上,它是真正将前台代码开发者(JS+HTML)与后台代码开发者分离的模式(asp,asp.net,php,jsp).在 ...
- 查看html元素绑定的事件与方法的利器
WEB标准提倡结构.表现和行为相 分离,现在越来越多采用这种表现和行为的方式,但它也为我们开发调试带来一些问题,网页载入一堆JavaScript,,我们很难搞清楚最后在哪些元素的哪个动作绑定了事件,尤 ...
- KnockoutJS 3.X API 第七章 其他技术(3) 延迟更新
.example { display: inline-block; padding: 1em; margin-right: 2em; background: #F6F6EF; } 注意:本文档适用于K ...
- Sql Server系列:通用表表达式CTE
1 CTE语法WITH关键字 通用表表达式(Common Table Express, CTE),将派生表定义在查询的最前面.要使用CTE开始创建一个查询,可以使用WITH关键字. CTE语法: WI ...
- C#设计模式系列:原型模式(Prototype)
1.原型模式简介 1.1>.定义 原型模式(Prototype)用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象. 1.2>.使用频率 中 1.3>.原型模式应用 首先 ...
- jQuery源码分析系列:Callback深入
关于Callbacks http://www.cnblogs.com/aaronjs/p/3342344.html $.Callbacks()的内部提供了jQuery的$.ajax() 和 $.Def ...
- OPENVPN+MYSQL认证+客户端配置
安装环境:ubuntu 12.04 x64 一 服务器端 1.安装openvpn及相应包 1 2 root@jkb:~# aptitude install openvpn root@jkb:~# ap ...
- 【原创】开源Math.NET基础数学类库使用(05)C#解析Delimited Formats数据格式
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- C#线程同步手动重置事件——ManualResetEvent
和AutoResetEvent类的区别是,Manual一旦set后不会自动reset,会放行所有waitone的线程,而autoresetevent每一次set之后只会放行一个waitone的线程,然 ...
- 简单测试nginx1.90做TCP协议负载均衡的功能
最近工作中需要做TCP层面的负载均衡,以前网站用的反向代理nginx只支持应用层的负载均衡,对于TCP协议是无能为力的,需要使用LVS(linux虚拟服务器). LVS的特点是高性能和极复杂的配置.对 ...