当mysql跨越互联网进行复制时别人可以窃取到mysql的复制信息,这些信息是明文的,因此存在不安全性,这里通过ssl对复制的信息进行加密。当在客户没有固定ip而要访问服务器时,mysql要允许任意地址的访问,服务端和客户端通过证书验证可以防止暴力破解。
安装openssl****一般默认安装
开启mysql中ssl功能,登录Mysql查看,主从服务器都要执行此步骤
MariaDB [solo]> show variables like '%ssl%';
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| have_openssl | DISABLED |
| have_ssl | DISABLED |
| ssl_ca | |
| ssl_capath | |
| ssl_cert | |
| ssl_cipher | |
| ssl_key | |
+---------------+----------+
显示DISABLED 是未开启,开启了会显示YES
+---------------+-------------------------------+
| Variable_name | Value |
+---------------+-------------------------------+
| have_openssl | YES |
| have_ssl | YES |
编辑MYSQL配置文件
vim /etc/my.cnf
在在[mysqld]下加入 ssl
[mysqld]
ssl
保存后重新启动mysql,再次登录mysql
show variables like '%ssl%';
+---------------+-------------------------------+
| Variable_name | Value |
+---------------+-------------------------------+
| have_openssl | YES |
| have_ssl | YES |
开始步骤
1、创建证书中心
在主服务器上创建证书中心
cd /etc/pki/CA
生成私钥
(umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
生成自签证书,由于需要输入大量用户信息,因此编辑证书的配置文件,在私有的CA上创建证书要注意所有的用户信息要和CA中的一致,从国家到部门都要相同,否则会造成证书无法使用
vim /etc/pki/tls/openssh.cnf
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = CN
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = FJ
localityName = Locality Name (eg, city)
localityName_default = XZ
0.organizationName = Organization Name (eg, company)
0.organizationName_default = skl
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = skl
生成自签证书
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650
-x509是创建自签证书是需要的参数,在创建其他证书时不能加改参数
由于是自签证书因此要修改证书路径
vim /etc/pki/tls/openssl.cnf
[ CA_defalut ]
dir = /etc/pki/CA
certs = $dir/certs #存放生成证书的目录
crl_dir = $dir/crl #存放吊销证书的目录
database = $dir/index.txt #证书的索引文件
new_certs_dir = $dir/newcerts #新签的证书目录
serial = $dir/serial #序列号
crl = $dir/crl.pem
private_key = $dir/private/cakey.pem #证书中心私钥文件
创建证书编号
mkdir certs crl newcerts
touch index.txt
echo 00 > serial #指明证书的开始编号
2、为主服务器创建证书
服务器的名称必须固定,在申请证书时要输入服务器名称,证书和服务器名称对应
创建私钥
mkdir /ssl/ #目录可以自定义
cd /ssl/
(umask 077;openssl genrsa -out /ssl/master.key 2048)
生成证书申请
openssl req -new -key master.key -out master.csr
在证书服务器上对master的证书进行签发
openssl ca -in master.csr -out master.crt -days 365
然后把cacert.pem 文件复制到/ssl/目录下等下会用。
#目录可以自定义
3、为从服务器创建证书
(umask 077;openssl genrsa -out /ssl/slave.key 2048)
生成证书申请
openssl req -new -key slave.key -out slave.csr
在证书服务器上对master的证书进行签发
openssl ca -in slave.csr -out slave.crt -days 365
生成好了之后将cacert.pem,slave.crt,slave.key传至从服务器
/ssl/ 目录下 #目录自定义
4、修改证书权限和mysql配置文件
cd /ssl/
chown -R mysql:mysql master.crt master.key cacert.pem
chmod 600 master.crt master.key cacert.pem
vim /etc/my.cnf # [mysqld]下添加
log-bin=mysql-bin #启用二进制日志
server-id=11 # id号自定义
ssl
ssl-ca=/ssl/cacert.pem
ssl-cert=/ssl/master.crt
ssl-key=/ssl/master.key
修改从服务器配置
cd /ssl/
chown -R mysql:mysql slave.crt slave.key cacert.pem
chmod 600 slave.crt slave.key cacert.pem
vim /etc/my.cnf # [mysqld]下添加
log-bin=mysql-bin #启用二进制日志
server-id=12 # id号自定义
ssl
ssl-ca=/ssl/cacert.pem
ssl-cert=/ssl/slave.crt
ssl-key=/ssl/slave.key
5、在主服务器上授权从服务器
grant replication slave on *.* to user@192.168.00.00 identified by '密码' require ssl;
flush privileges; #刷新权限
查看主服务器当前二进制位置
MariaDB [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 873 | | |
+------------------+----------+--------------+------------------+
6、在从服务器上保存授权信息
登录MYSQL
stop slave; #先关闭slave
change master to
master_user='user',
master_password='密码',
master_host='192.168.00.00',
master_log_file='mysql-bin.000005',
master_log_pos=873,
master_ssl=1,
master_ssl_ca='/ssl/cacert.pem',
master_ssl_cert='/ssl/slave.crt',
master_ssl_key='/ssl/slave.key';
start slave; #开启slave
从服务器查看状态
show slave status \G;
MariaDB [(none)]> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.00.00
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 873
Relay_Log_File: mariadb-relay-bin.000002
Relay_Log_Pos: 816
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: Yes #已启用
Slave_SQL_Running: Yes #已启用
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 873
Relay_Log_Space: 1112
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: Yes #SSL配置成功
Master_SSL_CA_File: /ssl/cacert.pem
Master_SSL_CA_Path:
Master_SSL_Cert: /ssl/slave.crt
Master_SSL_Cipher:
Master_SSL_Key: /ssl/slave.key
7,测试主从是否同步
可以在主库 show slave hosts
查看有哪些从库节点。
参考文章https://www.jb51.net/article/76851.htm