背景

本来也是一时兴起打算抓包玩,但是没想到却在无意之间抓到了mariadb复制的明文报文。于是乎便到mysql官方文档看看有没有关于数据加密的信息,毕竟复制过程之接明文还是挺不安全的;在mysql的参考文档中还真找到了加密复制的实现,下面便开始具体的实现流程。

环境

CA 192.168.99.131
Master 192.168.99.135
Slave 192.168.99.150

CA:用来给master和slave节点签发证书
Maser:作为主节点数据库服务器
slave:作为从节点数据库服务器

整体框架图如下:
mariadb复制——加密复制

实验流程

CA直接生成给master和slave的证书

1.自签署CA

#找个目录生成
 cd /etc/my.cnf.d/ssl/

    openssl genrsa 2048 > cakey.pem
    openssl req -new -x509 -key cakey.pem -out cacert.pem -days 3650

2.生成master节点的私钥和请求文件

    openssl req -newkey rsa:2048 -days 365 -nodes -keyout master.key > master.csr
    openssl x509 -req  -in master.csr -CA cacert.pem -CAkey cakey.pem -set_serial 01 > master.crt  

3.生成slave节点的私钥和请求文件

   openssl req -newkey rsa:2048 -days 365 -nodes -keyout slave.key > slave.csr
    openssl x509 -req  -in slave.csr -CA cacert.pem -CAkey cakey.pem -set_serial 02 > slave.crt

4.将文件分别复制的对应的节点上

#master 
#cacert.pem master.crt master.key
 scp cacert.pem master.crt master.key 192.168.99.135:/etc/my.cnf.d/ssl/

#slave
#cacert.pem slave.crt slave.key

 scp cacert.pem slave.crt slave.key 192.168.99.150:/etc/my.cnf.d/ssl/

5.配置主节点

#编辑配置文件
vim /etc/my.cnf.d/server.cnf 
[mysqld]
#数据目录(看个人情况)
datadir=/data/mysql
#二进制日志文件路径及命名(个人情况)
log_bin=/data/binlog/mysql-bin
#库表独立文件(看个人爱好,一般推荐分开)
innodb_file_per_table
#指定编号
server_id=1
#开启ssl功能
ssl
# 证书配置信息
ssl-ca=/etc/my.cnf.d/ssl/cacert.pem
ssl-cert=/etc/my.cnf.d/ssl/master.crt
ssl-key=/etc/my.cnf.d/ssl/master.key

配置完成后启动数据库

    systemctl start mariadb

进入数据库,授权备份账号仅允许加密备份查看当前的二进制日志信息

mysql
MariaDB [(none)]> grant replication slave on *.* to slave@'192.168.99.150' identified by 'slave' require ssl;
MariaDB [(none)]>show master status;

mariadb复制——加密复制
6.配置从节点

# 编辑配置文件
vim /etc/my.cnf.d/server.cnf 

[mysqld]
datadir=/data/mysql
log_bin=/data/binlog/mysql-bin
innodb_file_per_table
# 下面是重点
# server-id唯一不能重复,其他配置与主类似
server_id=2
ssl
ssl-ca=/etc/my.cnf.d/ssl/cacert.pem
ssl-cert=/etc/my.cnf.d/ssl/slave.crt
ssl-key=/etc/my.cnf.d/ssl/slave.key

启动数据库

    systemctl start mariadb

进入数据库设置主库指向

mysql 
change master to \ 
master_host='192.168.99.135', 
master_user='slave', 
master_password='slave', 
master_log_file='mysql-bin.000003', 
master_log_pos=553, 
master_ssl=1;

7.启动备份,并查看备份状态

MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status;

mariadb复制——加密复制
8.检验是否实现加密

#在主数据库进行操作,同时进行抓包检测
MariaDB [(none)]> create database db1;
Query OK, 1 row affected (0.03 sec)

MariaDB [(none)]> create database db2;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> create database db3;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> create database db4;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> create database db5;
Query OK, 1 row affected (0.00 sec)

# 最终验证发现加密后确实不再有明文的复制过程的传送,实现了数据的加密。