我们开通RDS数据库服务后,客户端访问数据库服务时,考虑到数据安全性,会采用ssl方式连接数据库。
01 什么是SSL?SSL(Secure Socket Layer:安全套接字层)利用数据加密、身份验证和消息完整性验证机制,为基于TCP等可靠连接的应用层协议提供安全性保证。
SSL协议提供的功能主要有:
1、 数据传输的机密性:利用对称密钥算法对传输的数据进行加密,确保数据在网络上之传输过程中不会被截取及窃听。
2、身份验证机制:基于证书利用数字签名方法对服务器和客户端进行身份验证,其中客户端的身份验证是可选的。
3、消息完整性验证:消息传输过程中使用MAC算法来检验消息的完整性。
02 为何要用SSL连接到RDS数据库服务?如果用户的传输不是通过SSL的方式,那么其在网络中数据都是以明文进行传输的,而这给别有用心的人带来了可乘之机。所以,现在很多大型网站都开启了SSL功能。同样地,在我们数据库方面,如果客户端连接服务器获取数据不是使用SSL连接,那么在传输过程中,数据就有可能被窃取。
03 测试环境准备以mysql数据库服务为例,在天翼云门户开通MySQL数据库服务和带公网ip的ECS主机,关于ECS通过内网如何访问RDS服务,参考之前发的文章:
天翼云默认MySQL服务器端打开SSL开关,用户使用客户端连接时,可根据需要是否使用SSL连接。
登录到mysql数据库,查询ssl开关是否打开。
[root@ecs-828b ~]# mysql -h 192.168.0.143 -P 3306 -u root -pTest@1234mysql [(none)]> show global variables like '%ssl%'; --------------- ---------------- | Variable_name | Value | --------------- ---------------- | have_openssl | YES || have_ssl | YES || ssl_ca | /CA/ca.pem || ssl_capath | || ssl_cert | /CA/server.pem || ssl_cipher | || ssl_crl | || ssl_crlpath | || ssl_key | /CA/server.key | --------------- ---------------- 9 rows in set (0.01 sec)
have_ssl参数为YES,表示ssl开关是打开的状态。
接下来我们对不使用SSL和使用SSL两种情况来分别阐述。
04 不使用SSL连接RDS数据库服务采用非ssl方式连接到mysql数据库,并查询数据库的状态:
[root@ecs-828b ~]# mysql -h 192.168.0.143 -P 3306 -u root -pTest@1234MySQL [(none)]> s--------------mysql Ver 15.1 Distrib 5.5.60-MariaDB, for Linux (x86_64) using readline 5.1Connection id: 3777Current database:Current user: root@192.168.0.199SSL: Not in useCurrent pager: stdoutUsing outfile: ''Using delimiter: ;Server: MySQLServer version: 5.7.23-3-log MySQL Community Server - (GPL)Protocol version: 10Connection: 192.168.0.143 via TCP/IPServer characterset: utf8Db characterset: utf8Client characterset: utf8Conn. characterset: utf8TCP port: 3306Uptime: 1 hour 15 min 55 secSSL: Not in use 表示此时的连接为非ssl,
不使用SSL的连接,会比较容易地通过网络抓包工具获取数据,导致数据泄密。
05 使用SSL连接RDS数据库服务1. 登录云数据库MySQL。
2. 下载SSL根证书:在“实例管理”页面,单击实例名称进入“基本信息”页面,单击“实例信息”模块“SSL”处的,下载并解压根证书。
3、登录到ecs上,把解压的证书ca.pem上传到ecs的某个目录下,比如/home目录。
4、在/home目录下执行指定ssl证书的mysql连接:
[root@ecs-828b home]# mysql -h 192.168.0.143 -P 3306 -u root -pTest@1234 --ssl-ca=ca.pem
这里--ssl-ca=是ssl证书参数,后面是ssl证书文件名,该文件需放在执行该命令的路径下。
登录成功后,查询mysql当前登录状态:
MySQL [(none)]> s--------------mysql Ver 15.1 Distrib 5.5.60-MariaDB, for Linux (x86_64) using readline 5.1Connection id: 4187Current database:Current user: root@192.168.0.199SSL: Cipher in use is ECDHE-RSA-AES256-GCM-SHA384Current pager: stdoutUsing outfile: ''Using delimiter: ;Server: MySQLServer version: 5.7.23-3-log MySQL Community Server - (GPL)Protocol version: 10Connection: 192.168.0.143 via TCP/IPServer characterset: utf8Db characterset: utf8Client characterset: utf8Conn. characterset: utf8TCP port: 3306Uptime: 1 hour 24 min 14 secSSL: Cipher in use is ECDHE-RSA-AES256-GCM-SHA384表示该用户是采用SSL连接到mysql服务器上的。
06 SSL性能损耗网上找了有关mysql开启ssl后的性能测试数据,开启SSL后,数据库QPS平均降低了23%左右,相对还是比较影响性能的。从SSL实现方式来看,建立连接时需要进行握手、加密、解密等操作。所以耗时基本都在建立连接阶段,这对于使用短链接的应用程序可能产生更大的性能损耗,比如采用PHP开发。不过如果使用连接池或者长连接可能会好许多,建议:
- 对于非常敏感核心的数据,或者QPS本来就不高的核心数据,可以采用SSL方式保障数据安全性;
- 对于采用短链接、要求高性能的应用,或者不产生核心敏感数据的应用,性能和可用性才是首要,建议不要采用SSL方式。
术语:QPS每秒查询率(Query Per Second)
每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。对应fetches/sec,即每秒的响应请求数,也即是最大吞吐能力。
,