MySQL 主從複製加密以及binlog的加密實現

1 概述

本文主要講述瞭如何在主從複製的過程當中使用SSL進行加密,還有binlog加密(MySQL 8.0.14+)的實現。html

2 環境

  • MySQL 8.0.25
  • Docker
  • 一主一從

3 準備容器

先拉取鏡像並啓動,主庫3306,從庫3307,還須要加上--ssl參數,以開啓SSL加密鏈接的功能:mysql

docker pull mysql
docker run -itd -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql-master mysql --ssl
docker run -itd -p 3307:3306 -p 33061:33060 -e MYSQL_ROOT_PASSWORD=123456 --name mysql-slave mysql --ssl

啓動容器以後進入容器並安裝vimnet-toolssql

apt install vim net-tools

同時進入MySQL準備好數據源:docker

create database test;
use test;
create table user(
    id int primary key auto_increment,
    name varchar(30) not null,
    age int not null
);

4 SSL鏈接準備

4.1 確保SSL開啓

首先能夠進入MySQL確保SSL功能開啓:vim

show variables like '%ssl%';

在這裏插入圖片描述

4.2 生成CA和私鑰

默認狀況下,在/var/lib/mysql下已經有生成的證書和私鑰文件,若是不想用默認的,能夠從新生成:bash

sudo mkdir /mysql
sudo chown mysql:mysql /mysql
mysql_ssl_rsa_setup --datadir=/mysql

在這裏插入圖片描述

生成的文件包括:服務器

  • ca-key.pemCA私鑰
  • ca.pem:自簽名的CA證書
  • client-key.pem:客戶端鏈接時使用的私鑰
  • client-cert.pem:客戶端鏈接時使用的證書
  • server-key.pem:服務器端私鑰
  • server-cert.pem:服務器端證書
  • public_key.pem/private_key.pem:密鑰對的公鑰和私鑰

實際使用只須要用到ca.pem、服務端私鑰證書、客戶端私鑰證書這五個文件。因爲主從複製的時候,主庫做爲服務端,從庫做爲客戶端,所以ca.pem/server-key.pem/server-client.pem只須要在主庫中配置,而ca.pem/client-key.pem/client-cert.pem須要經過scp傳到從庫中。ide

4.3 修改權限

權限錯誤會致使MySQL沒法正常使用SSL的功能:測試

sudo chown mysql:mysql /mysql/*.pem
sudo chmod 400 /mysql/*.pem
sudo chmod 444 /mysql/ca.pem

4.4 修改配置文件

修改主庫的配置文件,以下所示:ui

[mysqld]
ssl_ca=/mysql/ca.pem
ssl_cert=/mysql/server-cert.pem
ssl_key=/mysql/server-key.pem

而從庫配置文件 修改以下:

[client]
ssl-ca=/mysql/ca.pem
ssl-cert=/mysql/client-cert.pem
ssl-key=/mysql/client-key.pem

此時從庫是沒辦法鏈接本身的,只能鏈接主庫,若是須要鏈接本身,須要將主庫的server-key.pem/server-cert.pem拷貝到從庫中,並配置從庫的[mysqld]

[mysqld]
ssl_ca=/mysql/ca.pem
ssl_cert=/mysql/server-cert.pem
ssl_key=/mysql/server-key.pem

5 主從複製的其餘配置

下面是一些主從複製的最常規最簡單的配置,主庫僅配置了id和須要複製的庫:

[mysqld]
server-id=1                
binlog-do-db=test

從庫的配置以下:

[mysqld]
server-id=2            
replicate-do-db=test

修改完後重啓主庫和從庫。

6 建立主從複製的用戶

在主庫中建立主從複製的用戶(具體ip請使用ifconfig查看):

create user 'repl'@'172.17.0.3' identified with mysql_native_password by '123456' require ssl;
grant replication slave on *.* to 'repl'@'172.17.0.3';

7 修改從庫配置指向主庫

首先查看主庫的狀態:

show master status;

在這裏插入圖片描述

FilePosition記錄下來,並在從庫中使用change master to/change replication source to8.0.23+)設置主庫信息:

change master to
master_host = '172.17.0.2',
master_user = 'repl',
master_password = '123456',
master_log_file = 'binlog.000005',
master_log_pos = 156,
master_ssl = 1;

change replication source to
source_host = '172.17.0.2',
source_user = 'repl',
source_password = '123456',
source_log_file = 'binlog.000005',
source_log_pos = 156;  
source_ssl = 1;

8 啓動從庫並測試

能夠使用start slave/start replica8.0.22+)啓動從庫開啓複製功能:

start slave
# 或
start replica

啓動完成後使用

show slave stauts\G

查看從庫狀態:

在這裏插入圖片描述

須要顯示兩個Yes纔算成功,若是Slave_IO_Running一直顯示Connecting,可能緣由是:

  • 在從庫中配置的主庫地址、端口、用戶名、密碼等錯誤
  • SSL配置錯誤,好比使用了錯誤的client-key.pem
  • 防火牆問題

請查看日誌自行檢查,日誌位置可經過

show variables like 'log_error'

查看。

沒有問題後,嘗試在主庫中插入數據:

use test;
insert into user values('111',1);

在從庫中就能夠查詢到了:

use test;
select * from user;

在這裏插入圖片描述

9 binlog的加密

8.0.14開始,MySQL提供了對binlog的加密功能,默認狀況下,binlog是沒有加密的,加密須要使用keyring插件或者組件:

在這裏插入圖片描述

實現步驟以下:

  • 安裝keyring_file插件
  • 修改配置
  • 測試

9.1 安裝插件

MySQL提供瞭如下插件的安裝:

在這裏插入圖片描述

因爲使用的是社區版,社區版只支持keyring_file插件,以此爲例。

主庫和從庫修改配置文件以下:

[mysqld]
early-plugin-load=keyring_file.so
keyring_file_data=/mysql/keyring

重啓後,進入MySQL查看:

select plugin_name,plugin_status from information_schema.plugins where plugin_name like 'keyring%';

在這裏插入圖片描述

須要處於ACTIVE狀態,這樣就是成功了。

9.2 修改配置

binlog的加密經過一個系統變量binlog_encryption控制,須要手動開啓:

set global binlog_encryption=ON;
set persist binlog_encryption=ON;

開啓後查看日誌:

show binary logs;

能夠看到是加密了的binlog

在這裏插入圖片描述

而以前沒有加密的binlog能夠手動遷移數據後進行刪除。

加密完binlog後並不須要修改主從複製的配置,主從複製依然生效,以下圖所示:

在這裏插入圖片描述

主庫插入了一個用戶從庫依然能select到。

10 參考連接

相關文章
相關標籤/搜索