随着mysql8.0的使用,mysql更换了创建用户时默认的密码认证插件,从之前的mysql_native_password插件更换为caching_sha2_password插件。新的插件要求使用连接加密的方式用于mysql server与client之间的tcp连接,或者如果不满足使用加密连接的条件下,改为使用通过rsa加密的密码交换。首先来看看加密连接。
先看一张图:
上面这张图描述了SSL/TLS协议在TCP/IP模型中的位置,Mysql通过在服务端与客户端之间的连接上使用ssl/tls协议实现连接的加密。
TLS作为SSL协议的进化版,其基础也是基于RSA的身份认证与密码约定,而后使用约定密码进行数据的加密通信。为了使用TLS加密,Mysql需要使用到如下几个组件:
1,CA证书,通过使用CA证书来为server/client的数字证书进行签名,以达到server/client的相互认证;
2,server端证书,使用CA证书进行签名后的mysql服务器端证书;
3,client端证书,使用CA证书进行签名后的client端证书;mysql 虽然通常不需要对客户端身份进行认证,但是实现上是支持的;
4,OpenSSL工具包,开源社区贡献的SSL/TLS协议的代码实现。从MySQL 8.0.11 到8.0.17 ,mysql短暂支持wolfSSL 作为可选openssl实现,从8.0.18开始,wolfSSL被移除,唯一使用OpenSSL作为编译时使用的工具包;
5,mysql对于使用SSL/TLS引入的一些配置,包括加密连接开关、以及一系列系统变量:TLS协议版本、OpenSSL支持TLS不同版本使用的加密套件(Cipher/Ciphersuites)、认证类型;以及用于监控当前加密使用的状态变量、密钥生成工具等。
以上为加密连接与密码交换的基础组件。另一方面,Mysql提供了多层级的安全控制:服务层面ssl行为控制(server-client使用匹配的ssl行为,这其中的server可以是普通的用户-数据库中的数据库服务,也可以是主从复制中的主库,也可以是组复制中的dornor贡献者。相对的,client可以是用户端、从库、组复制中的加入者),用户层面针对单个用户的认证方式(通过认证插件)。
先看基础组件:
对于CA证书、server端证书、client端证书默认是由mysql在启动时在data目录下创建,并由mysql将文件名设置到对应的系统变量值上,也可以通过系统变量设置自定义的证书位置:
[root@mysql2 data]# ll|grep pem
-rw------- 1 mysql mysql 1680 Nov 2 09:11 ca-key.pem
-rw-r--r-- 1 mysql mysql 1112 Nov 2 09:11 ca.pem
-rw-r--r-- 1 mysql mysql 1112 Nov 2 09:11 client-cert.pem
-rw------- 1 mysql mysql 1680 Nov 2 09:11 client-key.pem
-rw------- 1 mysql mysql 1680 Nov 2 09:11 private_key.pem
-rw-r--r-- 1 mysql mysql 452 Nov 2 09:11 public_key.pem
-rw-r--r-- 1 mysql mysql 1112 Nov 2 09:11 server-cert.pem
-rw------- 1 mysql mysql 1680 Nov 2 09:11 server-key.pem
[root@mysql2 data]#
其中,ca.pem为CA证书,ca-key.pem为CA的私钥文件,client-cert.pem、client-key.pem分别为生成的客户端证书和私钥,server-cert.pem、server-key.pem分别为生成的服务端证书和私钥。public_key.pem、private_key.pem分别为用于密码交换的rsa公私钥。
pem证书文件内容可通过openssl x509 -text -in xxx.pem查看。例如:openssl x509 -text -in ca.pem
安全相关的变量分为server端变量和client端变量,server端变量控制server的行为(是否使用加密连接、证书路径、支持的TLS协议版本等),client端控制client端的行为。对于主从复制以及组复制场景,mysql服务器对于用户来说可视为server端,但是作为从库(复制目标库,对于主从复制和组复制场景),则被视为客户端。
加密连接相关的系统变量如下:
server端变量:
require_secure_transport:是否启用加密连接。取值为ON/OFF。默认OFF&#